自定义错误消息,用于有效数字的轨道

Omn*_*ent 9 validation ruby-on-rails

我想为我的字段名称提供自定义错误消息.我偶然发现了另一个问题

所以我添加了这样的东西:

class Product < ActiveRecord::Base
  validate do |prod|
    prod.errors.add_to_base("Product price can't be blank") if prod.prod_price.blank?
  end
end
Run Code Online (Sandbox Code Playgroud)

但我也想检查prod_price的数字.如果我只是添加 validate_numericality_of :prod_price并且产品价格为空,则两个错误消息都会显示(空且不是数字).

如果产品价格不为空,我怎么才能显示'不是数字'错误消息?

我试过了

class Product < ActiveRecord::Base
  validate do |prod|
    prod.errors.add_to_base("Product price can't be blank") if prod.prod_price.blank?
    if !prod.prod_price.blank?
       prod.errors.add_to_base("Product price must be a number") if prod.prod_price.<whatdo i put here>
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

另外,如何为"不是数字"提供自定义消息.我想隐藏向用户显示我的列名.

duk*_*ave 6

目前接受的答案的作品,但这里有一个数据驱动的方式使用Rails的国际化做到这一点:

添加allow_blank: truevalidates_numericality_of会照顾空的问题。

然后,您可以使用i18n自动为您转换属性名称(此处为docs )。为prod_price您将添加到en.yml

en:
  activerecord:
    attributes:
      product:
        prod_price: "Product price"
Run Code Online (Sandbox Code Playgroud)

现在因为必须是数字部分,我们可以再次使用i18n。从文档

Active Record验证错误消息也可以轻松转换。Active Record为您提供了几个命名空间,您可以在其中放置消息翻译,以便为某些模型,属性和/或验证提供不同的消息和翻译。

有这些空间中的一个方便的表在这里,在这里你可以看到消息numericality validataion是not_a_number

因此,现在我们可以将其添加到en.yml

en:
  activerecord:
    errors:
      models:
        product:
          attributes:
            prod_price:
              not_a_number: "must be a number"
Run Code Online (Sandbox Code Playgroud)

现在,当验证失败时,它将把两者串联起来,给您:产品价格必须是数字


zet*_*tic 5

您可以拥有自定义消息,而无需编写自己的验证方法.只需添加:message:

validates_presence_of :prod_price, :message => "Product price can't be blank"

如果要在prod_price不存在时跳过数值验证,请添加:allow_nil:

validates_presence_of :prod_price, :message => "Product price can't be blank" validates_numericality_of :prod_price, :allow_nil => true

然后,数字检查将在prod_price缺失时运行.

编辑:

等等,你不希望字段名出现在错误信息中,对吗?我错过了.所以你毕竟需要自定义验证.

编辑#2:

好的,那么:

protected

def validate
  if prod_price.blank?
    errors.add "Product price can't be blank"
  else
    begin
      Integer(attributes_before_type_cast["prod_price"])
    rescue ArgumentError  
      errors.add "Product price must be a number"
    end
   end
end
Run Code Online (Sandbox Code Playgroud)