#ruby #ruby-on-rails-3 #validation
#ruby #ruby-on-rails-3 #проверка
Вопрос:
Я использую easy_globalize3_accessor для set translated field, и я хотел бы протестировать набор подобных полей:
class ClientTemplate < ActiveRecord::Base
validates :content, :subject, :translated_presence => {:locales => Proc.new{|template| template.client.languages.map(amp;:locale)}}
end
Итак, я создал новый пользовательский валидатор, подобный этому, но, похоже, не работает :
class TranslatedPresenceValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
(options[:locales].call(record) || I18n.available_locales).each do |locale|
record.class.validates "#{attribute}_#{locale}".to_sym, :presence => true
end
end
end
вопрос прост, как вызвать validates ?
Спасибо.
Обновить:
validates :content, :subject, :no_internationalization_blank => {
:locales => Proc.new{|template| template.client.languages.map(amp;:locale)}
}
с помощью:
class NoInternationalizationBlankValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
options[:locales].call(record).each do |locale|
record.errors[attribute] << I18n.t("activerecord.errors.messages.blank_internationalization",
:language => I18n.t("languages.%s" % locale).downcase) if record.send(attribute.to_s.concat("_%s" % locale)).blank?
end
end
end
Ответ №1:
Можете ли вы попробовать это?
[...]
record.class.instance_eval do
validates "#{attribute}_#{locale}".to_sym, :presence => true
end
[...]
Комментарии:
1. на самом деле, я думаю, что в валидаторе нет необходимости. вместо этого вы можете захотеть создать метод класса, который добавляет эти генераторы с динамическими
:if
условиями. например,class Foo < AR::Base apply_validators :bar
иapply_validators
просто создали бы кучу валидаторов за сценой