【概要】
1.結論
2.エラーバンドリングの出し方
3.詰まったところ
1.結論
validatesと.errors.anyと.errors.full_messages.eachを使う!
2.エラーバンドリングの出し方
まずmodelにバリデーションを設定します!
with_options presence: true do
validates :name
validates :date
end
with_optionsはdo~endまでのpresence: true(空欄はダメ)というのを一辺に設定できるものです。
こちらの場合はnameカラムとdateカラムの空欄はダメという設定をしています!
そしてcontrollerでは以下のようにしています。
def create
@buy_item = BuyItem.new(buy_item_params)
if @buy_item.save
redirect_to root_path
else
render :new
end
end
保存されればトップページに遷移します。もしなにかが正しくなくて保存されなかった場合はrenderでビューのnewに飛ぶようにしています。なぜなら以下のようにしたいからです。
<%= render 'public/error_messages', model: f.object %>
こうすることで、buy_itemsのnewビューに飛んだ時 (render: new)にエラー表示が設定しているプログラムに移動するようにしています。f.objectはform_wtihで設定した@buy_itemの|f|で、@buy_itemの中身を取り出しています!
また'public/error_messages'の中身(エラー文)は以下のようにしています。
<% if model.errors.any? %>
<div class="error">
<ul>
<% model.errors.full_messages.each do |message| %>
<li class='error-message'><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
modelを使用しているのは、buy_itemのモデル以外にもuserを使用しているためです。model全部にバリデーションのエラー内容を適用できます。また、その各エラー内容をeachメソッドでそれぞれ取り出し、<%= message %>で表示しています!
下記のURLにはかなり助けられました!
参考URL:Rails エラーメッセージの出し方 バリデーションエラー
5.ここから学んだこと(エラーの時に使用)
modelを@userや@buy_itemに変えてしまって、@userのエラーが出なかったり、NameErrormethodが発生してしまい、てこずりました。またf.objectも勝手にインスタンス変数にしてしまい余計にエラーを引き起こしてしまっていました。またコントローラーが2つあり指定のコントローラーのindexで表示させたい場合はrender "コントローラー名/アクション名"でいけます。ただ、表示だけしかしていないので、中身のデータの記述をしないといけない事が盲点でした。