[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.rbclass 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를 뷰로 전달하면 다음과 같은 두 가지 효과가 발생합니다.
class Post < ApplicationRecord
validates :content, presence: true
end
def create
post = Post.new(post_params)
post.save!
redirect_to posts_url, notice: "「#{post.content}」を投稿しました。"
end
def create
@post = Post.new(post_params)
if @post.save
redirect_to @post, notice: "「#{@post.content}」を投稿しました。"
else
render :new
end
end
뷰 변경
뷰를 계속 변경합니다.
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 속습 실습 가이드
Reference
이 문제에 관하여([Rails] 모델 검증의 실현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/super-kiricub/items/98a71d9f8253816d3cf2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여([Rails] 모델 검증의 실현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/super-kiricub/items/98a71d9f8253816d3cf2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)