Rails 4 - 从自定义验证器传递变量以进行本地化

时间:2013-07-28 11:34:01

标签: ruby-on-rails ruby-on-rails-4

我有一个i18n文件:

en:
  activemodel:
    errors:
      messages:
        email_address: "%{email} is not a valid email"

我有一个电子邮件的自定义验证器:

class EmailFormatValidator < ActiveModel::EachValidator
  def validate_each record, attribute, value
    record.errors.add attribute, (options[:message] || :email_address) unless
    value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/
  end
end

如何将%{email}的值从验证器上方传递到i18n yml文件?我一直收到这个错误:

missing interpolation argument :email in "%{email} is not a valid email" ({:model=>"Signup", :attribute=>"Email", :value=>"sdsdfsdf"} given)

1 个答案:

答案 0 :(得分:2)

在错误消息中,已翻译的model名称,已翻译的attribute名称和value始终可用于插值。

正如您在异常消息中所看到的那样:

  

缺少插值参数:“%{email}中的电子邮件不是有效的电子邮件”( {:model =&gt;“注册”,:attribute =&gt;“电子邮件”,:value =&gt;“sdsdfsdf “} 给定)

因此,您需要使用%{value}在错误消息中获取实际值"sdsdfsdf"

email_address: "%{value} is not a valid email"

这将显示:Email sdsdfsdf is not a valid email。但是,如果您想要更改所有错误消息的格式,可以在本地化的errors.format键下进行:

en:
  errors:
    # The default format to use in full error messages. "%{attribute} %{message}"
    format: "%{message}"