[결정판] Rails로 개별 속성을 검증하는 사용자 정의 버전 만들기

5950 단어 Rails
이 글은 ActiveModel::EachValidator를 이용하여 개별 프로젝트를 검증한 가시 데이터의 제작 방법을 기초에서 응용까지 설명한다

토대


먼저 Rails 가이드읽어보세요.
사용자 정의 발리 데이터를 추가하여 개별 속성을 검증합니다.ActiveModel::EachValidator가 가장 간단하고 편리합니다.이런 상황에서 이 사용자 정의 발리 데이터 클래스는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] || "はメールアドレスではありません")
    end
  end
end

class Person < ActiveRecord::Base
  validates :email, presence: true, email: true
end
위의 예에서 보듯이 표준적인 가시와 사용자 정의 가시를 조합할 수도 있다.
이런 견해가 있다.
보충.확실히, 나는 이렇게 이동하는 것이 괜찮다고 생각하지만, 가시 데이터는 app/validators/email_validator.rb에 놓고, 모형에
app/models/model_name.rb
validates :field_name, email: true
잠깐만, 나는 두 개를 나누어 쓰는 것이 매우 평범하다고 생각한다.보완 완료
그렇군요. email: true와 같은 가시 데이터는 이 지식만으로도 만들 수 있지만 true만 완성할 수 있는 가시 데이터, 즉 inclusion: ['01', '02'], 옵션numericality: { only_integer: true }과 같은 가시 데이터는 실현할 수 없습니다.
그럼 응용편입니다.

응용 프로그램


옵션 모드


그럼 이해하기 쉽고 선택적인 패턴부터 시작하죠.numericality: { only_integer: true }와 같이 Hash를 호출할 때 { only_integer: true }는 (파라미터에 없음)options를 통해 얻을 수 있다.즉 only_integer의 값을 얻으려면 options[:only_integer]라고 불러야 한다.
Rails 가이드의 예에도 options[:message]라고 쓰여 있는 부분이 있다
validates :field_name, email: { message: 'を正しく入力してください' }
이렇게 쓰는 기능도 갖추었다.

옵션 모드 없음


그렇다면Hash, 즉inclusion: ['01', '02'] 이런 호출 모드가 없는 상황에서 제공된['01', '02'] 부분을 어떻게 수신할 것인가.이거, 가볍게 찾아봤는데 설명이 없어서 드디어 도착했어요Rails 소스 봐봐..결론은 다음과 같습니다.['01', '02']:
  • Range 또는 Array의 경우 options[:in] 에서
  • 위 이외의 경우options[:with]
  • 찾기
    에이!해시 값이 지정한 유형에 따라 취법이 바뀔까요?아, 그런데 확실히 옵션의 유무에 따라
    validates :field_name, format: /\A[a-zA-Z]+\z/
    validates :field_name, format: { with: /\A[a-zA-Z]+\z/, message: "英文字のみが使用できます" }
    
    validates :field_name, inclusion: %w(small medium large)
    validates :field_name, inclusion: { in: %w(small medium large), message: "%{value} のサイズは無効です" }
    
    이처럼 inwith가 (자연스럽게) 분리돼 사용되는 경우를 많이 봤죠.그게 그런 건가?

    총결산


    스스로 라일스의 스퍼트 데이터를 만들 때 inwith의 차이를 모르고 사용하면 푹 빠지기 쉽다.

    좋은 웹페이지 즐겨찾기