我是Ruby on Rails的新手。 我试图验证其中一个属性的格式,只输入float。
validates :price, :format => { :with => /^[0-9]{1,5}((\.[0-9]{1,5})?)$/, :message => "should be float" }
但是当我只在价格中输入字符时,它接受它并显示价格的0.0值。 任何人都可以告诉,这有什么问题或者为什么会这样?
答案 0 :(得分:10)
这是我的解决方案,
validates :price,presence:true, numericality: {only_float: true}
当您填写示例7时,它会自动将值传输到7.0
答案 1 :(得分:3)
对于rails 3:
validates :price, :format => { :with => /^\d+??(?:\.\d{0,2})?$/ },
:numericality =>{:greater_than => 0}
答案 2 :(得分:0)
float是一个数字,正则表达式是字符串。
当您为浮点数输入字符串时,Rails会自动将其转换为0.0。
列上有默认值(0.0)吗?如果是,那么您可以尝试删除它并仅使用validates_presence_of :price
。
要尝试的内容:不要将字符串直接放入price
列,而是将其放入price_string
attr并使用before_save
回调尝试将字符串转换为价格。这样的事情:
attr_accessor :price_string
before_save :convert_price_string
protected
def convert_price_string
if price_string
begin
self.price = Kernel.Float(price_string)
rescue ArgumentError, TypeError
errors.add(ActiveRecord::Errors.default_error_messages[:not_a_number])
end
end
在表单中,将text_field的名称更改为:price_string
。