6

これが機能していないコードです

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

現在、日曜日を除くすべての日がdbにあります。「日曜日」を追加しようとしていますが、「リストに含まれていません」というエラーが表示されます。

4

3 に答える 3

8

validates_inclusion_ofには大文字と小文字を区別する引数がないため、独自のバリデーターを作成できます(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/**/"]  
于 2011-03-24T00:31:25.493 に答える
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

これにより、検証を実行する前にフィールドがダウンケース化されます

于 2017-08-30T04:17:46.493 に答える
-1

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
于 2011-03-24T01:33:54.993 に答える