Можно ли определить унаследованный хук для класса ActionController::Base в Rails 2.3.11?

Я пытаюсь реализовать унаследованный метод для класса ActionController::Base. Моя цель — вызвать методы классов, которые наследуются от ActionController::Base, например ApplicationController, чтобы включить в них определенные модули. На данный момент мой код выглядит так:

module MyModule
 def inherited(child)
 end
 def my_test_method()
 end
end
ActionController::Base.send(:extend, MyModule)

ActionController::Base.methods.include? 'my_test_method'
=> true
ActionController::Base.methods.include? 'inherited'
=> false

Код вызывается из файла инициализации плагина.


person Alfred Schnitzler    schedule 04.07.2012    source источник


Ответы (1)


inherited — это метод класса Class. Его можно перезаписать напрямую, чтобы добавить поведение при определении дочернего класса. Я не понимаю, как вы можете сделать это, расширив модуль, но это должно привести к тому же результату:

class ActionController::Base
  def self.inherited(child)
    puts "child created: #{child}"
  end
end

class ChildClass < ActionController::Base
end

и вы получите вывод:

child created: ChildClass
person L0ne    schedule 05.07.2012
comment
Привет LOne, насколько я знаю, вы можете добавить classmethod в класс, расширив его с помощью модуля. По моему примеру в случае my_test_method это работает. Но почему это не работает с унаследованным методом? Я пробовал это на других классах, таких как ActiveRecord::Base, и это сработало. - person Alfred Schnitzler; 06.07.2012
comment
Я не знаю, почему перезапись будет работать, а расширение — нет. - person L0ne; 07.07.2012