条带javascript将表单作为HTML提交,当它应该是JS时

时间:2016-06-08 18:35:45

标签: ruby-on-rails stripe-payments

我创建了一个已设置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

1 个答案:

答案 0 :(得分:1)

stripeResponseHandler回调中,您需要提交表单:

// Submit the form:
$form.get(0).submit();

这绕过了Rails&#39; remote: true机制。由于您希望在AJAX请求中发送令牌,因此您需要在处理程序中明确地执行此操作,方法是调用$.ajax(...)而不是$form.get(0).submit

我发现this blog post解释了如何做到这一点!