模板丢失 - >对于PUT请求

时间:2012-10-06 15:44:38

标签: ruby-on-rails ruby coffeescript

我能够使用Ryan Bates的教程整合条纹。现在,我希望能够允许用户更新他们的信用卡信息。我在change_plan_path中设置了一个表单,它向用户/ update_card发送A PUT请求。但是,当我单击更新信用卡按钮时,我收到错误:

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'

这是我正在使用的Stripe Coffescript。它似乎还没有工作,但也许它与它有关。 (以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) 

1 个答案:

答案 0 :(得分:1)

通常当你收到此错误时,它是在执行控制器操作并且它正在尝试将某些内容呈现给浏览器之后。除非您明确告诉它要呈现什么,否则它将尝试根据控制器/操作提供视图。在不知道您的控制器是什么样的情况下,很难确切地说明在更新信息后您将要发生什么。我希望您要么重定向到新页面,要么渲染页面。

如果要重定向,可以使用redirect_to并指定路径。在以下示例中,我假设您要重定向到用户show动作:

redirect_to user_url(current_user)

如果要渲染某些内容,则需要为update_card.html.erb创建一个html模板,或者渲染一些任意内容,如:

render :text => "yay"