我正在尝试使用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运行了针对API的直接Braintree请求以及上述代码所需的请求,并且它有效。在设置和保存之间发生了一些错误。
更新3 :可以通过提取BraintreeRails::Subscription
对象的属性,使用Braintree::Subscription
调用API并使用BraintreeRails::Subscription.find
加载来解决此问题它回到了对象中。但这绝对不是最佳选择,因为它不是很干净,需要额外的API调用。
答案 0 :(得分:6)
宝石作者。
不幸的是,BraintreeRails和Braintree ruby gem都不支持subscription.discounts << discount
样式,即在订阅时添加折扣。
正如您在braintree ruby doc中所看到的,添加/更新/覆盖插件/折扣API有点过于灵活,无法包含在单个subscription.discounts << discount
行中。
如果您对订阅的插件/折扣的设置很简单并且变化不大,您可以尝试为每个所需组合创建一个计划,然后使用正确的计划来创建订阅。
如果您的设置非常动态(在价格,结算周期,数量等方面),直接使用Braintree API可能是您的最佳选择。 E.g:
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"]
}
)