【问题标题】:No route matches missing required keys: [:id]没有路由匹配缺少必需的键:[:id]
【发布时间】:2014-03-09 14:48:33
【问题描述】:

我是 Rails 的新手,我似乎也遇到过类似的问题,但我无法解决我的问题。

我的路线:

resources :users do
    resources :items
end

我的模型:

class Item < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
   has_many :items
end

HTML:

<% @items.each do |item| %>
<tr>
  <td><%= item.id %></td>
  <td><%= item.code %></td>
  <td><%= item.name %></td>
  <td><%= item.quantity %></td>
  <td><%= link_to "Edit", edit_user_item_path(item) %></td>  <---- error

我遇到了同样的错误:

No route matches {:action=>"edit", :controller=>"items", 
:user_id=>#<Item id: 1, user_id: 1, code: "123", name: "test", 
quantity: 12, , created_at: "2014-02-11 15:45:30", updated_at:
"2014-02-11 15:45:30">, :id=>nil, :format=>nil} missing required keys: [:id]

【问题讨论】:

    标签: html ruby-on-rails ruby path routes


    【解决方案1】:

    您还需要包含用户,因为它是一个嵌套路由。所以像:

    <td><%= link_to "Edit", edit_user_item_path(@user, item) %></td>
    

    【讨论】:

    • 不应该是:edit_user_item_path(item.user, item)?
    • 您可以这样做,但您通常使用嵌套路由,因为您希望分配 @user 变量以在视图中使用。如果您不使用@user,那么您可能不需要嵌套路由。
    • 是的,这很有道理。
    • 你能告诉我我使用 form_for 的情况吗?我应该放什么?
    • &lt;%= form_for([@user, @item]) do |f| %&gt; ... &lt;% end %&gt; 文档在这里:api.rubyonrails.org/classes/ActionView/Helpers/…
    【解决方案2】:

    问题是你使用的是嵌套资源:

    resources :users do
       resources :items
    end
    

    所以当你有一个链接时:

    <%= link_to "Edit", edit_user_item_path(item) %> 
    

    它将缺少一个user_id,因此使用rake routes 可以轻松检查问题。它会列出这样的路线:

    edit_user_item GET    /users/:user_id/items/:id/edit(.:format) items#edit
    

    您可以看到上面的路线并使用链接检查它,您会发现它没有user_id。这是主要原因!

    【讨论】:

    • 这帮助我将所有信息“点击”在一起,非常感谢。
    【解决方案3】:

    传递的是对象item,而不是所需的ID。

    <td><%= link_to "Edit", edit_user_item_path(item.id) %></td>
    

    【讨论】:

      【解决方案4】:

      您在以下路径中错过了user_id

      edit_user_item_path(user_id, item)
      

      你能找到的格式只是运行bundle exec rake routes | grep edit_user_item

      【讨论】:

      • 我从未考虑将bundle exec rake routes 的输出通过管道传输到 grep。太棒了。
      猜你喜欢
      • 2017-07-22
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多