5

我正在尝试使用braintree-rails gem 将折扣对象添加到订阅中,但未应用。我猜我的代码一定是错误的,但我找不到一个可行的例子。

discount = BraintreeRails::Discount.find(params[:subscription_promo])
subscription = @plan.subscriptions.build permitted_params[:subscription]
subscription.discounts << discount
# ...
subscription.save

当我转储discount时,它已正确加载。订阅创建得很好,但全价。折扣不存在。如何在订阅中添加折扣?

更新:我尝试修改直接查询,但这没有帮助。

@subscription.raw_object.discounts = {add:[{inherited_from_id: discount.id}]}

更新 2:我还使用上述代码的预期请求针对 API 运行了直接 Braintree 请求,并且它有效。设置和保存之间发生了错误。

更新 3:通过提取BraintreeRails::Subscription对象的属性、使用Braintree::Subscription调用 API 并使用BraintreeRails::Subscription.find将其加载回对象,可以解决问题。但是,这绝对不是最优的,因为它不是很干净,并且需要额外的 API 调用。

4

1 回答 1

6

宝石作者在这里。

不幸的是,BraintreeRails 和 Braintree ruby​​ gem 目前都不支持subscription.discounts << discount为订阅添加折扣的样式。

正如您在Braintree ruby​​ doc中看到的那样,添加/更新/覆盖插件/折扣 API 有点过于灵活,无法包装在subscription.discounts << discount一行中。

如果您的订阅附加/折扣设置很简单并且变化不大,您可以尝试为每个所需的组合创建一个计划,然后使用正确的计划来创建订阅。

如果您的设置非常动态(在价格、计费周期、数量等方面),直接使用 Braintree API 可能是您的最佳选择。例如:

result = Braintree::Subscription.create(
  :payment_method_token => "the_payment_method_token",
  :plan_id => "the_plan_id",
  :add_ons => {
    :add => [
      {
        :inherited_from_id => "add_on_id_1",
        :amount => BigDecimal.new("20.00")
      }
    ],
    :update => [
      {
        :existing_id => "add_on_id_2",
        :quantity => 2
      }
    ],
    :remove => ["add_on_id_3"]
  },
  :discounts => {
    :add => [
      {
        :inherited_from_id => "discount_id_1",
        :amount => BigDecimal.new("15.00")
      }
    ],
    :update => [
      {
        :existing_id => "discount_id_2",
        :quantity => 3
      }
    ],
    :remove => ["discount_id_3"]
  }
)
于 2014-02-08T07:14:08.520 回答