【问题标题】:Rails 3 custom formatted validation errors?Rails 3自定义格式验证错误?
【发布时间】: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


    【解决方案1】:

    :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
    

    【讨论】:

      【解决方案2】:

      为此使用国际化可能是您最好的选择。来看看

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

      特别是本节:

      5.1.2 错误信息插值

      翻译后的型号名称,翻译后的 属性名称和值总是 可用于插值。

      因此,例如,而不是 默认错误信息“不能 空白”您可以使用该属性 名称如下:“请填写您的 %{属性}"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-20
        • 1970-01-01
        • 2013-12-26
        • 2016-05-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多