6

Here is code which is not working

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

Currently i have all of days in db except sunday. I am trying to add "Sunday", and getting errors "is not included in the list".

Maddy.Shik
  • 6,609
  • 18
  • 69
  • 98
  • Interesting, I see the same thing using the new style validations: `validates :day, inclusion:{in:%w(one two), case_sensitive:false}` – SooDesuNe Mar 24 '11 at 00:31

3 Answers3

8

validates_inclusion_of does not have a case_sensitive argument, so you can create your own validator(if you are using 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

and save this in your lib directory as:

lib/day_format_validator.rb

Then in your model, you can have:

validates :day, :day_format => true

Just make sure rails loads this lib file on startup by putting this in your config/application.rb:

config.autoload_paths += Dir["#{config.root}/lib/**/"]  
Mike Lewis
  • 63,433
  • 20
  • 141
  • 111
  • Thank you so much, answer is represented very nicely. – Maddy.Shik Mar 24 '11 at 01:00
  • If you want to use the standard, internationalized Rails error message, do `object.errors.add(attribute, I18n.t!("errors.messages.inclusion"))`, which will use the built-in Rails locale file (eg, here's the english one for version 4.2.5: https://github.com/rails/rails/blob/v4.2.5/activemodel/lib/active_model/locale/en.yml#L9) – Nathan Long Mar 03 '16 at 14:59
2

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

This downcases the field before running the validation

E Pierre
  • 416
  • 1
  • 4
  • 14
-1

A little simple solution if not worried about separating validations in 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
Maddy.Shik
  • 6,609
  • 18
  • 69
  • 98