Rails 3.2.x has_many, через (3 модели) вызывает nil id перед созданием

Вот с чем я имею дело, но сначала немного о том, что нужно сделать. Есть 3 модели: Пациенты - Назначения - Процедуры

В этих 3 моделях есть два вида процедур - пациенты

Из этих двух представлений я хотел бы запланировать встречи через представление пациентов (показать). Что, по сути, создаст новое назначение для пациента, в частности (в частности, для пациента.)

Вот код для моделей

class Patient < ActiveRecord::Base
  attr_accessible :address1, :address2, :city, :comment, :email, :first_name, :init_date, :init_time, :last_name, :mobile, :notes, :phone, :state, :zip

  has_many :appointments, dependent: :destroy
  has_many :procedures, through: :appointments
class Procedure < ActiveRecord::Base
  attr_accessible :comment, :occurence, :procedure, :procedure_code, :procedure_price, :procedure_time, :visits
  has_many :appointments
  has_many :patients, through: :appointments
class Appointment < ActiveRecord::Base
  attr_accessible :appointment_date, :appointment_notes, :appointment_time, :procedure_id
  belongs_to :patient
  belongs_to :procedure

Здесь находится контроллер для встреч, а также route.rb включение встреч (но только эта строка)

resources :appointments, only: [:create, :destroy, :edit, :update]
class AppointmentsController < ApplicationController
include PatientsHelper
before_filter :signed_in_user

def create
    @current_patient = @patient.id
    @appointment = @current_patient.appointments.build(params[:appointment])
    if @appointment.save
        flash[:success] = "Appointment scheduled!"
        redirect_to patient_path(@current_patient)
    else
        render 'create'
    end
end
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

Так что это настройка, я получаю следующую ошибку rspec в Patient_controller. Протестируйте @appointment = @current_patient.appointments.build(params[: назначение]) в консоли, предварительно определив идентификатор для @current_patient = Patient.first. Это работает, и сборка происходит как надо. Ошибка:

Неудачи:

1) Appointment Pages appointment creation with invalid information should not create an appointment
 Failure/Error: expect { click_button "Schedule procedure" }.not_to change(Appointment,
 RuntimeError:
   Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id
 # ./app/controllers/appointments_controller.rb:6:in `create'
 # (eval):2:in `click_button'
 # ./spec/requests/appointment_pages_spec.rb:17:in `block (5 levels) in <top (required)>'
 # ./spec/requests/appointment_pages_spec.rb:17:in `block (4 levels) in <top (required)>'

2) Appointment Pages appointment creation with invalid information error messages 
 Failure/Error: before { click_button "Schedule procedure" }
 RuntimeError:
   Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id
 # ./app/controllers/appointments_controller.rb:6:in `create'
 # (eval):2:in `click_button'
 # ./spec/requests/appointment_pages_spec.rb:22:in `block (5 levels) in <top (required)>'

3) Appointment Pages appointment creation with valid information should create a micropost
 Failure/Error: expect { click_button "Schedule procedure" }.to change(Appointment,
 RuntimeError:
   Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id
 # ./app/controllers/appointments_controller.rb:6:in `create'
 # (eval):2:in `click_button'
 # ./spec/requests/appointment_pages_spec.rb:36:in `block (5 levels) in <top (required)>'
 # ./spec/requests/appointment_pages_spec.rb:36:in `block (4 levels) in <top (required)>'

Может показаться, что я не правильно определяю @current_patient = @ Patient.id... или, скорее, текущий пациент, о котором идет речь, не переносит / не переходит к форме встреч Где мне нужно определить текущего пациента для переноса этого идентификатора в метод создания формы @current_patient.appointments.build?

1 ответ

Решение

Не совсем то, что я искал, но сделал этот обходной путь.

Используя следующее удалось получить это, чтобы сохранить соответственно. Все еще не могу выяснить, почему я не могу вытащить пациента из URL -адреса - например, app.dev/patients/2 - где информация о пациенте получает идентификатор 2... но теперь я могу сохранить встречу, используя то, что Я подозреваю, что это довольно грубый метод.

  1. В форму я добавил скрытое поле, которое вытягивает соответствующий Patient_id
  2. В контроллере встреч, добавлен в attr_accessible: Patient_id
  3. В назначениях_контроллер

    def create
    @appointment = Appointment.new(params[:appointment])
    @current_patient = @appointment.patient_id
    if @appointment.save
        flash[:success] = "Appointment scheduled!"
        redirect_to patient_path(@current_patient)
    else
        render 'patients/show'
    end
    end
    

render 'patients/show' остается сломанным, но оставит это для другой нити. Спасибо всем за вашу помощь и руководство. Опять же, я подозреваю, что вызов рендеринга связан с той же проблемой, которая в настоящее время мешает моему доступу к current_patient напрямую из модели assignments_controller.

Другие вопросы по тегам