未経験からのフルスタックエンジニア

スキルをつけよう!未経験からフリーランスエンジニアへの成長記録

【Rails】バリデーションエラーメッセージの取得

概要

Railsmodelにバリデーションを記述すると、バリデーションチェック後に、エラーメッセージを取得できます。

その際によく使ったコマンドを備忘録として残します。

基本的な流れ

  1. インスタンスに対してメソッド.valid?を行う(バリデーションエラーがある場合、falseが返り値となります)
  2. その後、インスタンスに対してメソッド.errorsでエラーを取得できます

コマンド

# ユーザーインスタンスを例にとります
@user = User.new

# 単にエラーがあるかどうかの判断を行う
@user.errors.any?
-> false # エラーなし
-> true # エラーあり

@user.valid?
-> false # バリデーションに引っかかった場合
-> true # バリデーションを通過した場合

# 下記コードの結果は".valid"実行後に正しく取得できます
@user.errors # エラー情報が取得できます
@user.errors.full_messages # エラー文の全てを取得できます
@user.errors.full_messages_for(:カラム名) # 特定のカラムに対してのエラーメッセージを取得できます

表示の具体例

// 部分テンプレート(_error-messages.html.haml)
- if user.errors.any?
  - unless user.valid?
    - if errors = user.errors.full_messages_for(column.to_sym)
      %ul
        - errors.each do |error|
          %li=error

// 呼び出し
= render partial: 'error-messages', locals: {user: @user, column: "nickname"} // ニックネームのエラー文のみ表示したい場合

初回フォーム表示時に空のユーザーインスタンスが作成されていると、フォーム入力前にも関わらずエラーが出てしまいます。ですので、1行目のifで、フォーム初回表示時にはエラー文が出ないようにしています。

full_messagesでのエラー文取得は、配列型です。 それを取り出して表示することで、バリデーションエラーのメッセージをビューに表示することができます。

.to_symは文字列をシンボル型にするメソッドです。