Rails Model Validation: i need validates_inclusion_of with case sensitive false?
-
29-10-2019 - |
Question
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".
Solution
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/**/"]
OTHER TIPS
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
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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow