2014-01-25 2 views
0

У меня есть рабочая модель подписки, которая позволяет мне успешно регистрировать людей как платящих членов. Я пытаюсь написать «редактировать страницу», которая позволяет мне сделать следующееДобавление новой карты и удаление карт не работает Stripe

  • добавить новую кредитную карту
  • удалить карту (которая отменяет подписку)
  • изменить план оплаты на другие

в настоящее время моя страница существует в/подписаться/редактировать с помощью следующего кода

<%= form_tag do %> 
    <span class="payment-errors"></span> 


    <div class="form-row"> 
    <label> 
     <span>Card Number</span> 
     <input type="text" size="20" data-stripe="number"/> 
    </label> 
    </div> 

    <div class="form-row"> 
    <label> 
     <span>CVC</span> 
     <input type="text" size="4" data-stripe="cvc"/> 
    </label> 
    </div> 

    <div class="form-row"> 
    <label> 
     <span>Expiration (MM/YYYY)</span> 
     <input type="text" size="2" data-stripe="exp-month"/> 
    </label> 
    <span>/</span> 
    <input type="text" size="4" data-stripe="exp-year"/> 
    </div> 

    <%= button_to "Add a New Card", :method => "updateSubscription" %> 

<!-- <%= select_tag "type", options_for_select([['Subscriber' ,'Subscriber'], ['Sustainer', 'Sustainer']]) %> 

    <%= button_to "Change Subscription", :method => "changeSubscription" %> --> 

    <%= link_to "Delete Card and Subscription", :method => "deleteCard" , :confirm => "You sure?" %> 
<% end %> 

<script type="text/javascript" src="https://js.stripe.com/v2/"></script> 

<script type="text/javascript"> 

    <!-- CURRENTLY USING TEST KEY --> 
    Stripe.setPublishableKey("TESTKEY"); 

    jQuery(function($) { 
    $('#payment-form').submit(function(event) { 
     var $form = $(this); 

     // Disable the submit button to prevent repeated clicks 
     $form.find('button').prop('disabled', true); 

     Stripe.card.createToken($form, stripeResponseHandler); 

     // Prevent the form from submitting with the default action 
     return false; 
    }); 
    }); 

    var stripeResponseHandler = function(status, response) { 
    var $form = $('#payment-form'); 

    if (response.error) { 
     // Show the errors on the form 
    $form.find('.payment-errors').text(response.error.message); 
    $form.find('button').prop('disabled', false); 
    } else { 
    // token contains id, last4, and card type 
    var token = response.id; 
    // Insert the token into the form so it gets submitted to the server 
    $form.append($('<input type="hidden" name="stripeToken" />').val(token)); 
    // and submit 
    $form.get(0).submit(); 
    } 
}; 
</script> 

Вот мой роу tes.rb

get 'subscribe' => 'subscribe#stepone' 
    get 'subscribe/sliding-scale' => 'subscribe#steptwo' 
    get 'subscribe/sliding-scale/subscriber' => 'subscribe#subscriber' 
    get 'subscribe/sliding-scale/supporter' => 'subscribe#supporter' 
    get 'subscribe/sliding-scale/sustainer' => 'subscribe#sustainer' 
    post 'subscribe/sliding-scale/:type' => 'subscribe#createSubscription' 
    get 'subscribe/edit' => 'subscribe#edit', :as => :edit_subscription 
    post 'subscribe/edit' 
    post 'subscribe/edit/deleteCard' 
    post 'subscribe/edit/updateSubscription' 
    post 'subscribe/edit/changeSubscription' 

и, наконец, вот мой контроллер подписки

class SubscribeController < ApplicationController 

    def stepone 
    end 

    def steptwo 
    end 

    def subscriber 
    @type = "subscriber" 
    end 

    def supporter 
    @type = "supporter" 
    end 

    def sustainer 
    @type ="sustainer" 
    end 

    def createSubscription 
    # Set your secret key: remember to change this to your live secret key in production 
    # See your keys here https://manage.stripe.com/account 

    # Get the credit card details submitted by the form 
    token = params[:stripeToken] 

    # Create a Customer 
    customer = Stripe::Customer.create(
    :card => token, 
    :plan => params[:type], 
    :email => current_user[:email] 
    ) 

    current_user[:stripeCustomerId] = customer[:id] 
    # sets role of user, we should have a check for successful signu 
    current_user.add_role params[:type] 
    current_user.save() 

    UserMailer.subscription_confirmation(current_user).deliver 

    redirect_to root_url, :notice => "Thank you for subscribing!" 


    rescue Stripe::CardError => e 
     flash[:error] = e.message 
     redirect_to root_url 
    end 

    def edit 
    @user = current_user 
    end 

    def updateSubscription 
    # Set your secret key: remember to change this to your live secret key in production 
    # See your keys here https://manage.stripe.com/account 

    # Get the credit card details submitted by the form 
    token = params[:stripeToken] 

    # Create A New Card 
    customer = Stripe::Customer.retrieve(current_user.stripeCustomerId) 
    customer.cards.create(stripeToken) 


    redirect_to root_url, :notice => "Your Card Has Been Updated!" 


    rescue Stripe::CardError => e 
     flash[:error] = e.message 
     redirect_to root_url 
    end 

    def changeSubscription 
    customer = Stripe::Customer.retrieve(@user.stripeCustomerId) 
    @user.update_subscription(:plan => :type, :prorate => true) 
    current_role = @user.roles.first.name 
    @user.remove_role current_role 
    current_user.add_role params[:type] 
    end 

    def deleteCard 
    customer = Stripe::Customer.retrieve(@user.stripeCustomerId) 
    customer.cards.retrieve(customer.default_card).delete() 
    current_role = @user.roles.first.name 
    @user.remove_role current_role 
    end 

    def currentCard 
    customer = Stripe::Customer.retrieve(@user.stripeCustomerId) 
    card = customer.cards.retrieve(customer.default_card) 
    end 

end 

В настоящее время, если я нажмите кнопку «Удалить карту» я получаю следующее в адресной строке http://localhost:3000/subscribe/edit?confirm=You+sure%3F&method=deleteCard без изменения страницы, то же самое, если я представляю новую информацию о карте.

Позвольте мне знать, что я делаю неправильно и как исправить мои ужасные пути :)

ответ

0

Опция метод link_to и button_to не означает контроллер метод.

Должно быть one of five HTTP verbs (получить, отправить, поместить, исправить или удалить), чтобы использовать для запроса при нажатии.

<%= link_to "Delete", @obj, :method => :delete , :confirm => "Sure?" %> 

Заканчивать рельсы руководства для form helpers для получения дополнительной ориентации в глубине.

Кроме того, НИКОГДА не использование button_to внутри формы, так как button_to сама по себе является формой. Спецификация HTML запрещает вложенные формы, так как это вызовет неожиданные проблемы вплоть до небольших пожаров. Чтобы отправить форму, используйте submit_tag.

Смежные вопросы