没有路由匹配缺少必需的密钥:[:id]

时间:2014-02-11 17:03:43

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

我是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]

4 个答案:

答案 0 :(得分:58)

您需要包含用户,因为它是一个嵌套路由。如下所示:

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

答案 1 :(得分:8)

问题在于您使用的是嵌套资源:

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。这是主要原因!

答案 2 :(得分:4)

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

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

答案 3 :(得分:4)

您在以下路径中错过了user_id

edit_user_item_path(user_id, item)

格式,您可以找到刚刚运行bundle exec rake routes | grep edit_user_item