コード
@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)}"
| 名前を入力してください
アクション間での値の受け渡しなども必要なくなり、
すっきりしました!