我创建了一个已设置remote: true
的表单,并且create操作响应JS。现在当我添加Stripe时:
<script>
$(function() {
var $form = $('#payment-form');
$form.submit(function(event) {
// Disable the submit button to prevent repeated clicks:
$form.find('.submit').prop('disabled', true);
// Request a token from Stripe:
Stripe.card.createToken($form, stripeResponseHandler);
// Prevent the form from being submitted:
return false;
});
});
function stripeResponseHandler(status, response) {
// Grab the form:
var $form = $('#payment-form');
if (response.error) { // Problem!
// Show the errors on the form:
$form.find('.card-payment-errors').text(response.error.message);
$form.find('.submit').prop('disabled', false); // Re-enable submission
} else { // Token was created!
// Get the token ID:
var token = response.id;
// Insert the token ID into the form so it gets submitted to the server:
$form.append($('<input type="hidden" name="stripeToken">').val(token));
// Submit the form:
$form.get(0).submit();
}
};
</script>
即使我的表单已设置为远程,它也会将其作为HTML提交。所以我被重定向,控制器返回ActionController::UnknownFormat
,因为它不知道如何回复HTML。
如何使Stripe以其应有的方式工作,但不要将其作为HTML触发。在控制台中,它还确认:Processing by OrdersController#create as HTML
答案 0 :(得分:1)
在stripeResponseHandler
回调中,您需要提交表单:
// Submit the form:
$form.get(0).submit();
这绕过了Rails&#39; remote: true
机制。由于您希望在AJAX请求中发送令牌,因此您需要在处理程序中明确地执行此操作,方法是调用$.ajax(...)
而不是$form.get(0).submit
。
我发现this blog post解释了如何做到这一点!