[Rails] 모델 검증의 실현

6284 단어 초보자Rails

모델 검증 개요


데이터베이스에서 데이터 내용의 범위를 정의함으로써 저장을 제한할 수 있다.
또한 모델(Ruby 코드)에서 제약조건을 확인하거나 위반할 때 오류 메시지를 반환할 수 있습니다.검사 데이터 내용을'검증'이라고 하는데 Rails 모델에도 Ruby 코드를 통해 검증하는 메커니즘이 있습니다.검증 모델을 통해 높은 자유도 검사를 통해 오류를 쉽게 전달할 수 있습니다.

모델 검증 메커니즘


Rails의 모델 검증은 객체를 DB에 저장하고 업데이트하기 전에 검증하고 오류가 있으면 로그인, 업데이트 없이 반환하는 구조입니다.이 메커니즘에 대응하는 방법은save입니다.

검증된 쓰기


인증 코드는 두 가지가 있는데, 하나는 직접 작성하는 방법이고, 다른 하나는 Rails가 제공하는 보조 프로그램을 사용하는 것이다.후자는 다음과 같은 검증 기능을 자주 사용한다.
컨텐츠 확인
보조 객체 사용법 예
필요한 데이터가 있습니까?
validates :foo, presence: true
수치 이외의 것은 없습니까?소수점의 유무, 마이너스는 기대에 부합됩니까?
validates :foo, numericality: true
수치의 범위가 기대와 같나요?
validates :foo, inclusion: { in: 0..9}
문자열의 길이가 예상에 부합됩니까?
validates :foo, length: { maximum: 30}
문자열의 형식과 구성 문자 종류가 예상에 부합됩니까?
validates:foo,format:{with:…}validates:foo,inclusion:{in:…}
데이터가 유일합니까?
validates :foo, uniqueness: true
비밀번호와 메일 주소는 확인용 입력과 일치합니까?
validates :foo, confirmation

모델에 검증 추가(필수 여부 확인)


생성된 프로그램의 포스트 모델에 콘텐츠 속성의 값이 없으면 검증 오류가 발생할 수 있도록 검증을 추가합니다.
app/models/post.rb
class Post < ApplicationRecord
  validates :content, presence: true
end

컨트롤러 변경


그리고 포스트 모델이 검증 과정에서 문제가 발생했을 때 사용자에게 이해하기 쉬운 항목을 입력하라고 알려야 합니다.먼저 컨트롤러를 변경합니다.예전에create 동작...
app/controllers/posts_controller.rb
  def create
    post = Post.new(post_params)
    post.save!
    redirect_to posts_url, notice: "「#{post.content}」を投稿しました。"
  end
다음으로 변경합니다.
app/controllers/posts_controller.rb
  def create
    @post = Post.new(post_params)

    if @post.save
      redirect_to @post, notice: "「#{@post.content}」を投稿しました。"
    else
      render :new
    end
  end
투고하는 방법 save!에서 설명한 대로 해당 매개변수의 값을 수정합니다.검증에 따라 사용자의 입력에 따라 투고가 실패합니다.따라서 실패 시 처리를 중단하는save!환경과 혼합되어야 하는 각 반사광선은 환경 샘플링을 한다.
검증 오류에 다음과 같은 처리가 추가되었습니다.검증 결과가 가짜라면render:new는 게시글 폼 화면을 다시 표시하고 입력하라는 메시지를 표시합니다.
인스턴스 변수에 포스트 객체가 대입되었습니다.오류가 발생했을 때 게시물을 다시 표시할 때 검증된 실물 포스트 대상을 보기에 전달해야 하기 때문이다.@post를 뷰로 전달하면 다음과 같은 두 가지 효과가 발생합니다.
  • 마지막으로 입력한 데이터가 폼에 들어간 상태를 계승할 수 있습니다.
  • 포스트 객체에 존재하는 유효성 검사 오류를 사용자에게 표시할 수 있습니다.
  • 뷰 변경


    뷰를 계속 변경합니다.
    form_with에 메시지 영역을 만듭니다.
    app/views/posts/_form.html.slim
    - if post.errors.present?
      ul#error_explanation
        - post.errors.full_messages.each do |message|
          li= message
    
    = form_with model: post, local: true do |f|
      
    
    errors.present?모범 사례를 찾습니다.

    모델 검증 추가(문자열 길이 검증)


    데이터베이스 정의는 사용자가 알 수 있도록 콘텐츠 열의 문자열을 50자 이상으로 제한합니다.
    validates는 같은 속성을 위해 한 줄에 여러 개의 검증을 쓸 수 있습니다.
    app/models/post.rb
    class Post < ApplicationRecord
      validates :content, presence: true, length: { maximum: 50 }
    end
    

    참고 자료


    현장에서 사용하는 Ruby on Rails5 속습 실습 가이드

    좋은 웹페이지 즐겨찾기