E.g:
User: localhost:3000/users/1
Message: localsthost:3000/messages/1
每个Message
都有一个user_id
,所以我试图像这样嵌套Messages
:
来自用户1的消息1:
localhost:3000/users/1/messages/1
我怎么能窝这个?我读过Rails Routing,但无法完全理解。
我嵌套资源:
路线:
devise_for :users, :path => '',
:path_names => { :sign_in => 'login', :sign_out => 'logout', :sign_up => 'register' }
# User Profiles
get 'u/:id' => 'users#show', as: :user
# Gits
resources :users do
resources :messages
end
现在路线看起来像这样:
new_user_message GET /users/:user_id/messages/new(.:format) messages#new
edit_user_messaget GET /users/:user_id/messages/:id/edit(.:format) messages#edit
user_message GET /users/:user_id/messages/:id(.:format) messages#show
更新了我的新消息链接:
<%= link_to "New Message", new_user_message_path%>
但是我得到了错误:
No route matches {:controller=>"messages", :action=>"new", :id=>"1"} missing required keys: [:user_id]
答案 0 :(得分:1)
您可以在发布的链接中找到它。搜索此标题:2.7 Nested Resources
并了解更多信息。无论如何这里是答案。
resources :users do
resources :messages,only: [:show]
end
还要记住不要把它嵌得太深。超过1级的嵌套并不是很好。
新问题更新后。试试这个:
new_user_message_path(current_user.id)
如果您正在使用设计或将current_user定义为当前用户的某个内容,或者您有一些其他对象(如@user
具有所需的用户信息),则此功能将起作用。然后使用像
new_user_message_path(@user.id)
基本上问题是你没有提到用户ID。
答案 1 :(得分:0)
您的错误是由于未向new_user_message_path
提供预期参数引起的:
<%= link_to 'Create User', new_user_message_path(@user) %>
在用户下创建新邮件的正确途径是/users/:user_id/messages/new
。为了让Rails构造它,你需要告诉它:user_id
应该是什么。 ActiveRecord对象知道如何序列化为路由友好键,因此您只需传入User
的实例,而不是明确指定user.id
。