Rails : 무언가가 부울인지 어떻게 검증합니까?


115

레일 validates_numericality_of에 부울 과 같은 유효성 검사기가 있습니까? 아니면 직접 굴려야합니까?

답변:


244

Rails 3부터 다음을 수행 할 수 있습니다.

validates :field, inclusion: { in: [ true, false ] }

2
그래서,이 검증 권리를 얻을 수 있지만, 오류 메시지가 최종 사용자에게 도움이되지 않는다 "myfield가 목록에 포함되지 않습니다"
피터 Sankauskas

2
좋은 지적. : 오류 메시지가 사용자 정의 할 수 있습니다 guides.rubyonrails.org/...
드류 다라 - 브람스

55
짧은 형태validates :field, inclusion: [true, false]
barelyknown

8
validates :field, presence: true부울 필드 의 존재 여부 ( )에 대한 일반적인 유효성 검사를 할 수 없습니다 (필드는 false값에 대해 유효하지 않음 ). 그러나 Rails 3과 4 validates :field, inclusion: [true, false]에서 필드의 존재를 테스트하는 부작용과 함께 값 목록에 포함되는지 테스트했습니다 ( nil물론 해당 값 중 하나가 아닌 경우 ).
Martin Carel 2015

1
그리고 오류 메시지와 함께 그것을 필요로하는 사람들을 위해 :validates :field, inclusion: { in: [ true, false ], message: "Please, select one!" }
tagaism

38

부울 필드의 경우 다음과 같은 작업이 필요하다고 생각합니다.

validates_inclusion_of :field_name, :in => [true, false]

이전 버전의 API : "Object # blank?가 부울 값을 처리하는 방식 때문입니다. false.blank? # => true"

그래도 Rails 3에서 이것이 여전히 괜찮을지 확실하지 않습니다.


lol @ Rails 3. 나는 이것이 앞으로 몇 달 동안 경고가 될 것이라고 장담 할 수있다. 좋아, 나는이 migth가 그것이라고 생각했고 당신은 동의합니다. 감사!
aarona 2010-08-31

Rails 4는 사실입니다! 와우, false.blank? # => true는 내가 Rails에서 기대하지 않았던 잘못된 대답 처럼 보입니다 .
Dan Barron 2013 년

1
예를 들어 "foo"와 같은 문자열이로 변환되므로 작동하지 않습니다 true.
Ka Mok

10

이것을 적용하면 다음을 얻습니다.

shoulda-matchers의 경고 :

validate_inclusion_of부울 열이 부울 값을 허용하고 부울이 아닌 값을 허용하지 않는다고 주장하는 데 사용 하고 있습니다. 부울 열이 부울이 아닌 값을 부울 값으로 자동 변환하므로이를 완전히 테스트 할 수는 없습니다. 따라서이 테스트를 제거하는 것을 고려해야합니다.


null이 허용되는 필드의 경우 여전히 nil을 부울로 변환합니까?
mwfearnley

열이 nullable 인 경우를 제외하고는 해당 테스트를 제거하십시오. it {should allow_value (nil) .for (: field)} Reference
Ardi Nusawan

4

더 짧은 버전을 사용할 수 있습니다.

validates :field, inclusion: [true, false]

추가 생각. 열거 형을 다룰 때 상수도 사용하는 것을 좋아합니다.

KINDS = %w(opening appointment).freeze

enum kind: KINDS

validates :kind, inclusion: KINDS

2

Rails Docs 5.2.3 에 따른 답변

이 도우미 (존재)는 지정된 속성이 비어 있지 않은지 확인합니다. 공백을 사용합니까? 값이 nil인지 또는 공백 문자열인지, 즉 비어 있거나 공백으로 구성된 문자열인지 확인하는 메소드입니다.

false.blank 이후? true 인 경우 부울 필드가 있는지 확인하려면 다음 유효성 검사 중 하나를 사용해야합니다.

validates :boolean_field_name, inclusion: { in: [true, false] }

업데이트 된 문서를 제외하고는 이전 답변과 동일한 답변은 해시 로켓이 더 이상 필요하지 않다는 사실을 반영합니다. +1.
aarona
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.