railsでのformのバリデーションエラー文言を「、」区切りで出す

目次

マーケター、エンジニアを月1時間からジョインできるプラットフォーム

airteamは月1時間からマーケターやエンジニアに相談できるプラットフォーム。 雇うのはハードル高いけどプロをチームに入れたい。そんな経営者のためのサービスです。 相談にのる方も募集しています。

タスクなしだから月一時間からジョイン可能

作業はなくオンライン相談メイン。 月1時間からさっと経験者に継続的に相談できます。

多様な経験者を雇用するより何倍も早くチームに

あらゆるジャンルの経験者がいるので あなたのチームのノウハウの選択肢が広がります。

NDAはすでに締結済み、契約もスムーズ

契約の煩雑なやりとりはなく、NDAはすでに締結済み、書面のやりとりはありません。

railsのformでvalidationを設定し、引っかかった場合にメッセージを出すようにしたい。これを文言をカスタマイズして「、」区切りで出せるようにする。

バリデーションエラー文言の出し方

まずバリデーションエラー文言の出し方は下記になる。

  • modelもしくはlocalesにvalidation文言設定
  • flash[:alert]にエラー文言を入れる
  • viewをレンダリングして文言表示

モデル内でのバリデーション設定

class Hoge < ApplicationRecord
  validates :email, presence: true
end

上記のようにまずはvalidationをmodelに設定。メッセージをmodelに各方法もあるが、今回はlocalesに設定。

localesに文言設定

config/locales/ja.yml ファイル

ja:
  activerecord:
    errors:
      format: "%{message}"
    models:
      provider_user_application:
        attributes:
          email:
            blank: "emailを入力してください"
          name:
            blank: "氏名を入力してください"
            too_long: "氏名は50文字以下で入力してください"

controllerにエラーメッセージ

def create
  @hoge = Hoge.new(hoge_params)
  if @provider_user_application.save
    flash[:notice] = '応募が完了しました'
    redirect_to "/thanks"
  else
    flash[:alert] = @hoge.errors.full_messages.join(', ')
    redirect_back(fallback_location: root_path)
  end
end

redirect_back(fallback_location: root_path)で保存がうまくいかないときに再度レンダリングする。renderなどでもいいが複数ページにformを共通化して置きたい場合などどこにおいても大丈夫なようにredirect_back(fallback_location: root_path)で実装している。

デフォルトだと[“Emailemailを入力してください”, “Name氏名を入力してください”]のように配列に

デフォルトだと配列での表示になるため

flash[:alert] = @hoge.errors.full_messages.join(', ')

joinで「、」区切りで表示。