LoginSignup
0
0

More than 3 years have passed since last update.

エラーバンドリングの出し方

Last updated at Posted at 2020-09-04

【概要】

1.結論

2.エラーバンドリングの出し方

3.詰まったところ

1.結論

validates.errors.any.errors.full_messages.eachを使う!

2.エラーバンドリングの出し方

まずmodelにバリデーションを設定します!

app/models/buy_item
  with_options presence: true do
    validates :name
    validates :date
 end

with_optionsはdo~endまでのpresence: true(空欄はダメ)というのを一辺に設定できるものです。
こちらの場合はnameカラムとdateカラムの空欄はダメという設定をしています!

そしてcontrollerでは以下のようにしています。

controllers/buy_items_controller.rb
 def create
    @buy_item = BuyItem.new(buy_item_params)
    if @buy_item.save
      redirect_to root_path
    else
      render :new
    end
  end

保存されればトップページに遷移します。もしなにかが正しくなくて保存されなかった場合はrenderでビューのnewに飛ぶようにしています。なぜなら以下のようにしたいからです。

views/buy_items/new.html.erb
 <%= render 'public/error_messages', model: f.object %>

こうすることで、buy_itemsのnewビューに飛んだ時 (render: new)にエラー表示が設定しているプログラムに移動するようにしています。f.objectはform_wtihで設定した@buy_itemの|f|で、@buy_itemの中身を取り出しています!

また'public/error_messages'の中身(エラー文)は以下のようにしています。

view/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 "コントローラー名/アクション名"でいけます。ただ、表示だけしかしていないので、中身のデータの記述をしないといけない事が盲点でした。

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