Rails模型验证:我需要使用大小写不敏感的validates_inclusion_of?

6

以下是不起作用的代码

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

目前我的数据库里有除了星期天之外的所有日期。我正在尝试添加“星期天”,但是出现了“不在列表中”的错误提示。


有趣的是,我看到使用新样式验证时相同的内容: validates :day, inclusion:{in:%w(one two), case_sensitive:false} - SooDesuNe
3个回答

8

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

只需在config/application.rb中加入以下内容,确保rails在启动时加载此lib文件:

config.autoload_paths += Dir["#{config.root}/lib/**/"]  

非常感谢,答案表述得非常好。 - Maddy.Shik
如果您想使用标准的国际化 Rails 错误消息,请执行 object.errors.add(attribute, I18n.t!("errors.messages.inclusion")),这将使用内置的 Rails 区域设置文件(例如,这是版本 4.2.5 的英文区域设置文件:https://github.com/rails/rails/blob/v4.2.5/activemodel/lib/active_model/locale/en.yml#L9)。 - Nathan Long

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

在执行验证之前,将该字段转换为小写


-1

如果不担心将验证分离到库中,这是一个简单的解决方案

    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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接