簡體   English   中英

自定義錯誤消息,用於有效數字的軌道

[英]custom error message for valid numericality of in 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

但我也想檢查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

另外,如何為“不是數字”提供自定義消息。 我想隱藏向用戶顯示我的列名。

目前接受的答案有效,但這是使用Rails的i18n進行數據驅動的方式:

allow_blank: true添加到validates_numericality_of將處理空問題。

然后,您可以使用i18n為您自動翻譯屬性名稱( 此處為docs)。 對於prod_price您只需將其添加到en.yml

en:
  activerecord:
    attributes:
      product:
        prod_price: "Product price"

現在必須是數字部分,我們可以再次使用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"

現在當驗證失敗時,它會連接兩者,給你: 產品價格必須是一個數字

您可以擁有自定義消息,而無需編寫自己的驗證方法。 只需添加: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

由於很多原因,除非您需要做一些不尋常的事情,否則您應該將錯誤消息附加到特定字段(更容易進行單元測試,以后更容易修改錯誤,如果需要,可以在無效字段旁邊顯示標記等) )。 我想你想做的事情可以用這個完成:

class Product < ActiveRecord::Base
  validates_numericality_of :name, :if => lambda{ |obj| obj.prod_price? }
  validates_presence_of :name
end

我從另一個SO問題中采用了這種方法

class User < ActiveRecord::Base

  HUMANIZED_ATTRIBUTES = {
    :email => "E-mail address"
  }

  def self.human_attribute_name(attr)
    HUMANIZED_ATTRIBUTES[attr.to_sym] || super
  end

end

這樣我就不必為每個字段編寫自定義消息。 我只是更改呈現給用戶的fild名稱

if prod.prod_price.blank?
  prod.errors.add_to_base("Product price can't be blank") 
elsif prod.prod_price.match(/[^\d]/)
  prod.errors.add_to_base("Product price must be a number")
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM