Добавить скидку на подписку 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.


person Jonah    schedule 07.02.2014    source источник


Ответы (1)


автор жемчужины здесь.

К сожалению, на данный момент ни BraintreeRails, ни ruby ​​gem Braintree не поддерживают стиль subscription.discounts << discount добавления скидок к подпискам.

Как видно из документа Braintree ruby, 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"]
  }
)
person Lin Yang    schedule 08.02.2014