수색…


속성의 유효성 검사 유효성 검사

이 유효성 검사는 숫자 값 삽입을 제한합니다.

class Player < ApplicationRecord
  validates :points, numericality: true
  validates :games_played, numericality: { only_integer: true }
end

이외에도 :only_integer ,이 도우미는 허용 가능한 값에 제약 조건을 추가하기 위해 다음 옵션을 허용합니다.

  • :greater_than - 값이 제공된 값보다 커야 함을 지정합니다. 이 옵션의 기본 오류 메시지는 "반드시 % {count}보다 커야합니다"입니다.
  • :greater_than_or_equal_to - 값이 제공된 값보다 크거나 같아야 함을 지정합니다. 이 옵션의 기본 오류 메시지는 "% {count}보다 크거나 같아야합니다"입니다.
  • :equal_to - 값이 제공된 값과 같아야 함을 지정합니다. 이 옵션의 기본 오류 메시지는 "반드시 % {count}와 (와) 같아야합니다"입니다.
  • :less_than - 값이 제공된 값보다 작아야 함을 지정합니다. 이 옵션의 기본 오류 메시지는 "% {count}보다 작아야합니다"입니다.
  • :less_than_or_equal_to - 값이 제공된 값보다 작거나 같아야 함을 지정합니다. 이 옵션의 기본 오류 메시지는 "% {count}보다 작거나 같아야합니다"입니다.
  • :other_than - 값이 제공된 값 :other_than 지정합니다. 이 옵션의 기본 오류 메시지는 "% {count} 이상이어야합니다"입니다.
  • :odd - 참으로 설정되면 값은 홀수 여야합니다. 이 옵션의 기본 오류 메시지는 "반드시 입력해야합니다"입니다.
  • :even - true로 설정된 경우 값이 짝수 여야 함을 지정합니다. 이 옵션의 기본 오류 메시지는 "반드시 일치해야합니다"입니다.

기본적으로 숫자는 nil 값을 허용하지 않습니다. 허용하려면 allow_nil : true 옵션을 사용할 수 있습니다.

속성의 고유성 검증

이 헬퍼는 객체가 저장되기 직전에 속성의 값이 고유하다는 것을 검증합니다.

class Account < ApplicationRecord
  validates :email, uniqueness: true
end

고유성 검사를 제한하는 데 사용되는 하나 이상의 특성을 지정하는 데 사용할 수있는 :scope 옵션이 있습니다.

class Holiday < ApplicationRecord
  validates :name, uniqueness: { scope: :year,
    message: "should happen once per year" }
end

고유성 제약 조건이 대소 문자를 구분할지 여부를 정의하는 데 사용할 수있는 :case_sensitive 옵션도 있습니다. 이 옵션의 기본값은 true 입니다.

class Person < ApplicationRecord
  validates :name, uniqueness: { case_sensitive: false }
end

속성의 유효성 검사

이 헬퍼는 지정된 속성이 비어 있지 않은지 확인합니다.

class Person < ApplicationRecord
  validates :name, presence: true
end

Person.create(name: "John").valid? # => true
Person.create(name: nil).valid? # => false

absence 도우미를 사용하여 지정된 속성이 없음을 유효성 검증 할 수 있습니다. 그것은 현재를 사용 present? 메서드를 호출하여 nil 또는 빈 값을 확인합니다.

class Person < ApplicationRecord
  validates :name, :login, :email, absence: true
end

참고 : 속성이 인 경우 boolean 하나, 당신은 (속성이 유효하지 않을 보통의 존재 확인의 사용을 할 수 없습니다 false 값). 포함 검증을 사용하여이 작업을 수행 할 수 있습니다.

validates :attribute, inclusion: [true, false]

유효성 검사 건너 뛰기

유효성 검사를 건너 뛰려면 다음 방법을 사용하십시오. 이 메소드는 유효하지 않더라도 오브젝트를 데이터베이스에 저장합니다.

  • 감소!
  • 감소 카운터
  • 증가!
  • increment_counter
  • 비녀장!
  • 접촉
  • 모두 업데이트
  • update_attribute
  • update_column
  • update_columns
  • update_counters

validate 를 인수로 전달하여 save 하는 동안 유효성 검사를 건너 뛸 수도 있습니다

User.save(validate: false)

속성의 유효성 검사 길이

class Person < ApplicationRecord
  validates :name, length: { minimum: 2 }
  validates :bio, length: { maximum: 500 }
  validates :password, length: { in: 6..20 }
  validates :registration_number, length: { is: 6 }
end

가능한 길이 제한 옵션은 다음과 같습니다.

  • :minimum - 속성은 지정된 길이보다 작을 수 없습니다.
  • :maximum - 속성은 지정된 길이를 초과 할 수 없습니다.
  • :in (또는 :within ) - 속성 길이는 주어진 간격에 포함되어야합니다. 이 옵션의 값은 범위 여야합니다.
  • :is - 속성의 길이는 지정된 값과 동일해야합니다.

그룹화 유효성 검사

때로는 여러 유효성 검사에 하나의 조건을 사용하는 것이 유용합니다. with_options를 사용하면 쉽게 달성 할 수 있습니다.

class User < ApplicationRecord
  with_options if: :is_admin? do |admin|
    admin.validates :password, length: { minimum: 10 }
    admin.validates :email, presence: true
  end
end

with_options 블록 내부의 모든 유효성 검사는 다음과 같은 조건을 자동으로 통과합니다. : is_admin?

사용자 지정 유효성 검사

ActiveModel::Validator 또는 ActiveModel::EachValidator 에서 상속 한 새 클래스를 추가하여 자체 유효성 검사를 추가 할 수 있습니다. 두 방법 모두 비슷하지만 약간 다른 방식으로 작동합니다.

ActiveModel::Validatorvalidates_with

레코드를 인수로 취하여 validate 를 수행하는 validate 메서드를 구현합니다. 그런 다음 모델의 클래스와 함께 validates_with 사용합니다.

# app/validators/starts_with_a_validator.rb
class StartsWithAValidator < ActiveModel::Validator
  def validate(record)
    unless record.name.starts_with? 'A'
      record.errors[:name] << 'Need a name starting with A please!'
    end
  end
end
 
class Person < ApplicationRecord
  validates_with StartsWithAValidator
end

ActiveModel::EachValidatorvalidate

단일 validate 에서 공통 validate 메서드를 사용하여 새 유효성 검사기를 사용하려면 ActiveModel::EachValidator 에서 상속하는 클래스를 만들고 record , attributevalue 세 가지 인수를 사용하는 validate_each 메서드를 구현합니다.

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
      record.errors[attribute] << (options[:message] || 'is not an email')
    end
  end
end
 
class Person < ApplicationRecord
  validates :email, presence: true, email: true
end

Rails 가이드 에 대한 자세한 정보.

속성의 형식을 검증합니다.

속성의 값이 formatwith 옵션을 사용하는 일반 표현식과 일치하는지 확인합니다.

class User < ApplicationRecord
  validates :name, format: { with: /\A\w{6,10}\z/ }
end

상수를 정의하고 그 값을 정규식으로 설정하여 with: 옵션에 전달할 수도 있습니다. 정말 복잡한 정규 표현식에 더 편리 할 수 ​​있습니다.

PHONE_REGEX = /\A\(\d{3}\)\d{3}-\d{4}\z/
validates :phone, format: { with: PHONE_REGEX }

기본 오류 메시지 is invalid . 이는 :message 옵션을 사용하여 변경할 수 있습니다.

validates :bio, format: { with: /\A\D+\z/, message: "Numbers are not allowed" }

그 반대로도 응답하고, 값이 일반 표현식과 일치 하지 않아야한다는 것을 지정할 수 있습니다 without: 옵션

속성의 포함을 검증합니다.

inclusion: helper를 사용하여 값이 배열에 포함되어 있는지 확인할 수 있습니다. :in 옵션과 별명 :within 허용되는 값 세트를 표시하십시오.

class Country < ApplicationRecord
  validates :continent, inclusion: { in: %w(Africa Antartica Asia Australia
                                            Europe North America South America) }
end

값이 배열에 포함되어 있지 않은지 확인하려면 exclusion: 도우미를 사용합니다 exclusion:

class User < ApplicationRecord
  validates :name, exclusion: { in: %w(admin administrator owner) }
end

조건부 유효성 검사

때로는 특정 조건에서만 레코드의 유효성을 검사해야 할 수도 있습니다.

class User < ApplicationRecord
  validates :name, presence: true, if: :admin? 

  def admin?
    conditional here that returns boolean value
  end
end

조건부가 너무 작 으면 Proc를 사용할 수 있습니다.

class User < ApplicationRecord
  validates :first_name, presence: true, if: Proc.new { |user| user.last_name.blank? }
end

조건이 부정적 일 unless 다음과 같은 경우가 unless 사용할 수 있습니다.

class User < ApplicationRecord
  validates :first_name, presence: true, unless: Proc.new { |user| user.last_name.present? }
end

instance_eval 통해 실행될 문자열을 전달할 수도 있습니다.

class User < ApplicationRecord
  validates :first_name, presence: true, if: 'last_name.blank?'
end

속성 확인

정확히 같은 내용을 받아야하는 두 개의 텍스트 필드가있을 때 이것을 사용해야합니다. 예를 들어 전자 메일 주소 또는 암호를 확인하고자 할 수 있습니다. 이 유효성 검증은 이름에 _confirmation 추가하여 확인 _confirmation 필드의 이름 인 가상 속성을 작성합니다.

class Person < ApplicationRecord
  validates :email, confirmation: true
end

참고이 확인은 email_confirmation 이 nil이 아닌 경우에만 수행됩니다.

확인을 요구하려면 확인 속성에 대한 존재 확인을 추가하십시오.

class Person < ApplicationRecord
  validates :email,      confirmation: true
  validates :email_confirmation, presence: true
end

출처

: on 옵션 사용

:on 옵션을 사용하면 유효성 검사를 수행 할시기를 지정할 수 있습니다. 모든 내장 유효성 검사 도우미에 대한 기본 동작은 저장시 실행됩니다 (새 레코드를 만들 때 및 업데이트 할 때 모두).

class Person < ApplicationRecord
  # it will be possible to update email with a duplicated value
  validates :email, uniqueness: true, on: :create
 
  # it will be possible to create the record with a non-numerical age
  validates :age, numericality: true, on: :update
 
  # the default (validates on both create and update)
  validates :name, presence: true
end


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow