Как использовать validates внутри пользовательской проверки?

#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 просто создали бы кучу валидаторов за сценой