嵌套路线| Rails4

时间:2014-02-26 21:53:12

标签: ruby-on-rails ruby-on-rails-4 routes nested

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]

2 个答案:

答案 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