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

uma*_*mar 27 ruby activerecord ruby-on-rails

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

name "some name" has already been taken

我一直在努力做到:

validates_uniqueness_of :name, :message => "#{name} has already been taken"
Run Code Online (Sandbox Code Playgroud)

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

Aus*_*lor 42

2件事:

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

所以你的代码应该是:

validates_uniqueness_of :name, :message => '%{value} has already been taken'
Run Code Online (Sandbox Code Playgroud)


Dyl*_*kow 21

看起来您可以传递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." 
                        }
Run Code Online (Sandbox Code Playgroud)