Добавить скидку на подписку 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"]
  }
)
Другие вопросы по тегам