0

Я пытающийся последующей строку коды:Rails 3.2.x визуализация другого вида шаблона с конкретным идентификатором

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 

Это происходит через три контроллера в настоящее время. Два из них кажутся важными.

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 

Мой метод создания работает замечательно. Однако, когда я отправляю данные и не передаю проверки в назначениях, он должен отображать правильную страницу app.dev/patients/:id, где: id - текущая страница, с которой я работаю. Образец, о котором идет речь, является тем, который создает встречу (через представление «Пациенты/шоу»). Когда отправляются неверные или нулевые данные и присутствует: 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' 

Я подозреваю, что это имеет отношение к возможности соответствующим образом настроить рендер на правильном пути, в частности, назвать правильный пациента/идентификатор. Любая помощь будет принята с благодарностью.

ответ

1

У вас наиболее вероятная проблема в том, что вы используете переменные в patients/show, которые не объявлены в действии create, когда проверка не выполняется, и вы визуализируете шаблон. Лучший способ исправить это, чтобы объявить тот же набор переменных, используемых на шоу действий по созданию действий, если проверка не пройдена

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 
+0

, который хорошо работает. Спасибо, но задали переменные 'private', а не' protected', как вы рекомендовали. В целом это получилось хорошо! Ура! – sandovalg