LoginSignup
0
0

More than 3 years have passed since last update.

エラーメッセージを自分でカスタマイズする

Last updated at Posted at 2021-03-21

バリデーションの内容を自分好みに表示させる方法です。備忘録として載せたいと思います。
項目ごとに記述しているのでスマートではないかもしれません!
※現在は勉強段階なので実際の現場でどう使われているかは分かりません。

こんな感じに表示されます↓
スクリーンショット 2021-03-20 22.40.18.png

実装

エラーの記述部分だけ載せたいと思います

モデル

contact.rb
class Contact < ApplicationRecord
  validates :title, presence: { message: "タイトルを入力してください" }
  validates :body, presence: { message: "内容を入力してください" }
  validates :name, presence: { message: "名前を入力してください" }
  validates :email, presence: { message: "メールアドレスを入力してください" }
end

messageに好きなメッセージを設定できます。

コントローラ

※newページのform_withではconfirmアクションに飛ぶように指定しています

contacts_controller.rb
def confirm
    @contact = Contact.new(contact_params)
    @contact.valid?
    if @contact.errors.present?
      return render "new"
    end
  end

保存する時ならエラーの検証が実行されますが、今回は確認画面を挟んでいるためvalid?メソッドを使い自分でトリガーを引いてあげます。(=.errorsでエラー内容を参照できる)
(valid?:エラーの有無を判定するメソッド。正常であればtrueを返す。)

valid?をしないとエラーメッセージが入ってきません(=.errorsが使えない)
rails console(下)で確認してみるとこんな感じで、valid?をせず.errosを実行すると@messagesの中にエラー文が入ってきません。

2.6.3 :001 > contact = Contact.new()                                                                                                             
 => #<Contact id: nil, title: nil, body: nil, name: nil, email: nil, created_at: nil, updated_at: nil> 
2.6.3 :002 > contact.errors
 => #<ActiveModel::Errors:0x00007f44c8018ad8 @base=#<Contact id: nil, title: nil, body: nil, name: nil, email: nil, created_at: nil, updated_at: nil>, @messages={}, @details={}> 
2.6.3 :003 > contact.valid?
 => false 
2.6.3 :004 > contact.errors
 => #<ActiveModel::Errors:0x00007f44c8018ad8 @base=#<Contact id: nil, title: nil, body: nil, name: nil, email: nil, created_at: nil, updated_at: nil>, @messages={:title=>["タイトルを入力してください"], :body=>["内容を入力してください"], :name=>["名前を入力してください"], :email=>["メールアドレスを入力してください"]}, @details={:title=>[{:error=>:blank}], :body=>[{:error=>:blank}], :name=>[{:error=>:blank}], :email=>[{:error=>:blank}]}> 

ビュー

contact.html.erb
<% if contact.errors.messages.key?(:title) %>
 <%= contact.errors.messages[:title].first %>
<% end %>

<% if contact.errors.messages.key?(:body) %>
 <%= contact.errors.messages[:body].first %>
<% end %>

<% if contact.errors.messages.key?(:name) %>
  <%= contact.errors.messages[:name].first %>
<% end %>

<% if contact.errors.messages.key?(:email) %>
  <%= contact.errors.messages[:email].first %>
<% end %>

contact.errors.messages.key?(:title) : エラーがあったら実行する(条件分岐)
contact.errors.messages[:title].first : エラーメッセージの表示内容

下にあるrails consoleを参考にしてください。
contact.errors.messagesで全てのエラーメッセージを取得できます。なので.key?メソッド(ハッシュのkeyがあるか確認する。)を使い指定するカラムにエラーがあるか確かめ、エラーがあれば表示させるといった条件分岐になります。.firstの部分を記述しないと配列の中に入った状態で表示されてしまうので記述しています。

2.6.3 :003 > contact.valid?
 => false 
2.6.3 :004 > contact.errors
 => #<ActiveModel::Errors:0x00007f44c8018ad8 @base=#<Contact id: nil, title: nil, body: nil, name: nil, email: nil, created_at: nil, updated_at: nil>, @messages={:title=>["タイトルを入力してください"], :body=>["内容を入力してください"], :name=>["名前を入力してください"], :email=>["メールアドレスを入力してください"]}, @details={:title=>[{:error=>:blank}], :body=>[{:error=>:blank}], :name=>[{:error=>:blank}], :email=>[{:error=>:blank}]}> 
2.6.3 :004 > contact.errors.messages
 => {:title=>["タイトルを入力してください"], :body=>["内容を入力してください"], :name=>["名前を入力してください"], :email=>["メールアドレスを入力してください"]} 
2.6.3 :006 > contact.errors.messages.key?(:title)
 => true 
2.6.3 :007 > contact.errors.messages[:title]
 => ["タイトルを入力してください"] 
2.6.3 :008 > contact.errors.messages[:title].first
 => "タイトルを入力してください" 

参考サイト

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0