積々RUNMIZZO

日々積み重ね

【Ruby on Rails】空欄投稿で処理が失敗した場合のメッセージ表示


2021/9/7学習メモです✍


投稿フォームにid追加

<%= form_with model: comment, url: [board, comment], id: 'new_comment' do |f| %>

からのcreate.js.erbファイルで

$("#error_messages").remove()
<% if @comment.errors.present? %>
  $("#new_comment").prepend("<%= j(render('shared/error_messages', object: @comment)) %>")
<% else %>
  $("#js-table-comment").prepend("<%= j(render('comments/comment', comment: @comment)) %>")
  $("textarea").val('')
<% end %>

でOK!

なぜこれで動くかについては
以前、ユーザー登録やログイン実装辺りで

<% if object.errors.any? %>
  <div class="alert alert-danger">
    <ul class="mb-0">
      <% object.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
    </ul>
  </div>
<% end %>

を部分テンプレート化してたから。
そしてrender('shared/error_messages', object: @comment) で呼び出されてるだけ◎ 効率的!

エラー文の日本語化もi18nで設定済みでした。


おまけ


  • $("#error_messages").remove()でメッセージが増え続けるのを防いでいる。
  • .present?は、オブジェクトが存在すればtrueを返し、存在しなければfalseを返すメソッド
    • .any?でもいける?と思い試したらいけたけど調べたら微妙に違う扱いらしい。
  • ここでのprependは入力フォームより前に表示するように使われている


参照


コメント投稿、削除機能のajax化 - olive_miuのブログ

【Rails】 | Pikawaka - ピカ1わかりやすいプログラミング用語サイト

【Rails】バリデーションのエラーメッセージを取得・表示・日本語化する方法を完全解説!|TechTechMedia

rails-i18n/ja.yml at master · svenfuchs/rails-i18n · GitHub

present? と any? の使い分けを読み手の気持ちになって考える - Qiita