【问题标题】:how to customize rails activerecord validation error message to show attribute value如何自定义 rails activerecord 验证错误消息以显示属性值
【发布时间】:2011-05-20 14:22:38
【问题描述】:

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

name "some name" has already been taken

我一直在努力:

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

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

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    两件事:

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

    所以你的代码应该是:

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

    【讨论】:

    • 不错!绝对比我的回答干净。
    • 知道 %{attribute} 也可以使用可能很有用。
    【解决方案2】:

    看起来您可以将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." 
                            }
    

    【讨论】:

      【解决方案3】:

      你使用什么版本的 Rails?

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

      【讨论】:

      • 对于这个应用程序,我使用的是 rails 2.3.4
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      相关资源
      最近更新 更多