IT story

다른 필드가 비어있는 경우에만 필드의 존재 여부 확인-Rails

hot-time 2021. 1. 5. 19:16
반응형

다른 필드가 비어있는 경우에만 필드의 존재 여부 확인-Rails


휴대폰 / 휴대폰 번호와 집 전화 번호가있는 양식이 있습니다.

전화 번호가 비어 있거나 그 반대 인 경우에만 휴대 전화 / 휴대 전화 번호가 있는지 확인하고 싶습니다.

이 필드에 대한 현재 유효성 검사는 다음과 같습니다.

validates_presence_of :mobile_number
validates_presence_of :home_phone

validates_length_of :home_phone, :minimum => 12, :maximum => 12
validates_length_of :mobile_number, :minimum => 10, :maximum => 10, :allow_blank => true

validates_format_of :home_phone, :with => /\A[0-9]{2}\s[0-9]{4}\s[0-9]{4}/, :message => "format should be 02 9999 9999"

나는 다음과 같은 것을 가질 수 있다고 생각했지만 정확히 어떻게 해야할지 모르겠습니다.

validates_presence_of :mobile_number, :unless => :home_phone.blank?

Rails 3을 사용하고 있습니다.


람다가 필요하지 않습니다. 이것은 다음을 수행합니다.

validates_presence_of :mobile_number, :unless => :home_phone?

또한 모든 유효성 검사기는 동일한 if / unless 옵션을 사용하므로 조건부로 만들 수 있습니다.

업데이트 : 며칠 후이 답변을 되돌아 보면 왜 작동하는지 설명해야 함을 알았습니다.

  • 유효성 검사기의 :unless옵션을 심볼로 설정하면 Rails는 해당 이름의 인스턴스 메서드를 찾고 유효성 검사시 유효성 검사중인 인스턴스에서 해당 메서드를 호출하고 메서드가 false를 반환하는 경우에만 유효성 검사를 수행합니다.
  • ActiveRecord는 모델의 각 속성에 대한 물음표 메서드를 자동으로 생성하므로 home_phone모델 테이블에 열이 있으면 Rails가 편리한 #home_phone?메서드 를 생성합니다 . 이 메서드는 home_phone이있는 경우에만 true를 반환합니다 (즉, 공백이 아님). home_phone 속성이 nil이거나 빈 문자열이거나 공백이 많은 경우 home_phone? 거짓을 반환합니다.

업데이트 :이 오래된 기술이 Rails 5에서 계속 작동하는지 확인했습니다.


lambda/ Proc개체를 사용해야 합니다.

validates_presence_of :mobile_number, :unless => lambda { self.home_phone.blank? }

Rails 4부터는 블록을 현재 상태로 전달할 수 있습니다. 간결하게 :

validates :mobile_number, presence: {unless: :home_phone?}

또한 :home_phone?nil 또는 공백에 대해 false를 반환합니다.


레일 4에서 작동하는 또 다른 방법이 있습니다.

  validates_presence_of :job, if: :executed_at?

  validates :code,
            presence: true,
            length:  { minimum: 10, maximum: 50 },
            uniqueness: { case_sensitive: false },
            numericality: { only_integer: true }

짧은 해결책 :

validates_presence_of :mobile_number, unless: -> { home_phone.blank? }

참조 URL : https://stackoverflow.com/questions/6273289/validate-presence-of-field-only-if-another-field-is-blank-rails

반응형