Хорошо, поэтому я реорганизовал свой код в своем маленьком приложении 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 из-за повышения ошибки? Как я могу проверить, существует ли метод супер до того, как я его назову?