Я создал приложение для планирования, в котором люди назначаются в комнаты каждый день. По четвергам кто-то должен быть назначен на «пейджер пикап», и у меня возникают проблемы с проверкой, чтобы проверить это.
Модель
class Schedule < ActiveRecord::Base
has_many :rooms
...
validate :thursday_schedule_must_have_pager_pickup
...
def add_rooms
return unless self.rooms.count == 0
n = 1
tomorrow = DateTime.tomorrow
Schedule.site_list.each do |site|
Schedule.const_get(site).each do |room|
self.rooms.build(order: n,
site: site.to_s,
name: room,
start_hour: get_start_hour(tomorrow),
start_minute: get_start_minute(tomorrow, site.to_s))
n += 1
end
end
self.add_pager_pickup(n, tomorrow) if true # self.for_thursday?
self.add_today_call_data(n) if no_call_data
end
...
def add_pager_pickup(order, tomorrow)
self.rooms.build(order: order,
site: "TSH",
name: "Pager Pickup",
start_hour: 7,
start_minute: get_start_minute(tomorrow, "TSH"))
end
end
class Room < ActiveRecord::Base
belongs_to :schedule
...
end
Код, который я хотел бы написать:
def thursday_schedule_needs_pager_pickup
if self.for_thursday? && self.rooms.where(name: "Pager Pickup").first.initials.blank?
errors.add(:rooms, "'Pager Pickup' can't be empty. Select '-- late start' if no one should come in early to pick up pager.")
end
end
Это генерирует следующие ошибки:
NoMethodError in SchedulesController#create
undefined method `initials' for nil:NilClass
Добавив комнату «Pager Pickup» в расписание в последний раз, я могу взломать валидацию с помощью следующего кода:
... self.rooms.last.initials.blank?
Но это хрупко и мешает мне добавить второго, необязательного, человека, отвечающего за пейджер, "2nd Pager Pickup", после первого.
За баллы Жюльена:
Диспетчер расписания
class SchedulesController < ApplicationController
...
def new
s = current_user.schedules.new
s.add_rooms
@schedule = s
end
def create
@schedule = current_user.schedules.build(schedule_params)
if @schedule.save
flash.now[:success] = "Draft Schedule Saved! Now Confirm or Edit."
render :show
else
render :new
end
...
end
У кого-нибудь есть мысли?
Заранее спасибо!