Проверка модели Rails: мне нужно validates_inclusion_of с ложным регистром? - PullRequest
5 голосов
/ 24 марта 2011

Вот код, который не работает

    class WeekDay < ActiveRecord::Base
           validates_inclusion_of :day, :in => %w(sunday monday tuesday wednesday thursday friday saturday), :case_sensitive => false
    end

В настоящее время у меня есть все дни в БД, кроме воскресенья.Я пытаюсь добавить «Воскресенье», а получение ошибок «не входит в список».

Ответы [ 3 ]

8 голосов
/ 24 марта 2011

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/**/"]  
1 голос
/ 30 августа 2017

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

Это преуменьшает значение поля перед запуском проверки

0 голосов
/ 24 марта 2011

Небольшое простое решение, если не беспокоиться о разделении проверок в 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
...