3

このモデルでは:

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回吐き出されます。

誰でもこれについて経験がありますか?いつでも最初に属性名を付けることができますが、他の文字列が必要になることがよくあります (マーケティング担当者は常に物事をより複雑にします!)。

4

2 に答える 2

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
于 2011-05-22T09:02:11.867 に答える
4

これにはおそらく国際化を使用するのが最善の策です。を見てみましょう

http://guides.rubyonrails.org/i18n.html#translations-for-active-record-models

特にこのセクション:

5.1.2 エラーメッセージの補間

翻訳されたモデル名、翻訳された属性名、および値は、常に補間に使用できます。

たとえば、デフォルトのエラー メッセージ「can not be blank」の代わりに、「Please fill in your %{attribute}」のような属性名を使用できます。

于 2011-05-22T09:04:47.087 に答える