Проверка модели Rails: мне нужно validates_inclusion_of с ложным регистром?
Вот код, который не работает
class WeekDay < ActiveRecord::Base
validates_inclusion_of :day, :in => %w(sunday monday tuesday wednesday thursday friday saturday), :case_sensitive => false
end
В настоящее время у меня есть все дни в БД, кроме воскресенья. Я пытаюсь добавить "Воскресенье", а получение ошибок "не входит в список".
3 ответа
Решение
validates_inclusion_of не имеет аргумента case_sensitive, поэтому вы можете создать свой собственный валидатор (если вы используете Rails 3):
class DayFormatValidator < ActiveModel::EachValidator
def validate_each(object, attribute, value)
unless %w(sunday monday tuesday wednesday thursday friday saturday).include?(value.downcase)
object.errors[attribute] << (options[:message] || "is not a proper day.")
end
end
end
и сохраните это в вашей директории lib как:
lib/day_format_validator.rb
Тогда в вашей модели вы можете иметь:
validates :day, :day_format => true
Просто убедитесь, что rails загружает этот файл lib при запуске, поместив его в ваш config/application.rb:
config.autoload_paths += Dir["#{config.root}/lib/**/"]
class WeekDay < ActiveRecord::Base
before_validation :downcase_fields
validates_inclusion_of :day, :in => %w(sunday monday tuesday wednesday thursday friday saturday)
def downcase_fields
self.day.downcase!
end
end
Это уменьшает поле до запуска проверки
Небольшое простое решение, если не беспокоиться о разделении проверок в lib
class WeekDay < ActiveRecord::Base
validate :validate_day
def validate_day
if !self.day.nil?
errors.add(:day, "is not included in the list") unless %w(sunday monday tuesday wednesday thursday friday saturday).include?(self.day.downcase)
end
end
end