Добавить скидку на подписку Braintree Rails
Я пытаюсь добавить объект скидки в подписку с помощью драгоценного камня braintree-rails, но он не применяется. Я предполагаю, что мой код должен быть неправильным, но я не могу найти работающий пример.
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: я также выполнил прямой запрос Braintree к API с запросом, ожидаемым из приведенного выше кода, и он сработал. Что-то не так происходит между настройкой и сохранением.
Обновление 3: обходной путь возможен путем извлечения атрибутов BraintreeRails::Subscription
объект, используя Braintree::Subscription
вызвать API, и используя BraintreeRails::Subscription.find
загрузить его обратно в объект. Это, безусловно, не оптимально, так как он не очень чистый и требует дополнительного вызова API.
1 ответ
Gem Автор здесь.
К сожалению, ни BraintreeRails, ни рубиновый драгоценный камень Braintree не поддерживают 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"]
}
)