モジュールを含めることで、動的に生成されたメソッドをオーバーライドしようとしています。
以下の例では、Ripple アソシエーションがrows=メソッドを Table に追加します。そのメソッドを呼び出したいのですが、後で追加のことも行います。
モジュールが既存のメソッドを使用するためrow=に呼び出すことができると考えて、メソッドをオーバーライドするモジュールを作成しました。super
class Table
# Ripple association - creates rows= method
many :rows, :class_name => Table::Row
# Hacky first attempt to use the dynamically-created
# method and also do additional stuff - I would actually
# move this code elsewhere if it worked
module RowNormalizer
def rows=(*args)
rows = super
rows.map!(&:normalize_prior_year)
end
end
include RowNormalizer
end
ただし、 newrows=が呼び出されることはありません。これは、その中で例外を発生させても何も起こらないという事実からも明らかです。
これを入れると例外が発生するため、モジュールが含まれていることはわかっています。
included do
raise 'I got included, woo!'
end
rows=また、モジュールが の代わりに を定義しsomethingelse=ている場合、そのメソッドは呼び出し可能です。
モジュール メソッドが動的に生成されたメソッドをオーバーライドしないのはなぜですか?