我有以下示例参数:
Parameters: {
"utf8"=>"✓",
"authenticity_token"=>"xxxxxxxxxx",
"post" => {
"product_attributes" => {
"name"=>"Ruby",
"product_dtls_attributes" => {
"0"=>{"price"=>"12,333.00"},
"1"=>{"price"=>"111,111.00"}
},
},
"content"=>"Some contents here."
}
现在,情况是,我无法在price
中获得model
的确切值。
而不是:
我明白了:
现在这就是我在代码中所做的:
before_validation(on: :create) do
puts "price = #{self.price}" # I also tried self.price.to_s, but didn't work.
end
更新:
(我在这里尝试的是获取full value
并删除逗号。)
before_validation(on: :create) do
puts "price = #{self.price.delete(',').to_f}" # I also tried self.price.to_s, but didn't work.
end
注意:
列price
是浮动
问题是,如何获得params price
的确切值。
谢谢!
答案 0 :(得分:1)
查看您提供的“价格”参数:
"price"=>"12,333.00"
问题在于逗号。
例如:
irb(main):003:0> "12,333.00".to_i
=> 12
但你可以解决这个问题:
示例:
irb(main):011:0> "12,333.00".tr(",", "_").to_i
=> 12333
关键是用下划线替换逗号。原因是12_333
与12333
是相同的整数(忽略下划线)。您也可以删除逗号tr(",", "")
。在这种情况下,您可以将tr
替换为gsub
并具有相同的效果。
顺便提一下,您是否知道您的验证方法除打印外没有做任何其他事情?无论如何,before_validation
方法不是正确的方法,因为当代码到达这一点时,数字已经被错误地转换。相反,您可以覆盖模型上的setter:
class MyModel
def price=(new_price)
if new_price.is_a?(String)
new_price = new_price.tr(",", "")
end
super(new_price)
end
end
答案 1 :(得分:0)
你也可以这样做:
2.1.1 :002 > "12,333.00".gsub(',', '').to_f
=> 12333.0
这将替换逗号,如果您有任何小数值,那么它也会解释它:
2.1.1 :003 > "12,333.56".gsub(',', '').to_f
=> 12333.56
答案 2 :(得分:-1)
价格是浮动的,但您的数据包含非数字字符(逗号,",")。当字段转换为float时,解析可能会在此字符处停止并返回12。
但我曾预料到会抛出错误。
我建议您在将逗号放入数据库之前将其删除。