search
LoginSignup
0

posted at

updated at

【Rails】バリデーションに引っ掛かったカラムを取得する

コード

@user.errors.attribute_names
=> ["name", "email", "tel"]

errors.attrbute_namesで引っ掛かったカラムの配列を取得できます。

詳細

今回はJSを使わずにバリデーションに引っ掛かった項目のinputの下に、
エラーメッセージを表示しなければいけなかったので、
どこのメッセージを表示するかの判定に引っ掛かったカラム名が欲しくて調べました。

controller
def create
  @user = User.new(user_params)
  return redirect_to action: :new, errors: @user.errors.attribute_names if @user.valid?
  # 以下バリデーションが通った時の処理
end

これだとerrorsの内容がクエリに入ってしまうし、
入力済みの内容も保持したかったので、
実際にはflashで渡しました。

controller
def new
  @user = flash.present? ? User.new(flash[:user_params]) : User.new
  @errors = flash[:errors]
end

def create
  @user = User.new(user_params)
  if @user.valid?
    flash[:errors] = @user.errors.attribute_names
    flash[:user_params] = user_params
    return redirect_to action: :new
  end
  # 以下バリデーションが通った時の処理
end

追記

該当のカラムがエラーに含まれているかの判定だけなら、
attribute_nameはなくてもerrors.include?でいけました。
今回はviewでのエラーメッセージを個々の場所に表示する為、
それぞれの該当箇所でカラムがエラーに含まれているかを知りたかったので

view
= @user.errors.include?(:name)

で大丈夫でした。

ということは、redirecet_toではなくrenderでも大丈夫です。

controller
def create
  @user = User.new(user_params)
  return render :new if @user.invalid?
end
view
// エラーの中にnameが含まれていなければis-hidden(非表示用に設定したクラス)で非表示
div class="error-message #{'is-hidden' unless @user.errors.include?(:name)}"
  | 名前を入力してください

アクション間での値の受け渡しなども必要なくなり、
すっきりしました!

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
What you can do with signing up
0