QA@IT

RailsのActiveRecordでvalidates user_id, :uniqueness { scope: item_name } とした時のエラーメッセージからuser_idを除外したい

4593 PV

RailsのActiveRecordで、次のように記述した場合、

class Foo < ActiveRecord::Base
  validates user_id, uniqueness: { scope: item_name } 
end

errors.full_messages は、["user_idはすでに存在します。", "item_nameはすでに存在します。"] といった値を返します。要件として、user_idについてユーザに表示するのは不要なため、item_nameについてのみエラーを表示させたいです。uniquenessmessage オプションでは、user_idを除外できないようです。エラー表示のためだけに独自のバリデーションメソッドを定義するのは大げさなのでなんとかしたいのですが、うまい方法はないでしょうか?

回答

手元の環境で新たに rails new して試してみましたが、errors.full_messages は 1 要素でした (前者のみ)。後者のメッセージは別のバリデータで生成されているのかもしれません。

また、この状態ではメッセージは "User has already been taken" となるので、

validates :item_name, uniqueness: {scope: :user_id}

として、item_name を主語にしたメッセージが表示されるようにするとよさそうです。

  • Ruby 2.2.0
  • Rails 4.2.0
編集 履歴 (0)
  • なるほど、元のコードから改変しているのですが、別のバリデータで生成されている可能性がありますね。確認します。わざわざ `rails new` までしていただいて、ありがとうございます! -
ウォッチ

この質問への回答やコメントをメールでお知らせします。