关于rails上的ruby:无法获得参数的确切值

Cannot get exact value on parameter

我有下面的示例参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
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."
        }

现在,情况是,我不能得到pricemodel中的确切值。

而不是:

  • 价格=12333.00
  • 价格=111111.00
  • 我得到:

  • 价格=12
  • 价格=11
  • 下面是我在代码中所做的:

    1
    2
    3
    before_validation(on: :create) do
      puts"price = #{self.price}" # I also tried self.price.to_s, but didn't work.
    end

    更新:

    (我想做的是把full value去掉逗号)。

    1
    2
    3
    before_validation(on: :create) do
      puts"price = #{self.price.delete(',').to_f}" # I also tried self.price.to_s, but didn't work.
    end

    注:

    EDOCX1[0]列为浮动列

    问题是,我如何才能得到参数price的精确值。谢谢!


    查看您提供的"价格"参数:

    "price"=>"12,333.00"

    逗号有问题。

    例如:

    1
    2
    irb(main):003:0>"12,333.00".to_i
    => 12

    但你可以解决这个问题:

    例子:

    1
    2
    irb(main):011:0>"12,333.00".tr(",","_").to_i
    => 12333

    关键是用下划线替换逗号。原因是12_33312333是同一个整数(下划线被忽略)。你也可以用tr(",","")去掉逗号。在这种情况下,您可以用gsub替换tr,并具有相同的效果。

    顺便问一句,您是否知道您的验证方法除了打印之外什么都不做?无论如何,在这里,before_validation方法不是正确的方法,因为当代码到达这一点时,数字已经被错误地转换了。相反,您可以重写模型上的setter:

    1
    2
    3
    4
    5
    6
    7
    8
    class MyModel
      def price=(new_price)
        if new_price.is_a?(String)
          new_price = new_price.tr(",","")
        end
        super(new_price)
      end
    end


    我的解决方案是在控制器上处理它。迭代散列,然后保存它。然后它得到我想要得到的正确值并保存正确的值。

    迭代以下哈希并保存。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    "post" => {
             "product_attributes" => {
                 "name"=>"Ruby",
                 "product_dtls_attributes" => {
                     "0"=>{"price"=>"12,333.00"},
                     "1"=>{"price"=>"111,111.00"}
                  },
              },
         "content"=>"Some contents here."

    由于逗号分隔符的存在,我无法在模型中得到price的完整值。这个逗号分隔符和小数点+小数点由gem生成。


    你也可以这样做:

    1
    2
    2.1.1 :002 >"12,333.00".gsub(',', '').to_f
     => 12333.0

    这将替换逗号,如果您有任何十进制值,那么它也将解释为:

    1
    2
    2.1.1 :003 >"12,333.56".gsub(',', '').to_f
     => 12333.56


    价格是浮动的,但您的数据包含一个非数字字符(逗号,","。当字段转换为float时,解析可能会在该字符处停止并返回12。

    不过,我原以为会有一个错误被抛出。

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