バリデーションの内容を自分好みに表示させる方法です。備忘録として載せたいと思います。
項目ごとに記述しているのでスマートではないかもしれません!
※現在は勉強段階なので実際の現場でどう使われているかは分かりません。
##実装
エラーの記述部分だけ載せたいと思います
###モデル
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アクションに飛ぶように指定しています
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}]}>
###ビュー
<% 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
=> "タイトルを入力してください"