在设置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的教程中他似乎也没有。
我出错的任何想法?
答案 0 :(得分: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
,因此它直到我们分配时才会有subscription
方法它是一个价值。 Demo
将其应用于您的代码会在您尝试undefined
时告诉我们subscription.setupForm()
为jQuery ->
Stripe.setPublishableKey($('meta[name="stripe-key"]').attr('content'))
subscription = ...
subscription.setupForm()
。尝试按正确顺序排列:
jQuery ->
Stripe.setPublishableKey($('meta[name="stripe-key"]').attr('content'))
subscription.setupForm()
subscription = #...
如果你查看Railscast代码,你会发现结构是这样的:
subscription
请注意,jQuery ->
是在jQuery ->
函数之外定义的吗? subscription = ...
延迟执行,直到加载页面为止,但到那时,代码的subscription
部分已经执行,undefined
将具有非{{1}}值