0

私は次のコード文字列を試しています:

class AppointmentsController < ApplicationController

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

これは現在3つのコントローラーを通過しています。そのうちの2つは重要なようです。

class Appointment < ActiveRecord::Base
  attr_accessible :appointment_date, :appointment_notes, :appointment_time, :procedure_id, :patient_id
  belongs_to :patient
  belongs_to :procedure

  validates :procedure_id, presence: true
  validates :patient_id, presence: true
  validates :appointment_date, presence: true
  validates :appointment_time, presence: true
class Patient < 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

私のcreateメソッドは素晴らしい働きをします。ただし、データを送信し、予定の検証に合格しない場合は、正しいapp.dev/patients/:idページがレンダリングされます。ここで、:idは現在作業しているページです。問題のフォームは、(患者/ショービューを介して)予定を作成するフォームです。正しくない、またはnilのデータが送信され、プレゼンス:trueが必要な場合、同じページをレンダリングしたいと思います。私が現在受け取っているのは:

rspec

ActionView::Template::Error:
   undefined method `first_name' for nil:NilClass
 # ./app/views/patients/show.html.erb:1:in `_app_views_patients_show_html_erb__4137167421928365638_70201005779320'
 # ./app/controllers/appointments_controller.rb:11:in `create'

これは、適切なパスにレンダリングを適切に設定できること、具体的には適切な患者/IDを呼び出すことができることと関係があると思います。どんな助けでも大歓迎です。

4

1 に答える 1

1

patients/show最も可能性の高い問題は、検証が失敗してテンプレートをレンダリングしたときに、作成アクションで宣言されていない変数を使用していることです。これを修正する最善の方法は、検証が失敗した場合に、作成アクションの表示アクションで使用されるのと同じ変数のセットを宣言することです。

def show
  @patients = ...
  @files = ...
end

def create
  if @object_that_fails_validation.save
  else
    @patient = ...
    @files = ...
    #render the show action
  end
end

特に多くの変数を宣言するときにこれがDRYではないと感じる場合は、ajaxを介してフォームを送信するか、変数を別のメソッドに移動してください

def show
  set_variables
end

def create
  if @object_that_fails_validation.save
  else
    set_variables
    #render the show action
  end
end

protected

def set_variable
  @patient = ...
  @files = ...
end
于 2013-02-24T12:44:15.413 に答える