LoginSignup
3
2

More than 5 years have passed since last update.

fields_forで2階層以上の関連性のあるモデルを編集しバリデーションエラー発生の場合、errors.full_messagesのローカライズに失敗する対策

Posted at

はじめに

has_manyやbelongs_toで関連性を持たせた子(親)モデルの値ををひとつのフォームで編集する場合、fields_forを使いますが、これが2階層の入れ子になった場合、object.errorsのkeyが 「:"user.blog_user.posts.title"」のように、config/locals/modelsで引けない値となってしまい、バリデーションエラーの際に「User Blog user Posts Title タイトルは入力されていません」といったエラーメッセージになり、ローカライズ失敗するところを対応するメソッドを書きました。

error_helper.rb
def error_messages(object)
  object.errors.keys.each do |key|
    if key.to_s.index(".").present?
      part = key.to_s.split(".")
      new_key = "#{part[-2].singularize}.#{part[-1]}"
      o.errors[key].each do |val|
        o.errors.add(new_key.to_sym, val)
      end
      o.errors.delete(key)
    end
  end
  return  o.errors.full_messages.join('<br />')
end
3
2
0

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
  3. You can use dark theme
What you can do with signing up
3
2