Ruby on Rails: 유효성 검사 오류

확인



유효성 검사는 데이터베이스에 저장된 데이터가 유효한지 확인하기 위해 Rails에서 사용됩니다. 향후 발생할 수 있는 문제를 방지하는 데 도움이 됩니다. 예를 들어 사용자가 양식을 작성하는 경우 전화번호가 10자리임을 확인하는 것과 같이 유효한 데이터로 작성하는 것이 중요합니다. 이렇게 하면 많은 디버깅과 골칫거리가 줄어들어 사용할 때까지 해당 문제가 지속되는 것을 방지할 수 있습니다.

개체가 유효한지 확인하는 몇 가지 방법이 있습니다. 레일에서는 활성 레코드 개체를 저장하기 전에 유효성 검사가 실행되며 오류가 있으면 저장되지 않습니다. 사용자가 9자리 전화번호를 입력하려고 하면 유효성 검사에서 유효하지 않은 것으로 인식하고 해당 정보를 데이터베이스에 저장하지 않아 사용자에게 오류 메시지를 표시합니다.

유효한 것을 사용할 수 있습니까? 아니면 무효? 이것을 확인하기 위해.

class Person < ApplicationRecord
   validates :phone, presence: true, length:{ minimum, 10 }
end


irb/console 세션을 열고 새 인스턴스 메서드를 저장하여 Person 클래스의 유효성을 테스트할 수 있습니다.

irb> Person.create(phone: "555-321-112).invalid?
=> true
irb> Person.create(phone: "555-321-112).valid?
=> false
irb> Person.create(phone: "555-321-1128).valid?
=> true



유효한? 유효성 검사를 트리거하고 오류가 없으면 true를 반환하고 오류가 있으면 false를 반환합니다. 유효하지 않은? 반대이며 오류가 있으면 true를 반환하고 오류가 없으면 false를 반환합니다.

유효성 검사 오류



우리는 작업하면서 유효성을 확인하기 위해 코드를 작성하는 동안 자체 유효성 검사를 실행할 수 있습니다. 액티브 레코드가 유효성 검사를 완료한 후 발생할 수 있는 모든 오류는 오류를 반환하는 오류 인스턴스 메서드를 통해 볼 수 있습니다. 개체가 유효하려면 유효성 검사를 실행한 후 오류 컬렉션이 비어 있어야 합니다. 이 작업을 수행하는 데 도움이 되도록 오류 수집을 살펴보겠습니다.

오류 수집



오류 : 오류는 오류가 포함된 클래스의 인스턴스를 반환합니다. 이를 통해 오류의 다양한 세부 정보를 자세히 살펴볼 수 있으므로 오류 끝에 다른 메서드를 첨부할 수 있습니다. 오류와 쌍을 이루는 몇 가지 일반적인 방법은 .message, .full_messages(to_a 별칭) 및 .full_messages_for(:attribute)입니다.

irb> person = Person.new
irb> person.valid?
=> false
irb> person.errors.message
=> "is too short(minimum is 10 characters)"
irb> person.errors.full_messages
=> ["Phone is too short (minimum is 10 characters)"]
irb> person.errors.full_messages_for(:phone)
=> ["is too short (minimum is 10 characters)"]

irb> person = Person.new(phone: "555-643-2342")
irb> person.valid?
=> true
irb> person.errors.full_messages
=> []


errors[] : 객체의 특정 속성을 확인하기 위해 errors[:attribute]를 실행할 수 있습니다. 특정 속성에 대한 오류 메시지 문자열의 배열을 반환하고 오류가 없으면 빈 값을 반환합니다.

irb> person = Person.new(phone: "555-123-123")
irb> person.valid?
=> false
irb> person.errors[:phone]
=> ["is too short (minimum is 10 characters)"]

irb> person = Person.new(phone: "555-123-1234")
irb> person.valid?
=> true
irb> person.errors[:name]
=>[]



errors.where : 오류 객체의 배열을 반환합니다. 메시지보다 더 많은 정보를 원할 때 errors[]와 비교하여 이것을 사용합니다. 객체에서 더 자세히 조사하여 더 많은 정보를 얻을 수 있습니다.

irb> person = Person.new
irb> person.valid?
=>false

irb> person.errors.where(:phone)
=>[...] #all errors for :phone attribute. Both presence and length errors

irb> person.errors.where(:phone, :too_short) 
=> [...] # :too_short errors for :phone attribute

irb> person.errors.where(:phone).first.attribute
=> :name
irb> person.errors.where(:phone).first.type
=> :too_short
irb> person.errors.where(:phone).first.options[:count]
=> 10



errors.add : 속성, 오류 유형 및 추가 옵션 해시를 사용하여 오류 객체를 생성합니다. 자체 유효성 검사기를 만드는 경우 유용합니다.

class Person < ApplicationRecord
  validate do |person|
     errors.add :phone, :too_long, message: "has too many numbers"
  end
end



irb> person = Person.create
irb> person.errors.where(:phone).first.type
=> :too_long
irb> person.errors.where(:phone).first.full_message
=> "Phone has too many numbers



errors[:base] : errors.add와 같이 특정 속성과 관련되지 않고 개체 상태 전체에 오류를 추가할 수 있습니다. 자체 유효성 검사를 작성할 때도 유용합니다.

class Person < ApplicationRecord
  validate do |person|
    errors.add :base, :invalid, message: "This phone number is invalid because ..."
  end
end



irb> person = Person.create
irb> person.errors.where(:base).first.full_message
=> "This phone number is invalid because ..."



errors.clear : 의도적으로 오류 수집을 지우고 싶을 때 사용합니다. 실제로 개체를 유효하게 만들지는 않습니다. 오류 컬렉션은 비어 있지만 다음에 해당 메서드를 저장하거나 유효성을 검사하면 유효성 검사가 다시 실행됩니다.

irb> person = Person.new
irb> person.valid?
=> false
irb> person.errors.empty?
=> false



irb> person.errors.clear
irb> person.errors.empty?
=> true



errors.size : 개체의 총 오류 수를 반환합니다.

irb> person = Person.new
irb> person.valid?
=> false
irb> person.errors.size
=> 2 #phone does not exist, and is less than minimum length.

irb> person = Person.new(phone: "555-123-123")
irb> person.valid?
=> false
irb> person.errors.size
=> 1 # phone exists, but below minimum length.


사용자 정의 방법과 관련된 오류



컬렉션이 유효하지 않은 경우 컬렉션에 오류를 추가할 수 있습니다. 조건부로 오류를 렌더링할 수 있습니다.

validate :phone_cannot_be_more_than_number

def phone_cannot_be_more_than_number
  if phone.present? && phone length > 11
  errors.add(:phone, "number is too long")



사용자 지정 메서드에 추가하면 valid?를 호출할 때마다 실행됩니다. 또는 :create 또는 :update로 메소드를 검증하기 위해 :on 옵션을 제공하지 않는 한 객체를 저장하십시오.

출처



https://guides.rubyonrails.org/active_record_validations.html#custom-methods

https://api.rubyonrails.org/v6.1.3/classes/ActiveModel/Errors.html#method-i-messages

https://guides.rubyonrails.org/active_record_validations.html#working-with-validation-errors

좋은 웹페이지 즐겨찾기