gpt4 book ai didi

ruby-on-rails - Ruby 混入和调用 super 方法

转载 作者:数据小太阳 更新时间:2023-10-29 06:24:33 28 4
gpt4 key购买 nike

好的,所以我一直在重构我的小 Rails 应用程序中的代码,以努力消除重复,并总体上让我的生活更轻松(因为我喜欢轻松的生活)。重构的一部分是将我的两个模型通用的代码移动到一个模块,我可以在需要的地方包含它。

到目前为止,还不错。看起来它会成功,但我刚刚遇到了一个我不确定如何解决的问题。该模块(我称之为可发送)将成为处理传真、电子邮件或打印文档 PDF 的代码。因此,例如,我有采购订单和内部销售订单(想象中缩写为 ISO)。

我遇到的问题是,我希望在加载对象后初始化一些变量(为拼写不正确的人初始化 :P ),所以我一直在使用 after_initialize Hook 。没问题……直到我开始添加更多混合宏。

我遇到的问题是,我可以在我的任何一个 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 调用引发错误?如何在调用 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

关于ruby-on-rails - Ruby 混入和调用 super 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10808/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com