Хорошо, я реорганизовал свой код в своем маленьком приложении на Rails, пытаясь убрать дублирование и в целом сделать мою жизнь проще (а мне нравится легкая жизнь). Часть этого рефакторинга состояла в том, чтобы переместить код, который является общим для двух моих моделей, в модуль, который я могу включить туда, где он мне нужен.
Пока все хорошо. Похоже, это сработает, но я столкнулся с проблемой, которую я не знаю, как обойти. Модуль (который я назвал sendable) будет просто кодом, который обрабатывает факсы, электронную почту или печать PDF документа. Так, например, у меня есть заказ на покупку, и у меня есть Внутренние заказы на продажу (образно сокращенно ISO).
Проблема, с которой я столкнулся, заключается в том, что я хочу инициализировать некоторые переменные (инициализированные для людей, которые пишут неправильно: P) после загрузки объекта, поэтому я использовал after_initialize крюк. Нет проблем ... пока я не начну добавлять еще несколько миксинов.
Проблема, с которой я сталкиваюсь, заключается в том, что у меня может быть after_initialize
в любом из моих миксинов, поэтому мне нужно включить вызов super в начале, чтобы убедиться, другие вызовы mixin 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 с вызовом super , как я могу остановить этот последний вызов super , чтобы вызвать ошибку? Как я могу проверить, что супер метод существует, прежде чем я его вызову?