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


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

こんな感じに表示されます↓
![スクリーンショット 2021-03-20 22.40.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1020497/0d78d705-984a-c1ca-bb0c-dce797cb3a23.png)



##実装
エラーの記述部分だけ載せたいと思います
###モデル
```Ruby: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アクションに飛ぶように指定しています

```ruby: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の中にエラー文が入ってきません。

```ruby
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}]}> 
```

###ビュー
```html: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の部分を記述しないと配列の中に入った状態で表示されてしまうので記述しています。

```ruby
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
 => "タイトルを入力してください" 
```

##参考サイト
https://qiita.com/isotai/items/11fdd5f3dd8df16519fe