0

検証の失敗に起因するエラーメッセージにいくつかの追加情報を表示したいと思います。たとえば、次の検証を含むクラスBookがあるとします。

validates :name, presence: true, uniqueness: true

誰かが同じ名前の本を挿入しようとすると、次のエラーメッセージが返されます

{"name":["has already been taken"]}

代わりに見せたい

{"name":["Book 'Great Expectaions' has already been taken at id:7"]}

今これを実現するには、上記の一意性の検証を削除して、次のことを行う必要があります

validate do |book|
  existing_book = Book.find_by_name(book.name)
  if existing_book
    book.errors.add(:name, "#{existing_book.name} already exists at id: #{existing_book.id}")
  end
end

カスタムの一意性検証を記述せずに、上記のようなカスタムエラーメッセージを取得する方法はありますか?私はの線に沿って何かを考えていました

validates :name, presence: true, uniqueness: {message: "#{self.name} already exists at id: #{Book.find_by_name(self.name).id}"

しかし、self.nameが「Book」を返すため、これは機能しないようです。このコンテキストで渡されたパラメーターにアクセスする方法はありますか?

4

1 に答える 1

1

これは、カスタム検証として行う必要があります。私は次のようにします:

validate :name_is_unique

private
def name_is_unique
  errors.add(:name, "#{other_book.name} already exists at id: #{other_book.id}") if other_book = Book.find_by_name(name)
end

問題は、現在のモデル属性を検証に含めることができないということではなく、別のモデルを含める「ワンライナー」の方法がないということです。良いニュースは、それがvalidateメソッドの目的です。

モデルにこれを含めるのが面倒な場合は、アプリケーション全体で再利用できるように、カスタム バリデータを記述してください。

于 2012-11-13T00:10:37.380 に答える