无法获得参数的确切值

时间:2016-03-17 07:40:49

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 activerecord

我有以下示例参数:

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

而不是:

  1. price = 12,333.00
  2. price = 111,111.00
  3. 我明白了:

    1. price = 12.00
    2. price = 11.00
    3. 现在这就是我在代码中所做的:

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

3 个答案:

答案 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_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

答案 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。

但我曾预料到会抛出错误。

我建议您在将逗号放入数据库之前将其删除。