Я нашел способ сделать эту работу, но мне интересно узнать о лучшем способе / способе Rails 3.(Я все еще использую 2.3.5, но надеюсь перейти на новый год.)
Ситуация: у меня есть два уровня наследования модулей, второй слой смешивается с моделью Rails.Оба модуля определяют методы проверки, и мне бы хотелось, чтобы они оба прикрепили проверки к базовому классу, но из-за двух уровней наследования следующее не работает:
def self.included(base)
base.validate :yadda_yadda
end
Когда этот модульвключен другим модулем, интерпретатор останавливается, потому что модули не знают о ActiveRecord::Validations
.Включение модуля валидации напрашивается на вопрос "где находится save
?"спасибо alias_method
.
Следующие работы, если вы помните, чтобы вызывать super
всякий раз, когда вы переопределяете validate()
.Я не доверяю себе или будущим сопровождающим помнить об этом, поэтому я хотел бы использовать вместо этого идиому validate :yadda_yadda
, если это возможно.
module Grandpa
def validate
must_be_ok
end
def must_be_ok
errors.add_to_base("#{self} wasn't ok")
end
end
module Dad
include Grandpa
def validate
super
must_be_ok_too
end
def must_be_ok_too
errors.add_to_base("#{self} wasn't ok either")
end
end
class Kid < ActiveRecord::Base
include Dad
validate :must_be_ok_three
def must_be_ok_three
errors.add_to_base("#{self} wasn't ok furthermore")
end
end
Предложения?Советы по подходу Rails 3?Я не думаю, что API валидации сильно изменился.