2013-09-19 5 views
0

У меня есть ряд сценариев очистки в моем приложении Rails, которые являются классами, которые наследуются от общего класса CleanupScript. Чтобы запустить сценарий очистки, я обычно пишу Script.run unless Rails.env.test? внизу каждого файла (чтобы его можно было запустить через rails runner).Метод вызова в подклассе из родительского класса при запуске файла

Очевидно, что это не особенно СУХОЙ, и я думаю, что в суперклассе должен быть способ установить его автоматически. Я знаю Kernel#at_exit, но я не уверен, могу ли я как-то использовать это в пределах CleanupScript, чтобы узнать, какой класс скрипта использовать, или если это даже правильный процесс?

ответ

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, если я хочу, чтобы отключить автозапуск по какой-то причине (а также автоматически отключает автозапуск для тестового env), но в целом автоматически запускает класс, когда его скрипт загружается rails runner.

Смежные вопросы