将散列传递给#new会得到值数组,而不是正确的值

时间:2018-07-24 20:50:54

标签: ruby

使用最小设置时,

 def test_id
    i = Item.new({
      :id          => 1,
      :name        => "Pencil",
      :description => "You can use it to write things",
      :unit_price  => BigDecimal.new(10.99,4),
      :created_at  => Time.now,
      :updated_at  => Time.now,
      :merchant_id => 2
                    })
    assert_equal 1, i.id  
end

由于某种原因,在创建时,调用id属性会导致包含所有值的数组: [1,'Pencil','You can use it to write things',#<BigDecimal...>, 2018-07-24 14:43:36 -0600, 2018-07-24 14:43:36 -0600, 2]

而不是整数1

在项目文件中,看起来像您期望的

require 'bigdecimal'
require 'time'

    class Item
      attr_reader :id, :created_at, :merchant_id
      attr_accessor :name, :description, :unit_price, :updated_at

      def initialize(item_data)
        @id =           item_data[:id].to_i,
        @name =         item_data[:name],
        @description =  item_data[:description],
        @unit_price =   BigDecimal.new(item_data[:unit_price], 4),
        @created_at =   item_data[:created_at],
        @updated_at =   item_data[:updated_at],
        @merchant_id =  item_data[:merchant_id].to_i
      end
    end

不太确定这是怎么回事。

在断言之前将pry放入测试方法并调用i会导致

#<Item:0x00007f8cc48eb4f0
 @created_at=2018-07-24 15:14:55 -0600,
 @description="You can use it to write things",
 @id=[1, "Pencil", "You can use it to write things", #<BigDecimal:7f8cc48eb4c8,'0.1099E2',18(27)>, 2018-07-24 15:14:55 -0600, 2018-07-24 15:14:55 -0600, 2],
 @merchant_id=2,
 @name="Pencil",
 @unit_price=#<BigDecimal:7f8cc48eb4c8,'0.1099E2',18(27)>,
 @updated_at=2018-07-24 15:14:55 -0600>

在终端中。

2 个答案:

答案 0 :(得分:2)

这是初始化程序中的尾随逗号:

def initialize(item_data)
  @id =           item_data[:id].to_i, # <=
  @name =         item_data[:name],    # <=

他们所做的是让红宝石看到这样的方法:

 @id = [item_data[id].to_i, @name = item_data[:name], ...]

答案 1 :(得分:1)

问题似乎出在每个设置变量末尾添加的逗号。检查以下代码:

require 'bigdecimal'
require 'time'

class Item
  attr_reader :id, :created_at, :merchant_id
  attr_accessor :name, :description, :unit_price, :updated_at

  def initialize(item_data)
    @id =           item_data[:id].to_i
    @name =         item_data[:name]
    @description =  item_data[:description]
    @unit_price =   BigDecimal.new(item_data[:unit_price], 4)
    @created_at =   item_data[:created_at]
    @updated_at =   item_data[:updated_at]
    @merchant_id =  item_data[:merchant_id].to_i
  end
end