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

Share:
70,486

Related videos on Youtube

letz
Author by

letz

Mostly Ruby and Android

Updated on April 02, 2020

Comments

  • letz
    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
    Hesham about 10 years
    shouldn't this be: edit_user_item_path(item.user, item)?
  • Mitziu Echeverria
    Mitziu Echeverria about 10 years
    You 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
    Hesham about 10 years
    Yep, that makes sense.
  • letz
    letz about 10 years
    Can you tell me for the case that i use form_for ? what should i put?
  • Mitziu Echeverria
    Mitziu Echeverria about 10 years
    <%= form_for([@user, @item]) do |f| %> ... <% end %> Docs are here: api.rubyonrails.org/classes/ActionView/Helpers/…
  • 0112
    0112 over 9 years
    In 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
    camdixon over 9 years
    @jklina thank you so much, this thread and answer solved my problem.
  • Lotix
    Lotix over 8 years
    This helped me "click" all pieces of information together, thanks a lot.
  • Tass
    Tass almost 8 years
    I had NEVER consider piping the output of bundle exec rake routes to grep. Brilliant.