2011-10-29 41 views
0

我有传递参数的问题。在放映视图我有无法通过link_to传递参数(导轨)

=的link_to “发送消息”,{:控制器=> “用户”,:动作=> “send_message”:USER_ID => @ user.id}

和我users_controller有方法

def send_message 
    @user = User.find(params[:user_id]) 
    @message=Message.new 
    redirect_to send_message_path 
end 

和我的表演方法

def show 
    @user = User.find(params[:id]) 
    @post=Post.new 
    @[email protected](:page => params[:page],:per_page => 10) 
    end 

但我有在该行点击链接

没有ID找不到用户

,在send_message方法

@user = User.find(params[:user_id]) 

我在做什么错后错误?我读到这个有很多的例子,但它不工作(

在此先感谢!

+0

显示你的路由 – fl00r

回答

1
=link_to "Send message", [:send_message, @user] 

,并在你的路由:

resources :users do 
    post :send_message, :on => :collection 
end 
1

会发生什么,如果你试图改变:USER_ID到:ID,这样

=link_to "Send message", {:controller => "users", :action => "send_message", :id => @user.id} 

def send_message 
    @user = User.find(params[:id]) 
    @message=Message.new 
    redirect_to send_message_path 
end 

如果的作品,那是因为你的路线没有设置为使用:USER_ID PARAM如果没有这将有助于更多地了解你的路线

+0

我有同样的错误使用时:ID
我的路线是匹配“/ send_message”:以=>“用户#send_message” – Pavel

+0

唉唉它工作时,我改变了我的路线匹配“/用户/: id/send_message',:to =>'users#send_message',:as =>'send_message'。感谢您试图帮助我! – Pavel

+1

如果你希望它的工作方式与你已有的方式类似,你应该能够改变你的路线来匹配'users /:id/send_message',:to =>'users#send_message''。如果你想改变一个更优雅的解决方案,请参阅fl00r的示例。 – nheinrich

0

在你的路线,你应该写:

resources :users do 
    post :send_message, :on => :member 
end 

而且在你看来,你写:

= link_to "Send Message", send_message_user_path(@user) 

这将使用id代替user_id。 所以在你的控制器中,你也需要使用params[:id]

Imho这比@ fl00r解决方案更清洁,因为它是成员方法,而不是集合。

但我有点困惑,为什么你会在控制器里面有那种方法。 因为它唯一做的事情就是重定向到send_message_path。您设置的实例变量全部丢失。因此,在代替你的看法写:

= link_to 'Send message', send_message_path(:user_id => @user.id) 

这会把你送到正确的控制器直道(在那里你将不得不检索用户)。

另外您的show方法可以使用一些工作:您应该在User模型中定义一个has_many :posts