0

RyanBatesのチュートリアルを使用してストライプを統合することができました。ここで、ユーザーがクレジットカード情報を更新できるようにしたいと思います。change_plan_pathに、PUTリクエストをusers/update_cardに送信するフォームを設定しました。ただし、[クレジットカードの更新]ボタンをクリックすると、次のエラーが発生します。

Template is missing

Missing template users/update_card, application/update_card with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}. Searched in: * "C:/Sites/dentist/app/views"

これが私がPUTリクエストを送信するために使用しているフォームです:

    <%= form_tag("/users/update_card", :method => "put", :class => "edit_user", :id => "change_card" ) do %>
  <%= hidden_field_tag :stripe_card_token %>

  <div id="stripe_error" class="alert">   
      <noscript>JavaScript is not enabled and is required for this form. First enable it in your web browser settings.</noscript>
  </div>

    <div class="field">
      <%= label_tag :card_number, "Credit Card Number" %>
      <%= text_field_tag :card_number, nil, name: nil %>
    </div>
    <div class="field">
      <%= label_tag :card_code, "Security Code on Card (CVV)" %>
      <%= text_field_tag :card_code, nil, name: nil %>
    </div>
    <div class="field">
      <%= label_tag :card_month, "Card Expiration" %>
      <%= select_month nil, {add_month_numbers: true}, {name: nil, id: "card_month"} %>
      <%= select_year nil, {start_year: Date.today.year, end_year: Date.today.year+15}, {name: nil, id: "card_year"} %>
    </div>


  <%= submit_tag("Update My Credit Card", :class => "button") %>

これが私のroutes.rbファイルです:

  put '/users/update_plan',  to: 'users#update_plan'
  put '/users/update_card',  to: 'users#update_card'
  resources :users
  resources :sessions, only: [:new, :create, :destroy]
  resources :phones, only: [:new, :create, :destroy]
  resources :find_numbers, only: [:new, :create]  

  match '/signup',  to: 'users#new'
  match '/login',  to: 'sessions#new'
  match '/signout', to: 'sessions#destroy', via: :delete
  match '/change_plan',  to: 'users#change_plan'
  match '/change_card',  to: 'users#change_card'

  root  to: 'static_pages#home'

  match '/product_demo', to: 'static_pages#product_demo'

  match '/pricing', to: 'plans#index'

  match '/contact', to: 'static_pages#contact'

これが私が使用しているStripeCoffescriptです。まだ機能していないようですが、おそらくそれと関係があります。(changecard.setupForm()で開始します)

jQuery ->
  Stripe.setPublishableKey($('meta[name="stripe-key"]').attr('content'))
  subscription.setupForm()

subscription =
  setupForm: ->
    $('#new_user').submit ->
      $('input[type=submit]').attr('disabled', true)
      if $('#card_number').length
        subscription.processCard()
        false
      else
        true

  processCard: ->
    card =
      number: $('#card_number').val()
      cvc: $('#card_code').val()
      expMonth: $('#card_month').val()
      expYear: $('#card_year').val()
    Stripe.createToken(card, subscription.handleStripeResponse)

  handleStripeResponse: (status, response) ->
    if status == 200
      $('#user_stripe_card_token').val(response.id)
      $('#new_user')[0].submit()
    else
      $('#stripe_error').text(response.error.message)
      $('input[type=submit]').attr('disabled', false)

 changecard.setupForm()

changecard =
  setupForm: ->
    $('#change_card').submit ->
      $('input[type=submit]').attr('disabled', true)
      if $('#card_number').length
        subscription.processCard()
        false
      else
        true

  processCard: ->
    card =
      number: $('#card_number').val()
      cvc: $('#card_code').val()
      expMonth: $('#card_month').val()
      expYear: $('#card_year').val()
    Stripe.createToken(card, subscription.handleStripeResponse)

  handleStripeResponse: (status, response) ->
    if status == 200
      $('#user_stripe_card_token').val(response.id)
      $('#change_card')[0].submit()
    else
      $('#stripe_error').text(response.error.message)
      $('input[type=submit]').attr('disabled', false) 
4

1 に答える 1

1

通常、このエラーが発生したのは、コントローラーアクションが実行され、ブラウザーに何かをレンダリングしようとした後です。何をレンダリングするかを明示的に指定しない限り、コントローラー/アクションに基づいてビューを提供しようとします。コントローラがどのように見えるかを知らなければ、情報が更新された後に何が起こるかを正確に言うのは難しいです。新しいページにリダイレクトするか、ページをレンダリングすることをお勧めします。

リダイレクトする場合はredirect_to、パスを使用して指定できます。次の例では、ユーザーのshowアクションにリダイレクトすることを想定しています。

redirect_to user_url(current_user)

一部のコンテンツをレンダリングする場合は、update_card.html.erbのhtmlテンプレートを作成するか、次のような任意のコンテンツをレンダリングする必要があります。

render :text => "yay"
于 2012-10-06T16:06:16.207 に答える