このモデルでは:
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
そこで、補間文字列を含めてみたので、 Rails がデフォルトで使用するバージョン%{message}
をオーバーライドしました。%{attribute} %{message}
これにより例外が発生します。
I18n::SubscriptionsController の MissingInterpolationArgument#create
"%{message}" に補間引数がありません ({:model=>"Subscription", :attribute="Email", :value=""} が指定されました)
それでも、補間文字列を使用すると、%{attribute}
エラーは発生せず、人間化された属性名が2回吐き出されます。
誰でもこれについて経験がありますか?いつでも最初に属性名を付けることができますが、他の文字列が必要になることがよくあります (マーケティング担当者は常に物事をより複雑にします!)。