Rails 3: форма отправляется дважды

Я разрабатываю приложение Rails, в котором есть формы, сгенерированные с помощью formtastic. Я разрабатываю и тестирую локально, то есть на локальном хосте: 3000 с Ruby-1.9.2, Rails-3.0.1, jQuery и AJAX.

Ниже приведен пример вывода на экран проблемы, которую я вижу. Мои формы отправляются дважды в течение 1 секунды друг от друга. Я не могу понять, почему это происходит. Я вижу эту проблему со всеми запросами, включая GET.

  1. Запущен POST "/businesses/6/edit_balance" для 127.0.0.1 в 2011-01-07 02:31:47 +0530. Обработка BusinessesController#edit_balance как параметры JS: {"utf8"=>" ✓", "authenticity_token"=>"zcWH08sV8kPbAYy7JQX64Cu2e1i/kEB1AB4x5a08CO8="

  2. Запущен POST "/businesses/6/edit_balance" для 127.0.0.1 в 2011-01-07 02:31:48 +0530. Обработка BusinessesController#edit_balance как параметры JS: {"utf8"=>" ✓", "authenticity_token"=>"zcWH08sV8kPbAYy7JQX64Cu2e1i/kEB1AB4x5a08CO8="

И поэтому мне интересно, делаю ли я основную ошибку программирования. Если да, то не могли бы вы предложить некоторые решения, которые я мог бы попробовать.


person Abhinav    schedule 06.01.2011    source источник
comment
не могли бы вы решить это? у меня сейчас такая же проблема   -  person pdu    schedule 16.11.2011


Ответы (3)


У меня была такая же проблема сразу после развертывания на Heroku... Я предварительно скомпилировал свои активы, и внезапно я получил двойные представления AJAX. Думаю, я каким-то образом оказался с дубликатами файлов javascript в public/assets.

Чтобы решить эту проблему, я просто удалил весь каталог public/assets.

person Amir Rubin    schedule 31.01.2012
comment
Амир, спасибо. Ата Гаон! Я пытался предварительно скомпилировать, а затем очистить активы, и это не сработало. Но простое удаление каталога public/assets сработало! Спасибо! (Только что сделал rm -r public/assets/) - person mjnissim; 25.08.2012

Если вы отправляете форму с помощью Javascript, попробуйте отключить кнопку отправки при отправке формы. С jQuery это будет примерно так (не проверено):

$('form').submit(function(){
  $(this).find(input[type='submit']).attr("disabled", "true");
  ... // submit form via AJAX
  return false;
});
person polarblau    schedule 06.01.2011
comment
form.attr(action, …) устанавливает только атрибут действия для формы и, следовательно, определяет, куда будет отправлена ​​форма, но фактически не отправляет форму. - person polarblau; 07.01.2011

Спасибо, PolarBlau.. Позвольте мне попробовать ваше предложение..

Предварительное погружение: Ниже приведены фрагменты кода, которые 1. создают форму (частичная форма), 2. определяют диалоговое окно, в котором находится форма (частичная диалоговое окно), и 3. JS, который прикрепляет действие к форме.

Частичная форма (credits_form)

- f.inputs :name => 'Edit Credits' do 
  = f.input :numeric_input_1, :label => 'Amount', :as => :select, :collection => [1000,2000,3000] 
  = f.input :boolean_input_1, :label => 'Add Credits'
  = f.commit_button :label => 'Submit' 

Частичное диалоговое окно

# редактировать-кредиты-диалог

- @user_input = Пользовательский ввод.новый

 = semantic_form_for @user_input, :remote => true do |f|     
 = render :partial => 'businesses/credit_form', :locals => {:f => f}

JS-код

$.getJSON('/businesses/' + id + '/load_credits', function(data) { 
    var form = $('#edit-credits-dialog form') ; 

    form.attr('action', '/businesses/' + id + '/edit_balance') ; <-- seems to be happening twice
    $('#edit-credits-dialog').dialog('open') ; <--- happens once 
}) ; 
person Abhinav    schedule 07.01.2011
comment
Отключение кнопки отправки не работает. Я все еще вижу 2 POST-запроса на каждый клик. - person Abhinav; 07.01.2011
comment
Отключение кнопки отправки не работает. Я все еще вижу 2 POST-запроса на каждый клик. Возможно ли, что второй запрос происходит из-за того, что браузер не получил подтверждения на первый? Я также понял, что удалил блок response_to из своего контроллера и заменил его просто рендером :json. Может ли быть так, что response_to важен и предотвращает дублирование обработки? Если нет ни одной из двух вышеперечисленных возможностей, то я облажался, потому что у меня нет третьей идеи. - person Abhinav; 07.01.2011
comment
ОК, я понял.. Проблема с моими файлами javascript. Я дважды привязывал одно и то же событие «щелчок» к одному и тому же объекту. И, по-видимому, начиная с jQuery-1.4.2, это возможно. В настоящее время я обхожу проблему, выполняя $(obj).unbind('click', обработчик).bind('click', обработчик). Но у меня впереди целый вечер реорганизации кода. Спасибо, хотя всем за их вклад - person Abhinav; 07.01.2011
comment
Какие два файла javascript мешали? У меня такая же проблема. - person Teddy; 28.07.2011
comment
У меня была такая же проблема, я связывал клики с помощью '$(document).on('click', '#button', 'myData', myFunction); '. Заменил это на $('#button').click(myFunction(myData)); - person Ramses; 30.05.2012