好吧,所以我一直在我的小Rails应用程序中重构我的代码以努力消除重复,并且通常使我的生活更轻松(因为我喜欢轻松的生活).这个重构的一部分,就是将我的两个模型共同的代码移动到一个模块,我可以在需要的地方包含它.
到现在为止还挺好.看起来它会成功,但我遇到了一个我不确定如何解决的问题.该模块(我称之为可发送模块)将成为处理传真,电子邮件或打印文档PDF的代码.因此,例如,我有一个采购订单,我有内部销售订单(富有想象力地缩写为ISO).
我遇到的问题是,我想要在加载对象后初始化一些变量(初始化为没有正确拼写的人:P),所以我一直在使用after_initialize钩子.没问题......直到我开始添加更多mixins.
我遇到的问题是,我可以after_initialize
在任何一个mixin中有一个,所以我需要在开始时包含一个超级调用,以确保after_initialize
调用其他mixin 调用.哪个好,直到我最终调用超级,我得到一个错误,因为没有超级调用.
这是一个小例子,如果我不够混淆:
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方法?
你可以用这个:
super if defined?(super)
这是一个例子:
class A end class B < A def t super if defined?(super) puts "Hi from B" end end B.new.t