【问题标题】:How to add custom validation message on field name without field name as a prefix?如何在没有字段名称作为前缀的字段名称上添加自定义验证消息?
【发布时间】:2019-06-24 18:26:36
【问题描述】:

我正在使用

validates_presence_of :name, :message => "promo code required"

它给了

Name promo code required

我只想要

promo code required

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

您可以编写自定义验证,并将错误消息作为一个整体添加到记录中,而不是添加特定属性,如下所示:

validate :name_is_present

private

# Making this private is optional, but recommended
def name_is_present
  errors.add(:base, "Promo code required") if name.blank?
end

更多详情请参考Ruby guides here中的说明

【讨论】:

    【解决方案2】:

    您可以为此创建自定义验证方法。

    validate :promo_require
    
    def promo_require
      errors.add(:base, 'promo code required') unless name.present?
    end
    

    【讨论】:

      【解决方案3】:

      您还可以为每个属性定义“人性化”名称,如下所示:

        def self.human_attribute_name(attribute, options={})
          case attribute
          when :name, "name"
             ""
          else
           super
          end
        end
      

      【讨论】:

      • 即使这样也行,但它并不好,因为它会影响其他功能并让其他人感到困惑(包括你在未来:D。)
      • 我明白你在说什么,但如果你查看 rails 源代码,它只用于支持I18n。我说选择你的毒药,但我更愿意这样做,而不是像接受的答案那样重新实现所有验证器。 rails 源代码中还有另一个选项,使用 en.yml 文件而不是方法。见github.com/rails/rails/blob/main/activerecord/lib/active_record/…
      • 我想到了第三种方法。您可以在自定义验证方法中单独调用验证器。像这样:ActiveModel::Validations::PresenceValidator.new({attributes: [:base]}).validate_each(record, :base, record.name)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2011-02-01
      • 2016-03-18
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      相关资源
      最近更新 更多