【发布时间】:2011-08-30 12:01:41
【问题描述】:
使用此模型:
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},从而覆盖Rails 默认使用的%{attribute} %{message} 版本。这会导致异常:
SubscriptionsController#create 中的 I18n::MissingInterpolationArgument
“%{message}”中缺少插值参数({:model=>"Subscription", :attribute=>"Email", :value=>""} given
但如果我使用插值字符串%{attribute},它不会出错,它只是两次吐出人性化的属性名称。
有人有这方面的经验吗?我总是可以先拥有属性名称,但我们通常需要一些其他字符串(营销人员总是让事情变得更复杂!)。
【问题讨论】:
标签: ruby-on-rails validation activemodel