我有传递参数的问题。在展示视图中我有
= 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])
我做错了什么?我读了很多关于这个的例子,但它不起作用(
提前致谢!!!
答案 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
。