如何自定义rails activerecordvalidation错误消息以显示属性值

当用户尝试使用已存在的名称创建记录时,我想显示如下错误消息:

name "some name" has already been taken

我一直在努力做到:

 validates_uniqueness_of :name, :message => "#{name} has already been taken" 

但是这会输出表名而不是name属性的值

2件事:

  1. validation消息使用Rails I18n样式插值 ,即%{value}
  2. 关键是value而不是name ,因为在国际化的背景下,你并不真正关心模型的其余部分。

所以你的代码应该是:

 validates_uniqueness_of :name, :message => '%{value} has already been taken' 

看起来你可以将Proc传递给消息。 执行此操作时,您将获得两个参数:

  1. 沿着以下行的符号:activerecord.errors.models.user.attributes.name.taken
  2. 看起来像`{:model =>“User”,:attribute =>“Name”,:value =>“My Name”}的哈希

因此,如果在proc上允许两个参数,则可以使用attributes[:value]项来获取所使用的名称:

 validates_uniqueness_of :name, :message => Proc.new { |error, attributes| "#{attributes[:value]} has already been taken." } 

你用的是什么版本的Rails?

如果Rails 3.然后据我所知你应该使用:message => '%{value} has already been taken' 。 我不确定Rails 2.3。 – 但无论如何,您可以创建自己的自定义validation,以执行您所需的操作。