Programming Journal

学習したことの整理用です。

フォームの入力に失敗したとき、エラーメッセージを表示する。

フラッシュメッセージのようなエラーメッセージを表示したい

新規ユーザー登録に失敗したときや、掲示板投稿に失敗したときに理由を表示させたい。

各モデルにバリデーションを設定しているので、保存エラーが起こったときに、エラーメッセージをビューでも表示するように実装する。

Active Record バリデーション - Railsガイド

前提

すでに、UserとBoardモデルには、こんな感じでバリデーションを設定している

class Board < ApplicationRecord
  belongs_to :user
  validates :title, presence: true, length: { maximum: 255 }
  validates :body, presence: true, length: { maximum: 65_535 }
end

エラーメッセージを表示するパーシャルを作成する

汎用的なつくりにするので、パーシャルを作成する

ファイルはshared配下にする

<%# エラーメッセージ %>
  <% if object.errors.any? %>
    <div id="error_explanation" class="alert alert-danger">
      <ul class="mb-0">
        <% object.errors.full_messages each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul> 
    </div> 
  <% end %>  
BootStrap使い方メモ

まだまだ使いこなせていないのですが、classを指定することによってBootstrapがCSSも綺麗に整えてくれる

ここの部分は、margin-bottom : 0 ; ってこと エラーメッセージ下の余白が綺麗になくなりました。

<ul class="mb-0">

Spacing · Bootstrap

フラッシュメッセージみたいにするにはこれ

class="alert alert-danger"

Alerts · Bootstrap

つくったエラーメッセージ用のパーシャルをビュー側で読み込めるようにする。

<%= form_with(model:board, local: true) do |f| %> 
  <%= render 'shared/error_messages', object: f.object %>
  <div class="form-group">    
・
・

ユーザー登録フォームも同様

f.objectって??

f.objectとするとそのフォーム(ここではboard)を作るときに参照データを引っ張ってくれる

object: f.object 

左のobject(名前は何でもいい。hogeでも可)は、パーシャル内で使う変数"object"を定義している

つまり、パーシャルで使う変数"object"は、boardを作るときに参照したデータが入る

object: @userやboardでも動くけど、他のページに同じコードを入れたとき、その変数を使えるかどうかは異なる。

f.objectならどのページでも使える。

https://railstutorial.jp/chapters/user_microposts?version=6.0#cha-user_microposts#%E3%83%AA%E3%82%B9%E3%83%88%2013.41