5

Я пытаюсь добавить объект скидки к подписке с драгоценным камнем braintree-rails, но он не применяется. Я предполагаю, что мой код должен быть неправильным, но я не могу найти рабочий пример.Добавить скидку на подписку на товарный знак Braintree

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}]} 

Update 2: Я побежал прямой запрос Braintree против API с запросом ожидаемого приведенного выше кода, и это сработало. Что-то не так происходит между настройкой и сохранением.

Обновление 3: Чтобы обойти проблему можно путем извлечения атрибутов BraintreeRails::Subscription объекта, используя Braintree::Subscription для вызова API, и используя BraintreeRails::Subscription.find, чтобы загрузить его обратно в объект. Это определенно не оптимально, хотя, поскольку он не очень чистый и требует дополнительного вызова API.

ответ

6

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

К сожалению, ни BraintreeRails, ни рубиновый драгоценный камень Braintree не поддерживают стиль добавления скидок к подпискам на данный момент.

Как вы можете видеть в braintree ruby doc, API добавления/обновления/переопределения аддонов/скидок является слишком гибким, чтобы быть обернутым в одну строку subscription.discounts << discount.

Если ваша настройка аддона/скидки для подписки проста и не сильно отличается, вы можете попробовать создать один план для каждой желаемой комбинации, а затем использовать правильный план для создания подписки.

Если ваша установка довольно динамична (с точки зрения цены, биллингового цикла, количества и т. Д.), Используйте API-интерфейс Braintree напрямую, вероятно, ваш лучший вариант. Например:

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"] 
    } 
) 
Смежные вопросы