No route matches missing required keys: [:id]
70,486
Solution 1
You need to include the user as well since its a nested route. So something like:
<td><%= link_to "Edit", edit_user_item_path(@user, item) %></td>
Solution 2
The problem is that you are using nested resources:
resources :users do
resources :items
end
So when you have a link:
<%= link_to "Edit", edit_user_item_path(item) %>
It will lack one user_id
so the easy to check the issue is using rake routes
. And it will list the routes like this:
edit_user_item GET /users/:user_id/items/:id/edit(.:format) items#edit
You can see the routes above and check it with the link, you will see it does not have user_id
. That's the main reason!
Solution 3
The object item
is being passed instead of the required id.
<td><%= link_to "Edit", edit_user_item_path(item.id) %></td>
Solution 4
You've missed user_id
in the following path:
edit_user_item_path(user_id, item)
format you are able to find just running bundle exec rake routes | grep edit_user_item
Related videos on Youtube
Comments
-
letz about 4 years
I'm new at Rails and I've seem similar problems, but I can't solve mine.
My routes:
resources :users do resources :items end
My models:
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
And I'm getting the same 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]
-
Hesham about 10 yearsshouldn't this be: edit_user_item_path(item.user, item)?
-
Mitziu Echeverria about 10 yearsYou could do that, but you usually use nested routes because you want to assign the
@user
variable to be used in the view. If you're not using@user
then you might not need a nested route. -
Hesham about 10 yearsYep, that makes sense.
-
letz about 10 yearsCan you tell me for the case that i use form_for ? what should i put?
-
Mitziu Echeverria about 10 years
<%= form_for([@user, @item]) do |f| %> ... <% end %>
Docs are here: api.rubyonrails.org/classes/ActionView/Helpers/… -
0112 over 9 yearsIn a similar instance of this for me in rails 4, I had to say
edit_parent_child_path(params[:parent_id], child)
In case that helps anyone else. -
camdixon over 9 years@jklina thank you so much, this thread and answer solved my problem.
-
Lotix over 8 yearsThis helped me "click" all pieces of information together, thanks a lot.
-
Tass almost 8 yearsI had NEVER consider piping the output of
bundle exec rake routes
to grep. Brilliant.