运行文件时从父类调用子类的方法

时间:2013-09-19 17:43:14

标签: ruby-on-rails ruby dry

我的Rails应用程序中有许多清理脚本,它们都是从公共CleanupScript类继承的所有类。为了运行清理脚本,我通常在每个文件的底部写Script.run unless Rails.env.test?(以便它可以通过rails runner运行。)

显然,这不是特别干,而且我认为超类中必须有一种方法可以自动设置它。我知道Kernel#at_exit,但我不确定我是否可以在CleanupScript内以某种方式使用它来知道要使用哪个脚本类,或者这是否是正确的过程?

1 个答案:

答案 0 :(得分:1)

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,但通常会在{{ 1}}。