RegularEvent 的
holding_today?
方法调用 EventSchedule 模块(原始)。
class RegularEvent < ApplicationRecord
scope :holding, -> { where(finished: false) }
def self.today_events
holding.select(&:holding_today?)
end
def holding_today?
schedule = EventSchedule.load(self) # EventSchedule is original module.
schedule.held_next_event_date.to_date == Time.zone.today
end
end
然后,EventSchedule 模块的
load
方法根据参数中事件对象的类动态创建一个实例。
在本例中,将创建 EventSchedule::RegularEventSchedule 的实例。
module EventSchedule
def self.load(event)
type = event.is_a?(Event) ? 'SpecialEvent' : event.class
klass = "EventSchedule::#{type}Schedule".constantize
klass.new(event)
end
end
module EventSchedule
class RegularEventSchedule
def initialize(event)
...
end
end
end
当这些进程在应用程序上(或在测试代码中)执行时,会发生错误。
NameError: uninitialized constant EventSchedule::RegularEventSchedule
candidate = constant.const_get(name)
为了调试,我在rails控制台中尝试了它,运行良好。
irb(main):001:0> RegularEvent.holding.select(&:holding_today?)
=>
[#<RegularEvent:0x00007fd4e0bf0a60
id: 1,
user_id: 1,
title: "Event1",
...
>,
#<RegularEvent:0x00007fd4e0bf0a60
id: 2,
user_id: 2,
title: "Event2",
...
>,]
为什么会出现这个错误?
holding_today?
的单元测试为绿色。
如果我遗漏任何信息,请告诉我。
抱歉,赛程有误。