不能通过link_to(rails)传递param

时间:2011-10-29 23:55:41

标签: ruby-on-rails ruby controller ruby-on-rails-3.1

我有传递参数的问题。在展示视图中我有

  

= link_to“发送消息”,{:controller => “users”,:action =>   “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

和我的show方法

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

但点击链接后我有错误

  

找不到没有ID的用户

在该行中,在send_message方法

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

我做错了什么?我读了很多关于这个的例子,但它不起作用(

提前致谢!!!

3 个答案:

答案 0 :(得分: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参数。如果不是,那将有助于更多地了解您的路线。

答案 1 :(得分:1)

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

并在您的路线中:

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

答案 2 :(得分: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方法也可以使用一些工作:您应该在has_many :posts模型中定义User