在验证中访问参数

时间:2012-11-12 23:59:00

标签: ruby-on-rails-3

我想在验证失败导致的错误消息中显示一些额外信息。例如,假设我有一个带有以下验证的课本

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'。有没有办法在这个上下文中访问传递的参数?

1 个答案:

答案 0 :(得分: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方法的用途。

如果您在模型中遇到困难,只需编写custom validator即可在应用程序范围内重复使用。