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

时间:2011-05-20 14:22:39

标签: ruby-on-rails ruby activerecord

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

name "some name" has already been taken

我一直在尝试:

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

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

3 个答案:

答案 0 :(得分:42)

2件事:

  1. 验证邮件使用Rails I18n style interpolation,即%{value}
  2. 关键是value而不是name,因为在国际化的背景下,您并不真正关心模型的其余部分。
  3. 所以你的代码应该是:

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

答案 1 :(得分:21)

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

  1. :activerecord.errors.models.user.attributes.name.taken
  2. 行的符号
  3. 看起来像`{:model =>“User”,:attribute =>“Name”,:value =>“我的名字”}
  4. 的哈希

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

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

答案 2 :(得分:3)

您使用的是什么版本的Rails?

如果Rails 3. ,那么根据我的理解,您应该使用:message => '%{value} has already been taken'。我不确定Rails 2.3。 - 但无论如何,您可以创建自己的自定义验证来执行您需要的工作。