的原因,當你想到的是,當傳遞一個字符串BigDecimal的底層Ruby實現沒有錯誤,這並不工作。
考慮下面的代碼
[ 'This is a string', '2is a string', '2.3 is also a string',
' -3.3 is also a string'].each { |d| puts "#{d} = #{BigDecimal.new(d)}" }
This is a string = 0.0
2is a string = 2.0
2.3 is also a string = 2.3
-3.3 is also a string = -3.3
所以BigDecimal的掃描線,並在這可能是一個小數其價值字符串的開頭指定任何東西。
如果你設置你的模型像這樣
class Dummy < ActiveRecord::Base
validates_numericality_of :the_dummy_number
end
然後驗證應罰款
>> d=Dummy.new(:the_dummy_number => 'This is a string')
=> #<Dummy id: nil, the_dummy_number: #<BigDecimal:5b9230,'0.0',4(4)>, created_at: nil, updated_at: nil>
>> puts d.the_dummy_number
0.0
=> nil
>> d.valid?
=> false
>> d.errors
=> #<ActiveRecord::Errors:0x5af6b8 @errors=#<OrderedHash
{"the_dummy_number"=>[#<ActiveRecord::Error:0x5ae114
@message=:not_a_number, @options={:value=>"This is a string"}
這工作,因爲validates_numericality_of宏使用RAW_VALUE方法的價值得到它之前類型轉換並分配給內部十進制值。
你使用什麼驗證方法?如果您使用'validates_numericality_of:the_dummy_number',它應該可以正常工作 – 2010-07-27 09:22:14
檢查更新 – ZX12R 2010-07-27 09:27:52
您的驗證方法不會進行任何驗證! – 2010-07-27 09:51:38