4

레일 모델 유효성 검사 : validates_inclusion_of에 대소 문자가 틀리면 false가 필요합니까? 여기

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

은 현재 내가 일요일을 제외하고 DB의 일을 모두가 작동하지 않는 코드입니다. "일요일"을 추가하려고하는데 오류를 얻는 것은 "목록에 포함되지 않았습니다".

+0

흥미 롭습니다. 새 스타일 유효성 검사를 사용하여 같은 일을합니다 :'validates : day, inclusion : {in : % w (one two), case_sensitive : false}' – SooDesuNe

답변

8

validates_inclusion_of는 CASE_SENSITIVE 인수가없는, 그래서 당신은 당신의 자신의 유효성 검사기를 만들 수 있습니다 (당신이 레일 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 

그냥 확인 레일로드에게 스타이 lib에 파일을

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

정말 고마워요. –

+0

표준화 된 국제화 된 레일즈 오류 메시지를 사용하려면 내장 된 레일스 로케일 파일을 사용할'object.errors.add (attribute, I18n.t! ("errors.messages.inclusion"))'명령을 사용하십시오. (예 : 영어 버전 4.2.5 : https://github.com/rails/rails/blob/v4.2.5/activemodel/lib/active_model/locale/en.yml#L9) –

-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 
0

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

이것은을 downcases : 당신의 설정/application.rb이를 넣어 대가리 유효성 검사를 실행하기 전의 필드