无法获得参数的确切值

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 的确切值。

而不是:

  1. 价格 = 12,333.00
  2. 价格 = 111,111.00

我得到:

  1. 价格 = 12.00
  2. 价格 = 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_33312333 是相同的整数(忽略下划线)。您也可以使用 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.

组成的