さて、私は小さなRailsアプリでコードをリファクタリングして、重複を取り除き、一般的に私の生活を楽にしてきました(私は簡単な生活が好きなので)。このリファクタリングの一環として、2つのモデルに共通するコードを、必要な場所に含めることができるモジュールに移動しました。
ここまでは順調ですね。うまくいくように見えますが、どうすればよいかわからないという問題が発生しました。モジュール(私はsendableと呼んでいます)は、ファックス、電子メール、またはドキュメントのPDFの印刷を処理するコードになります。たとえば、私には発注書があり、内部販売注文(想像上はISOと略されます)があります。
私が直面した問題は、オブジェクトがロードされた後にいくつかの変数を初期化(スペルが正しくない人のために初期化:P)したいので、after_initializeフックを使用していることです。問題ありません...ミックスインを追加し始めるまで。
私が抱えている問題は、どのミックスインにも含めることができるということです。そのため、他のミックスインコールが確実に呼び出されるように、最初にスーパーafter_initialize
コールを含める必要があります。スーパーを呼び出すことになり、呼び出すスーパーがないためにエラーが発生するまでは、これはすばらしいことです。after_initialize
私が十分に混乱していない場合に備えて、ここに小さな例があります:
class Iso < ActiveRecord::Base
include Shared::TracksSerialNumberExtension
include Shared::OrderLines
extend Shared::Filtered
include Sendable::Model
validates_presence_of :customer
validates_associated :lines
owned_by :customer
order_lines :despatched # Mixin
tracks_serial_numbers :items # Mixin
sendable :customer # Mixin
attr_accessor :address
def initialize( params = nil )
super
self.created_at ||= Time.now.to_date
end
end
したがって、各ミックスインにスーパー呼び出しを伴うafter_initialize呼び出しがある場合、最後のスーパー呼び出しでエラーが発生するのを防ぐにはどうすればよいですか?スーパーメソッドを呼び出す前に、スーパーメソッドが存在することをテストするにはどうすればよいですか?