我有一个带有自定义结帐的rails应用,用户点击按钮即可启动Stripe模式。
问题是当我第一次访问该页面并单击该按钮时,我收到此错误:
“无效的源对象:必须是字典或非空字符串”
错误来自我的控制器创建操作:
customer = Stripe::Customer.create(
email: params[:stripeEmail],
card: params[:stripeToken]
)
但是如果我刷新页面,我可以毫无问题地启动模式。我认为这可能是一个turbolinks问题,所以我在一个准备好的var中添加了我的脚本:
<script>
var ready;
ready = function() {
$('#stripe-button').on('click', function (e) {
// Open Checkout with further options
$name = $('input[name=f_name]').val() + " " + $('input[name=l_name]').val();
handler.open({
name: $name,
description: "<%= @workshop.name %>" + " workshop",
amount: <%= @workshop.price * 100 %>
});
e.preventDefault();
});
$(window).on('popstate', function() {
handler.close();
});
var handler = StripeCheckout.configure({
key: "<%= ENV['stripe_publishable_key'] %>",
token: function (token, args) {
$("#stripeToken").val(token.id);
$("#stripeEmail").val(token.email);
$("#stripeAmount").val('<%= j (@workshop.price * 100).to_s %>');
$("#stripeForm").submit();
}
});
};
$(document).ready(ready);
$(document).on('page:load', ready);
</script>
但不是固定的。当首次加载页面时,似乎e.preventDefault()不起作用......但我不确定原因。
答案 0 :(得分:1)
我在使用Stripe实现自定义表单时遇到了类似的问题。对我有用的是从应用程序布局中移出:
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
<%= javascript_include_tag "https://js.stripe.com/v2/" %>
<%= javascript_tag "Stripe.publishableKey = '#{STRIPE_PUBLISHABLE_KEY}';" %>
到页面底部的实际视图文件(例如new.html.erb),以便它位于结束</body>
标记的上方。这意味着我必须在不通过应用程序布局的每个视图中包含application.js,所以我可能会将它添加到页脚。不确定这是不是最好的方式,但它对我有用。