Carlos Gómez
Carlos Gómez

Reputation: 460

Nested resources Rails no route matches id = nil

I'm dealing with nested routes and I felt something is missing, I get this error:

No route matches {:action=>"edit", :controller=>"consultations", :id=>nil, :patient_id=>#<Patient id: 2 ...

Routes:

resources :patients, shallow: true do
    resources :consultations
end

rake routes | grep consultation

patient_consultations GET /patients/:patient_id/consultations(.:format) consultations#index
POST /patients/:patient_id/consultations(.:format) consultations#create
new_patient_consultation GET /patients/:patient_id/consultations/new(.:format) consultations#new
edit_consultation GET /consultations/:id/edit(.:format) consultations#edit
consultation GET /consultations/:id(.:format) consultations#show
PATCH  /consultations/:id(.:format)  consultations#update
PUT    /consultations/:id(.:format)  consultations#update
DELETE /consultations/:id(.:format)  consultations#destroy

Models:

class Patient < ActiveRecord::Base
  belongs_to :medic, :foreign_key => :medic_id
  has_many :consultations, :dependent => :destroy
  accepts_nested_attributes_for :consultations
end

class Consultation < ActiveRecord::Base
  belongs_to :patient, :foreign_key => :patient_id
end

View: consultations/index.html.erb

<% @patient.consultations.each do |consultation| %>
  <%= link_to 'Edit', edit_consultation_path(patient_id: @patient, id: @consultation) %> <---ERROR
  <%= link_to 'Show', consultation(patient_id: @patient, id: @consultation) %> <---ERROR
  <%= link_to 'Destroy', consultation, method: :delete, data: { confirm: 'Are you sure?' } %> <---ERROR
<% end %>

Am I passing wrong parameters to edit_consultation_path(patient_id: @patient, id: @consultation) ?

Any ideas? thanks in advance!

edit:

Controller: controller/consultations_controller.rb

def index
  @patient.consultations = Consultation.all
end

Upvotes: 0

Views: 485

Answers (1)

x6iae
x6iae

Reputation: 4164

Are you sure you have something like @consultation?

You are looping through all the students consultation, and taking each instance as a consultation.

However, you are passing @consultation as the id, which is not the same as consultation. @consultation is basically nil.

What you should pass is consultation, not @consultation, as follow:

<% @patient.consultations.each do |consultation| %>
  <%= link_to 'Edit', edit_consultation_path(patient_id: @patient, id: consultation) %> <---ERROR
  <%= link_to 'Show', consultation_path(patient_id: @patient, id: consultation) %> <---ERROR
  <%= link_to 'Destroy', consultation_path(id: consultation.id), method: :delete, data: { confirm: 'Are you sure?' } %> <---ERROR
<% end %>

or, even the consultation's id directly, as follow:

<% @patient.consultations.each do |consultation| %>
  <%= link_to 'Edit', edit_consultation_path(patient_id: @patient, id: consultation.id) %> <---ERROR
  <%= link_to 'Show', consultation_path(patient_id: @patient, id: consultation.id) %> <---ERROR
  <%= link_to 'Destroy', consultation_path(id: consultation.id), method: :delete, data: { confirm: 'Are you sure?' } %> <---ERROR
<% end %>

Upvotes: 1

Related Questions