从错误的完整错误消息中删除前置属性名称[:base]

时间:2014-06-09 21:20:57

标签: ruby-on-rails ruby-on-rails-3

我们正在创建一个使用dynamic_form gem来显示错误消息的Rails表单。对于表单与之交互的模型之一,我们创建了一个自定义验证器:

class Contact < ActiveRecord::Base
  belongs_to :agency

  validate :new_signups_have_contact_information

  def new_signups_have_contact_information
    if agency && agency.is_new_signup?
      unless (email && email != '') || (phone && phone != '')
        errors[:base] << "Please include a phone number or email."
      end
    end
  end
end

到目前为止,这么好。但是,当我们显示这些错误时,我们的观点是:

<%= form_for @contact do |contact_form| %>
  <%= contact_form.error_messages %>
  <%# snip %>
<% end %> 

我们在验证失败时生成的错误中收到此消息:

  

联系人基础请提供电话号码或电子邮件。

我们如何删除前置&#34;联系人基础&#34;从生成的错误字符串?


我们已经做了一些研究:我们知道这种情况正在发生,因为默认情况下,Rails&#39;错误消息系统automatically prepends attribute names to their error strings。此外,在大多数情况下,我们可以modify the English localization fileremove the prepended strings

但是,官方Rails指南并没有列出如何更改给定errors[:base]数组或使用自定义验证生成的错误消息的本地化。它列出了如何覆盖all of the built-in validations生成的字符串,但没有其他错误。

因此,我们愿意使用一种方法:我们如何配置config/locales/en.yml以删除前置&#34;联系人基础&#34;串吗


我们研究的另一种我们不愿意使用的方法是打开ActiveRecord::Errors类并编写我们自己的errors#full_messages函数实现。 (This blog post描述了该技术。)这种方法改变了整个项目的ActiveRecord::Errors类的行为,我们宁愿使用一种具有更多本地影响的方法。 如果我们无法使用lcoalization文件来实现我们想要的目标,那么开放ActiveRecord:Errors类是否有更简单的方法?


修改

contact.errors哈希是:

$ contact.errors.to_yaml
--- !ruby/object:ActiveModel::Errors
base: !ruby/ActiveRecord:Contact
  attributes:
    id:
    # snip
messages: !omap
- :base:
  - Please include a phone number or emai.

2 个答案:

答案 0 :(得分:2)

看起来您的验证器正在制作:base显示为属性,使用此语言环境覆盖它。

# config/locales/en.yml
en:
  activerecord:
    attributes:
      contacts:
        base: "" 

答案 1 :(得分:0)

请记住,也可以配置错误消息的各种属性

# config/locals/en.yml
en:
  activerecord:
    attributes:
      contacts:
        base: ""
   errors:
     messages:
       blank: "missing"