【问题标题】:Nesting Routes | Rails4嵌套路由 | Rails4
【发布时间】:2014-02-26 21:53:11
【问题描述】:

例如:

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]

【问题讨论】:

  • 你实际上链接到the answer。如果您遇到特定问题,请务必在问题中详细说明您正在尝试、期望和实际遇到的问题。

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


【解决方案1】:

它在您发布的链接中可用。搜索此标题:2.7 Nested Resources 并了解更多信息。无论如何,这是答案。

resources :users do
  resources :messages,only: [:show]
end

还记得不要嵌套太深。多于 1 层的嵌套并不好。


在问题的新更新之后。试试这个:

new_user_message_path(current_user.id)

如果您使用 devise 或将 current_user 定义为当前用户的东西,或者如果您有一些其他对象(如 @user)具有所需的用户信息,这将起作用。然后使用类似

new_user_message_path(@user.id)

基本上问题是您没有提及用户 ID。

【讨论】:

【解决方案2】:

您的错误是由于未向 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

【讨论】:

    猜你喜欢
    • 2020-07-18
    • 2011-10-10
    • 2018-05-29
    • 2017-10-31
    • 2019-03-13
    • 2015-05-22
    • 2013-01-16
    • 2019-10-18
    • 2020-09-04
    相关资源
    最近更新 更多