【发布时间】:2010-09-05 20:45:29
【问题描述】:
好的,所以我一直在我的小 Rails 应用程序中重构我的代码,以努力消除重复,总体上让我的生活更轻松(因为我喜欢轻松的生活)。此重构的一部分是将我的两个模型共有的代码移动到我可以包含在我需要的地方的模块中。
到目前为止,一切都很好。看起来它会成功,但我刚刚遇到了一个我不知道如何解决的问题。该模块(我称之为可发送的)只是处理传真、电子邮件或打印文档 PDF 的代码。例如,我有一个采购订单,我有内部销售订单(想象中缩写为 ISO)。
我遇到的问题是,我想在加载对象后初始化一些变量(为拼写不正确的人初始化 :P ),所以我一直在使用 after_initialize 钩子。没问题...直到我开始添加更多的 mixin。
我遇到的问题是,我的任何一个 mixin 中都可以有一个 after_initialize,所以我需要在开始时包含一个 super 调用确保调用其他 mixin after_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 调用引发错误?如何在调用之前测试超级方法是否存在?
【问题讨论】:
标签: ruby-on-rails ruby