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 返回“书”。有没有办法在这种情况下访问传递的参数?

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 回答