如何在ruby函数中创建一个可以作为参数传递给另一个函数的哈希?

时间:2013-07-13 19:39:44

标签: ruby-on-rails ruby-on-rails-3.2 stripe-payments

Ruby Stripe

我正在尝试与Ruby Stripe库进行交互,特别是如下所述的subscription_update函数:https://stripe.com/docs/api#update_subscription

语法如下:

c = Stripe::Customer.retrieve("cus_2BWdBuTAE3HboP")
c.update_subscription(:plan => "basic", :prorate => true)

实施Rails模型

我正在实现一个可以与ruby库连接的rails模型。由于这个api将使用nil值更新我的订阅(这将超过默认值),我需要一个函数来抓取可写属性并创建一个只包含我可以传递给此update_subscription函数的nil属性的数组。

这就是我现在所拥有的:

  def get_non_nil_update_attributes
    attributes = Array.new([ :plan, :trial_end, :quantity, :coupon, :prorate ])
    return_attributes = {}

    attributes.each do |attribute|
      if !self.send( attribute ).nil?
        return_attributes[attribute] = self.send( attribute)
      end
    end

    return return_attributes
  end

我想称之为:

c.update_subscription( mymodel.get_non_nil_update_attributes )

但是我得到一个错误,我没有通过计划参数。在控制台我输出如果此功能是:

[{:plan=>"7"}, {:trial_end=>"bla"}]

我知道这是一个简单的红宝石问题,但我如何才能完成此输出 :plan => "7", :trial_end => "bla"传递给我的函数?

1 个答案:

答案 0 :(得分:0)

get_non_nil_update_attributes无法返回您帖子中存在的数组,因此还会发生其他事情。

顺便说一下,你可以简单地简化这个方法:

def get_non_nil_attributes(attributes = [:plan, :trial_end, :quantity, :coupon, :prorate])
  all_attributes = Hash[*attributes.zip(attributes.map {|a| send a})]
  all_attributes.select {|k, v| v.present? }
end