使用这个模型:
validates_presence_of :email, :message => "We need your email address"
作为一个相当人为的例子。错误发生在:
Email We need your email address
我如何自己提供格式?
我查看了ActiveModel::Errors#full_messages
的源代码并执行了此操作:
def full_messages
full_messages = []
each do |attribute, messages|
messages = Array.wrap(messages)
next if messages.empty?
if attribute == :base
messages.each {|m| full_messages << m }
else
attr_name = attribute.to_s.gsub('.', '_').humanize
attr_name = @base.class.human_attribute_name(attribute, :default => attr_name)
options = { :default => "%{attribute} %{message}", :attribute => attr_name }
messages.each do |m|
full_messages << I18n.t(:"errors.format", options.merge(:message => m))
end
end
end
full_messages
end
注意选项中的:default
格式字符串?所以我试过了:
validates_presence_of :email, :message => "We need your email address", :default => "something"
但是错误信息实际上显示为:
Email something
然后我尝试包含插值字符串%{message}
,因此默认情况下会覆盖%{attribute} %{message}
版本的Rails使用。这会导致异常:
I18n :: SubscriptionsController #create中的MissingInterpolationArgument
“%{message}”中缺少插值参数({:model =&gt;“订阅”,:attribute =&gt;“电子邮件”,:value =&gt;“”}给出
然而,如果我使用插值字符串%{attribute}
,它不会出错,它只会吐出两次人性化的属性名称。
任何人都有这方面的经验吗?我可以永远拥有属性名称,但通常我们需要一些其他字符串(营销人员总是让事情变得更复杂!)。
答案 0 :(得分:6)
:base
上的错误并非特定于任何属性,因此人性化的属性名称不会附加到消息中。这允许我们添加有关电子邮件的错误消息,但不将它们附加到电子邮件属性,并获得预期的结果:
class User < ActiveRecord::Base
validate :email_with_custom_message
...
private
def email_with_custom_message
errors.add(:base, "We need your email address") if
email.blank?
end
end
答案 1 :(得分:4)
使用国际化可能是您最好的选择。看看
http://guides.rubyonrails.org/i18n.html#translations-for-active-record-models
特别是这一部分:
5.1.2错误消息插值
已翻译的型号名称已翻译 属性名称和值始终是 可用于插值。
所以,例如,而不是 默认错误消息“不能 空白“你可以使用该属性 这样的名字:“请填写你的 %{属性}“