Я пытаюсь обновить информацию о кредитной карте пользователя и планы с помощью платежного камня Payola.Чего я не знаю, так это если мой подход правильный.Я передаю параметры [: stripeToken] в метод вызова UpdateCard, а затем перенаправляю пользователя обратно на страницу редактирования.Я пока не вижу подходящего примера для этого, и мне просто нужно убедиться, что он сохранит изменения в Stripe и вернется к модели пользовательской подписки.Как правильно изменить кредитную карту и план пользователя ??
Я написал метод user_change_credit_card, который находит owner_id, а затем пытается сохранить stripeToken в метод UpdateCard.call (), когда форма POST включена.метод блок.Я также создал метод user_change_plan, который ищет план current_user и обновляет запись перед передачей данных в метод Payola :: ChangeSubscriptionPlan.call ()
rout.rb
devise_scope :user do
post 'user_change_plan', to: 'users/registrations#user_change_plan'
post 'user_change_credit_card', to: 'users/registrations#user_change_credit_card'
authenticated do
root to: 'dashboard#index', as: 'authenticated_user_root'
end
unauthenticated do
root to: 'home#index', as: 'unauthenticated_user_root'
end
end
users \ registrations_controller.rb
def user_change_plan
plan = Plan.find_by!(id: params[:user][:plan_id].to_i)
unless plan == current_user.plan
role = User.roles[plan.stripe_id]
if current_user.update_attributes!(plan: plan, role: role)
subscription = Payola::Subscription.find_by!(owner_id: current_user.id)
Payola::ChangeSubscriptionPlan.call(subscription, plan)
redirect_to edit_user_registration_path, notice: 'Plan changed.'
else
flash[:alert] = 'Unable to change plan.'
build_resource
render :edit
end
end
end
users \ registrations_controller.rb
def user_change_credit_card
@subscription = Payola::Subscription.find_by!(owner_id: current_user.id)
if @subscription.save
Payola::UpdateCard.call(@subscription, params[:stripeToken])
redirect_to edit_user_registration_path, notice: 'Your Credit Card Was Successfully Updated.'
else
build_resource
redirect_to edit_user_registration_path, notice: "There was an error, please check for mistakes with your card information"
end
end
users \registrations \ edit.html.erb
<%= form_for(resource, :as => resource_name, :url => user_change_plan_path, :html => {:method => :post,
:class => 'payola-onestep-subscription-form',
'data-payola-base-path' => payola_path,
'data-payola-plan-type' => resource.plan.plan_class,
'data-payola-plan-id' => resource.plan.id}) do |f| %>
<div class="form-group">
<div class="col-md-8">
<span id="error_explanation" class="payola-payment-error"></span>
</div>
</div>
<div class="form-group">
<div class="col-md-6">
<strong><%= f.label 'Subscription plan' %></strong>
</div>
</div>
<div class="form-group">
<div class="col-md-9">
<%= f.collection_select(:plan_id, Plan.user_plan, :id, :name, {}, {:class => 'form-control'}) %>
</div>
</div>
<div class="form-group">
<div class="col-md-6">
<%= f.submit 'Change Plan', :class => 'bttn-simple bttn-md bttn-warning', data: {disable_with: false} %>
</div>
</div>
<% end %>
<%= form_for resource, as: resource_name, subscription: @subscription, :url => user_change_credit_card_path, :html => {:method => :post,
:class => 'payola-onestep-subscription-form',
'data-payola-base-path' => payola_path,
'data-payola-plan-type' => resource.plan.plan_class,
'data-payola-plan-id' => resource.plan.id} do |f| %>
<div class="form-group">
<div class="col-md-8">
<span id="error_explanation" class="payola-payment-error"></span>
</div>
</div>
<div class="form-group">
<div class="col-md-7">
<strong><%= f.label 'Credit Card' %></strong>
</div>
</div>
<div class="form-group">
<div class="col-md-6">
<label><i class="far fa-credit-card"></i> Credit Card Number</label>
</div>
<div class="col-md-7">
<div class="field card" style="border-radius: 0.25rem 0.25rem 0 0;">
<%= text_field :card_number, nil, name: nil, class: 'form-control', data: {stripe: 'number'}, maxlength: 20 %>
<span class="card_icon"></span>
<p class="status" style="display: block;">
<span class="status_icon"></span>
<span class="status_message"></span>
</p>
</div>
</div>
</div>
<div class="form-row">
<div class="form-group col-md-4">
<label>CVC</label>
<%= text_field :card_code, nil, name: nil, class: 'form-control', data: {stripe: 'cvc'}, placeholder: '000', maxlength: 3 %>
</div>
<br/>
<div class="form-group col-md-4">
<label>Card Expiration</label>
<%= select_month nil, {use_two_digit_numbers: true}, {name: nil, data: {stripe: 'exp_month'}, class: 'form-control'} %>
<%= select_year nil, {start_year: Date.today.year, end_year: Date.today.year + 15}, {name: nil, data: {stripe: 'exp_year'}, class: 'form-control'} %>
</div>
</div>
<div class="form-group">
<div class="col-md-7">
<%= f.submit 'Update Credit Card', :class => 'bttn-simple bttn-md bttn-success', data: {disable_with: false} %>
</div>
</div>
<% end %>
Ожидаемые результаты : Форма user_change_plan / user_change_credit_card будет сохранена, и запись будет обновляться как для модели пользователя, так и для полосы удаленно.
Фактические результаты : невозможно определить, сохранились ли изменения в Stripe