December 11th, 2020
英語辞書を見ましょう
作業結果などが規定の条件や仕様に適合しているかどうかの〕検証、証明、妥当性確認
簡単に言えば 入力チェック
のこと
50文字以内になってる? 空っぽじゃない? emailの形式になっている? 大文字含んでいない?
モデルに設定するだけです
class Book < ApplicationRecord
# タイトルの空っぽはダメ🙅♂️🙅♀️という設定 ↓
validates :title, presence: true
end
Bookが
データベースに保存される前
に状態をチェックします
rails consoleで実験してみます
❯ rails c
irb(main):001:0> book_instance = Book.new(title: '', body: 'validation ヘルパー')
=> #<Book id: nil, title: "", body: "validation ヘルパー", created_at: nil, updated_at: nil>
irb(main):002:0> book_instance.save
(0.1ms) begin transaction
(0.1ms) rollback transaction
=> false
begin transaction(開始)
のあと、rollback transaction(取り止め)
してます
transactionとはここではデータベースにデータ保存しようとする処理と捉えてください。
つまり、空っぽで投稿すると、検証に引っかかって保存されませんでした !!!
検証に引っかかったインスタンス.errors
でエラーに関する情報を取得できて、
そのあとに .full_messages
とするとエラーメッセージを 配列
で取得できます。
❯ rails c
irb(main):001:0> book_instance = Book.new(title: '', body: 'validation ヘルパー')
=> #<Book id: nil, title: "", body: "validation ヘルパー", created_at: nil, updated_at: nil>
irb(main):002:0> book_instance.save
(0.1ms) begin transaction
(0.1ms) rollback transaction
=> false
irb(main):003:0> book_instance.errors
=> #<ActiveModel::Errors:0x00007f96a9460310
@base=#<Book id: nil, title: "", body: "validation ヘルパー", created_at: nil, updated_at: nil>,
@messages={:title=>["can't be blank"]}, @details={:title=>[{:error=>:blank}]}>
irb(main):004:0> book_instance.errors.full_messages
=> ["Title can't be blank"]
配列の形式でエラーメッセージを取得できたので後は、eachメソッドで分解してやるだけ!