好的,所以我一直在我的小 Rails 应用程序中重构我的代码,以消除重复,总的来说让我的生活更轻松(因为我喜欢轻松的生活)。这种重构的一部分是将我的两个模型共有的代码移动到我可以包含在我需要的地方的模块中。
到现在为止还挺好。看起来它会成功,但我刚刚遇到了一个我不知道如何解决的问题。该模块(我称之为可发送的)只是处理传真、电子邮件或打印文档 PDF 的代码。因此,例如,我有一个采购订单,我有内部销售订单(想象地缩写为 ISO)。
我遇到的问题是,我希望在加载对象后初始化一些变量(为拼写不正确的人初始化 :P ),所以我一直在使用after_initialize钩子。没问题......直到我开始添加更多的mixin。
我遇到的问题是,我可以在我的after_initialize
任何一个 mixin 中都有一个,所以我需要在开始时包含一个super调用以确保调用其他 mixinafter_initialize
调用。太好了,直到我最终调用 super 并且我得到一个错误,因为没有 super 可以调用。
这是一个小例子,以防我不够混乱:
class Iso < ActiveRecord::Base
include Shared::TracksSerialNumberExtension
include Shared::OrderLines
extend Shared::Filtered
include Sendable::Model
validates_presence_of :customer
validates_associated :lines
owned_by :customer
order_lines :despatched # Mixin
tracks_serial_numbers :items # Mixin
sendable :customer # Mixin
attr_accessor :address
def initialize( params = nil )
super
self.created_at ||= Time.now.to_date
end
end
那么,如果每个 mixin 都有一个 after_initialize 调用,以及一个super调用,我怎样才能阻止最后一个super调用引发错误?如何在调用之前测试超级方法是否存在?