【发布时间】:2018-11-08 12:56:22
【问题描述】:
我制作了一个日程安排应用程序,每天将人员分配到房间。在星期四,必须为“寻呼机取件”指派某人,而我在验证时遇到了问题。
型号
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
通过最后将“寻呼机取货”房间添加到日程表中,我可以使用以下代码破解验证:
... self.rooms.last.initials.blank?
但这很脆弱,并且使我无法在第一个之后添加第二个可选的寻呼机拾音器“第二个寻呼机拾音器”。
根据朱利安的观点:
调度控制器
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
有人有什么想法吗?
提前致谢!
【问题讨论】:
-
您有名为Pager Pickup的房间记录吗?
-
问得好,@Pavan。是的,我非常有信心,我已经小心确保拼写或大小写错误等拼写错误不会阻止名为“Pager Pickup”的房间存在。
标签: ruby-on-rails ruby-on-rails-4 rails-activerecord