首页 文章

导轨和条纹付款

提问于
浏览
3

在设置Rails和Stripe的早期阶段遇到麻烦,我正在关注这个Railscast:http://railscasts.com/episodes/288-billing-with-stripe

尝试在提交时通过javascript(coffeescript)检测表单,但它只是提交到create操作并忽略了javascript .

这是我的coffeescript(从Railcasts借来的):

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

  subscription =
    setupForm: ->
      $('#new_subscription').submit ->
        $('input[type=submit]').attr('disabled', true)
        subscription.processCard()
        false

    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
        alert(response.id)
      else
        alert(response.error.message)

我已经生成了这样的形式,但对这一部分不太确定......

<%= form_tag accounts_path, {:id => 'new_subscription'} do %>

这创造了:

<form accept-charset="UTF-8" action="/accounts" id="new_subscription" method="post">

注意它确实有正确的ID . 我必须特别设置ID,即使在Ryan的教程中他似乎也没有 .

我出错的任何想法?

1 回答

  • 1

    我认为您应该在JavaScript控制台上查看错误 . 我想你在这里得到一个JavaScript TypeError:

    subscription.setupForm()
    

    JavaScript和CoffeeScript都会将变量声明提升到范围的顶部,但两者都不会提升定义 . 例如,这个CoffeeScript:

    pancakes.m()
    pancakes =
        m: -> console.log('pancakes')
    

    成为这个JavaScript:

    var pancakes;
    
    pancakes.m();
    
    pancakes = {
      m: function() {
        return console.log('pancakes');
      }
    };
    

    所以 pancakes 存在时,我说 pancakes.m()pancakes 仍然是 undefined ,所以它没有 m 方法,直到稍后我们给它赋值 . Demo

    将其应用于您的代码会告诉我们 subscriptionundefined 当您尝试 subscription.setupForm() 时 . 尝试按正确的顺序排列:

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

    如果你看一下Railscast代码,你会发现结构是这样的:

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

    请注意 subscription 是在 jQuery -> 函数之外定义的? jQuery -> 延迟执行,直到加载页面之后,但到那时,代码的 subscription = ... 部分已经执行, subscription 将具有非 undefined 值 .

相关问题