Note that there are some explanatory texts on larger screens.

plurals
  1. PORails 3 undefined method nil:NilClass has_many :through when attempting create
    text
    copied!<p>I am encountering a problem when trying to .build a new appointment. But first a look at my Model(s)</p> <pre class="lang-rb prettyprint-override"><code>class Patient &lt; ActiveRecord::Base attr_accessible :address1, :address2, :city, :comment, :email, :first_name, :init_date, :init_time, :last_name, :mobile, :notes, :phone, :state, :zip before_validation :upcase_patient before_save { self.email.downcase! } has_many :appointments, dependent: :destroy has_many :procedures, through: :appointments </code></pre> <pre class="lang-rb prettyprint-override"><code>class Procedure &lt; ActiveRecord::Base attr_accessible :comment, :occurence, :procedure, :procedure_code, :procedure_price, :procedure_time, :visits before_validation :uppercase_procedure has_many :appointments has_many :patients, through: :appointments </code></pre> <pre class="lang-rb prettyprint-override"><code>class Appointment &lt; ActiveRecord::Base attr_accessible :appointment_date, :appointment_notes, :appointment_time, :procedure_id belongs_to :patient belongs_to :procedure </code></pre> <pre class="lang-rb prettyprint-override"><code>class AppointmentsController &lt; ApplicationController include PatientsHelper before_filter :signed_in_user def create @patient = current_patient @appointment = @patient.appointments.build(params[:appointment]) if @appointment.save flash[:success] = "Appointment scheduled!" redirect_to patient_path(@patient) else render patient_path(@patient) end end </code></pre> <pre class="lang-rb prettyprint-override"><code>module PatientsHelper def current_patient=(patient) @current_patient = patient end def current_patient @current_patient end def current_patient?(patient) patient == current_patient end end </code></pre> <p>These items including "PatientsHelper" which helps define current_patient make up the associations. I have created the form successfullly within the patients_controller</p> <pre class="lang-rb prettyprint-override"><code>class PatientsController &lt; ApplicationController before_filter :signed_in_user before_filter :admin_user, only: [:destroy] def show @patient = Patient.find(params[:id]) @procedures = Procedure.all @appointments = @patient.appointments.paginate(page: params[:page]) @appointment = @patient.appointments.build end </code></pre> <p>I would like to use the patients resources to create new appointments. Here is where I am fouled up. I continue to receive via rspec the following error:</p> <pre><code>NoMethodError: undefined method `appointments' for nil:NilClass </code></pre> <p>Where am I going wrong? Any help would be greatly appreciated. If clarification is required, I would like to:</p> <p>a_ associate </p> <p>Patient model -> has_many [:appointments, :procedures (through :appointments)]</p> <p>Procedure model -> has_many [:appointments, :patients (through :appointments)] </p> <p>Appointment model -> belongs_to [:patients, :procedures]</p> <p>b_ create new :appointments through the patients controller rather than create a new controller specifically for appointments model</p> <p>my mistake! here is the spec test.</p> <pre class="lang-rb prettyprint-override"><code>require 'spec_helper' describe "Appointment Pages" do subject { page } let(:user) { FactoryGirl.create(:user) } let(:patient) { FactoryGirl.create(:patient) } let(:procedure) { FactoryGirl.create(:procedure) } before { sign_in user } describe "appointment creation" do before { visit patient_path(patient) } describe "with invalid information" do it "should not create an appointment" do expect { click_button "Schedule procedure" }.not_to change(Appointment, :count) end describe "error messages" do before { click_button "Schedule procedure" } it { should have_content('error') } end end describe "with valid information" do before do procedure_id = procedure.id patient_id = patient.id fill_in 'appointment_appointment_date', with: "2013-04-04" fill_in 'appointment_appointment_time', with: "12:45:00" fill_in 'appointment_appointment_notes', with: "Test the notes" end it "should create a micropost" do expect { click_button "Schedule procedure" }.to change(Appointment, :count).by(1) end end end end </code></pre> <p>errors show up on the following </p> <pre><code>Failures: 1) Appointment Pages appointment creation with invalid information should not create an appointment Failure/Error: expect { click_button "Schedule procedure" }.not_to change(Appointment, NoMethodError: undefined method `appointments' for nil:NilClass # ./app/controllers/appointments_controller.rb:7:in `create' # (eval):2:in `click_button' # ./spec/requests/appointment_pages_spec.rb:17:in `block (5 levels) in &lt;top (required)&gt;' # ./spec/requests/appointment_pages_spec.rb:17:in `block (4 levels) in &lt;top (required)&gt;' 2) Appointment Pages appointment creation with invalid information error messages Failure/Error: before { click_button "Schedule procedure" } NoMethodError: undefined method `appointments' for nil:NilClass # ./app/controllers/appointments_controller.rb:7:in `create' # (eval):2:in `click_button' # ./spec/requests/appointment_pages_spec.rb:22:in `block (5 levels) in &lt;top (required)&gt;' 3) Appointment Pages appointment creation with valid information should create a micropost Failure/Error: expect { click_button "Schedule procedure" }.to change(Appointment, NoMethodError: undefined method `appointments' for nil:NilClass # ./app/controllers/appointments_controller.rb:7:in `create' # (eval):2:in `click_button' # ./spec/requests/appointment_pages_spec.rb:36:in `block (5 levels) in &lt;top (required)&gt;' # ./spec/requests/appointment_pages_spec.rb:36:in `block (4 levels) in &lt;top (required)&gt;' Finished in 1.08 seconds 23 examples, 3 failures Failed examples: rspec ./spec/requests/appointment_pages_spec.rb:16 # Appointment Pages appointment creation with invalid information should not create an appointment rspec ./spec/requests/appointment_pages_spec.rb:23 # Appointment Pages appointment creation with invalid information error messages rspec ./spec/requests/appointment_pages_spec.rb:35 # Appointment Pages appointment creation with valid information should create a micropost </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload