Ruby on rails 无法通过连接将参数传递到(轨道)

Ruby on rails 无法通过连接将参数传递到(轨道),ruby-on-rails,ruby,controller,ruby-on-rails-3.1,Ruby On Rails,Ruby,Controller,Ruby On Rails 3.1,我在传递参数时遇到问题。在我看来 =链接到“发送消息”{:控制器=>“用户”,:操作=> “发送消息”,:user\u id=>@user.id} 我的用户和控制器都有方法 def send_message @user = User.find(params[:user_id]) @message=Message.new redirect_to send_message_path end 还有我的表演方法 def show @user = User.find(pa

我在传递参数时遇到问题。在我看来

=链接到“发送消息”{:控制器=>“用户”,:操作=> “发送消息”,:user\u id=>@user.id}

我的用户和控制器都有方法

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
    @posts=@user.posts.reverse.paginate(:page => params[:page],:per_page => 10)  
  end
但我在点击链接后出现了错误

找不到没有ID的用户

在该行中,在send_message方法中

 @user = User.find(params[:user_id])
我做错了什么?我读了很多关于这方面的例子,但它不起作用(


提前感谢!!!

如果您尝试将:user\u 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参数。如果没有设置,那么了解更多有关路由的信息会有所帮助

=link_to "Send message", [:send_message, @user]
在你的路线上:

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

在你的路线中,你应该写:

resources :users do
  post :send_message, :on => :member
end
在你看来,你写道:

= link_to "Send Message", send_message_user_path(@user)
这将使用
id
而不是
user\u id
。 因此,在控制器中还需要使用
params[:id]

Imho这比@fl00r解决方案更干净,因为它是一个成员方法,而不是集合

但我有点困惑,为什么在控制器中会有这种方法。 因为它所做的唯一事情就是重定向到
send\u message\u路径
。您设置的实例变量都将丢失。因此,请在视图中编写以下内容:

= link_to 'Send message', send_message_path(:user_id => @user.id)
这将直接将您发送到正确的控制器(您必须在那里检索用户)


另外,你的
show
方法可能需要一些工作:你应该在你的
User
模型中定义一个
has\u许多:posts

我在使用时也有同样的错误:id
我的路由是match'/send\u message',:to=>“users#send\u message”啊,当我将路由更改为match'/users/:id/send\u message',:to=>“users#send\u message',:as=>'send_message'。感谢您尝试帮助我!如果您希望它以类似于您已有的方式工作,您应该能够将您的路由更改为
匹配“users/:id/send_message',:to=>'users#send_message'
。如果您想将事情更改为更优雅的解决方案,请参阅fl00r的示例。