我的 Rails 应用程序中有许多清理脚本,它们都是从公共类继承的所有CleanupScript
类。为了运行清理脚本,我通常会写Script.run unless Rails.env.test?
在每个文件的底部(以便它可以运行通过rails runner
)。
显然,这并不是特别干燥,我认为超类中必须有一种方法可以自动设置它。我知道Kernel#at_exit
,但我不确定我是否可以在其中使用它CleanupScript
来知道要使用哪个脚本类,或者这是否是正确的过程?
我的 Rails 应用程序中有许多清理脚本,它们都是从公共类继承的所有CleanupScript
类。为了运行清理脚本,我通常会写Script.run unless Rails.env.test?
在每个文件的底部(以便它可以运行通过rails runner
)。
显然,这并不是特别干燥,我认为超类中必须有一种方法可以自动设置它。我知道Kernel#at_exit
,但我不确定我是否可以在其中使用它CleanupScript
来知道要使用哪个脚本类,或者这是否是正确的过程?
at_exit
似乎确实是解决此问题的适当方法,这就是我最终要做的事情:
class CleanupScript
cattr_accessor :autorun
self.autorun = !Rails.env.test?
def self.inherited(klass)
at_exit do
klass.run if klass.autorun
end
end
end
这允许子类指定SubclassedCleanupScript.autorun = false
我是否要出于某种原因禁用自动运行(并且还自动禁用测试环境的自动运行),但通常会在其脚本加载时自动运行该类rails runner
。