2015-02-07 3 views
0

В Rails 4.1.8Rails Ajax форма: как исправить поля, прежде чем форма отсылается

Я работаю в форме оплаты (Braintree платежей), я хочу, чтобы работать через Ajax. Я не могу использовать стандартную конфигурацию формы Braintree, потому что она не предлагает метод onSuccess и onError. Но я могу использовать специальную функцию javascript, которая смотрит на поля, разговаривает с сервером Braintree и возвращает nonce, который затем отправляется в форме. Итак ...

Я создал форму и установил remote: true. Это позволяет rails_ujs взять на себя и ajax форму на моем сервере. Но прежде чем это произойдет, я должен отправить звонок в Брейнтри и получить ответ. Функция javascript, которую они предоставляют, выполняет асинхронный вызов. Поэтому я не могу подключиться к обратному вызову Rails «ajax: before», потому что вызов javascript в Braintree возвращает значение после того, как «ajax: before» перешел к основным rails_ujs, который отправляет содержимое формы на сервер, и поэтому я получаю пустое поле на сервере.

Функция js, предоставляемая функцией Braintree, имеет нормальные обратные вызовы, поэтому я могу подключиться к обратному вызову и вызвать форму отправки. Так что я попытался закреплять в случае нажмите на кнопку отправки, отключение по умолчанию, взывая к Braintree, а затем, когда я получаю успешный ответ я называю

$('#myForm').submit() 

Что же на самом деле отправить данные через, но это нормально не-xhr POST. Копая глубоко, я обнаружил, что rails_ujs не ведет себя так, как будто он подключается к событию form.submit(), но к событию click button(). Так что, захватив это событие, предотвращая поведение по умолчанию, вызывая Braintree, а затем запуская событие submit() в форме, я полностью вырезал Rails-файл ajax.

Ключевым вопросом является вопрос о том, как я могу вызвать форму ajax для Rails для удаленной отправки, не нажимая кнопку отправки внутри формы?

В качестве обходного пути я могу либо выполнить вызов $ .ajax с ручным вводом, либо поместить скрытую кнопку отправки в форму и другую видимую кнопку, которая выполняет вызов Braintree, а затем вызывает щелчок по скрытой кнопке отправки. Который, по крайней мере, получит всю форму Rails с помощью токена csrf, сделанного для меня. Но я хотел бы знать, почему я не могу назвать form.submit()

ответ

3

Удалить удаленный: истинный для вашей формы и своп, чтобы использовать собственный javascript для отправки вашей формы.

braintree.setup(
 
    braintree_token, 
 
    'dropin', { 
 
    container: 'dropin', 
 
    paymentMethodNonceReceived: function (event, nonce) { 
 
    $('.braintree-checkout').append("<input type='hidden' name='payment_method_nonce' value='"+ nonce +"'></input>"); 
 
    $.ajax({ 
 
     url: braintree_charge_path, 
 
     type: 'post', 
 
     data: $('.braintree-checkout').serialize(), 
 
     context: $('.braintree-checkout'), 
 
     beforeSend: function(evt, xhr, settings){ 
 
     // Stuff to do before braintree submits, e.g. loading screen 
 
     }, 
 
     complete: function(evt, xhr, status){ 
 
     // Stuff that has to be done regardless of success or error 
 
     }, 
 
     error: function(evt, xhr, status, error){ 
 
     // Your error messages 
 
     } 
 
    }); 
 
    } 
 
});

Таким образом, вы получаете полный контроль над процессом формы потока

Смежные вопросы