[英]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.