Ruby on Rails
ActiveRecord 유효성 검사
수색…
속성의 유효성 검사 유효성 검사
이 유효성 검사는 숫자 값 삽입을 제한합니다.
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::Validator
및 validates_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::EachValidator
및 validate
단일 validate
에서 공통 validate
메서드를 사용하여 새 유효성 검사기를 사용하려면 ActiveModel::EachValidator
에서 상속하는 클래스를 만들고 record
, attribute
및 value
세 가지 인수를 사용하는 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 가이드 에 대한 자세한 정보.
속성의 형식을 검증합니다.
속성의 값이 format
및 with
옵션을 사용하는 일반 표현식과 일치하는지 확인합니다.
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