Mik*_*ike 34 ruby ruby-on-rails
好吧,所以我一直在我的小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
Run Code Online (Sandbox Code Playgroud)
因此,如果每个mixin都有一个after_initialize调用,并且有一个超级调用,我该如何阻止最后一个超级调用引发错误?在调用super方法之前,如何测试super方法?
val*_*alo 41
你可以用这个:
super if defined?(super)
Run Code Online (Sandbox Code Playgroud)
这是一个例子:
class A
end
class B < A
def t
super if defined?(super)
puts "Hi from B"
end
end
B.new.t
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29750 次 |
| 最近记录: |