Kev*_*ica 6 ruby-on-rails ruby-on-rails-3
我们正在创建一个使用dynamic_formgem 显示错误消息的 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 %> 
我们在验证失败时生成的错误中收到此消息:
联系人基础 请包括电话号码或电子邮件。
我们如何从生成的错误字符串中删除前置的“联系人基础”?
我们做了一些研究:我们知道这是因为,默认情况下,Rails 的错误消息系统会自动将属性名称添加到它们的错误字符串中。此外,在大多数情况下,我们可以修改英文本地化文件以删除前置字符串。
然而,官方的 Rails 指南没有列出如何更改提供给errors[:base]数组或使用自定义验证生成的错误消息的本地化。它列出了如何覆盖所有内置验证的生成字符串,但没有其他错误。
因此,我们愿意使用的一种方法是:我们如何配置config/locales/en.yml以删除前置的“Contacts base”字符串?
我们研究的另一种不愿使用的方法是打开ActiveRecord::Errors类并编写我们自己的errors#full_messages函数实现。(这篇博文描述了该技术。)这种方法改变了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.
看起来您的验证器正在使 :base 显示为属性,用此区域设置覆盖它。
# config/locales/en.yml
en:
  activerecord:
    attributes:
      contacts:
        base: "" 
| 归档时间: | 
 | 
| 查看次数: | 2369 次 | 
| 最近记录: |