无法获得参数的确切值
Cannot get exact value on parameter
我有以下示例参数:
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."
}
现在的情况是,我无法在 model
中获得 price
的确切值。
而不是:
- 价格 = 12,333.00
- 价格 = 111,111.00
我得到:
- 价格 = 12.00
- 价格 = 11.00
现在这是我在代码中所做的:
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
列是浮点数
问题是,我怎样才能得到参数的准确值price
。
谢谢!
价格是浮动的,但您的数据包含非数字字符(逗号、“,”)。当该字段转换为浮点数时,解析可能会在此字符处停止,而 returns 只是 12.
虽然我预料到会抛出一个错误。
我建议您在将其放入数据库之前删除逗号。
查看您提供的 'price' 参数:
"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
你也可以这样做:
2.1.1 :002 > "12,333.00".gsub(',', '').to_f
=> 12333.0
这将替换逗号,如果您有任何十进制值,那么它也会将其解释为:
2.1.1 :003 > "12,333.56".gsub(',', '').to_f
=> 12333.56
我做的解决方案是在controller上处理。迭代哈希然后保存它。然后它得到我想要得到的正确值并保存正确的值。
迭代以下哈希并保存。
"post" => {
"product_attributes" => {
"name"=>"Ruby",
"product_dtls_attributes" => {
"0"=>{"price"=>"12,333.00"},
"1"=>{"price"=>"111,111.00"}
},
},
"content"=>"Some contents here."
由于逗号分隔符,我无法在模型中获取 price
的完整值。这个逗号分隔符和小数点+小数位是由gem.
组成的
我有以下示例参数:
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."
}
现在的情况是,我无法在 model
中获得 price
的确切值。
而不是:
- 价格 = 12,333.00
- 价格 = 111,111.00
我得到:
- 价格 = 12.00
- 价格 = 11.00
现在这是我在代码中所做的:
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
列是浮点数
问题是,我怎样才能得到参数的准确值price
。
谢谢!
价格是浮动的,但您的数据包含非数字字符(逗号、“,”)。当该字段转换为浮点数时,解析可能会在此字符处停止,而 returns 只是 12.
虽然我预料到会抛出一个错误。
我建议您在将其放入数据库之前删除逗号。
查看您提供的 'price' 参数:
"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
你也可以这样做:
2.1.1 :002 > "12,333.00".gsub(',', '').to_f
=> 12333.0
这将替换逗号,如果您有任何十进制值,那么它也会将其解释为:
2.1.1 :003 > "12,333.56".gsub(',', '').to_f
=> 12333.56
我做的解决方案是在controller上处理。迭代哈希然后保存它。然后它得到我想要得到的正确值并保存正确的值。
迭代以下哈希并保存。
"post" => {
"product_attributes" => {
"name"=>"Ruby",
"product_dtls_attributes" => {
"0"=>{"price"=>"12,333.00"},
"1"=>{"price"=>"111,111.00"}
},
},
"content"=>"Some contents here."
由于逗号分隔符,我无法在模型中获取 price
的完整值。这个逗号分隔符和小数点+小数位是由gem.