Автосохранение форм Rails с помощью jQuery/AJAX

Я знаю, что этот вопрос задавался несколько раз, но я не смог найти ни одного поста, который идеально решает мою проблему.

Фон: у меня есть форма, которая в настоящее время создается/обновляется ajax-ly с использованием Ruby on Rails и jQuery. Мне нужно автоматически сохранять содержимое формы каждые 30 секунд для каждого действия создания/обновления. Сейчас я сосредоточен на том, чтобы заставить форму автосохранения работать.

У меня есть что-то вроде ниже:

#controller method
def create
  @report = Report.create(params)
end

#js
$(function() {
  if ($("#report").length > 1) {
    setTimeout(autoSaveForm, 30000);
  }
});

function autoSaveForm() {
  $.ajax({
    type: "POST",
    url: "report/create",
    data: $("#report").serialize(),
    dataType: "script",
    success: function(data) {
      console.log(data);
    }
  });
  setTimeout(autoSaveForm, 30000);
}

Обновление: при ближайшем рассмотрении $("#report").serialize() не работает. Он не фиксирует содержимое формы. Я использую кокон для создания двухслойных вложенных форм. Мне нужно правильно сериализовать содержимое формы.

Обновление: замените «#report» на «form». Большое спасибо.


person LOCKLOCK    schedule 13.10.2015    source источник
comment
Что не работает?   -  person sourcx    schedule 15.10.2015
comment
Привет, Фрэнк, URL-адрес не работает.   -  person LOCKLOCK    schedule 19.10.2015
comment
Я хотел бы помочь вам, но мне нужно немного больше информации. Рекомендуется также отображать сообщения об ошибках, которые вы видите (проверьте консоль разработчика вашего браузера). Кроме того, было бы неплохо объяснить, в чем, по вашему мнению, проблема, указав, что вы уже пробовали. Если у вас есть дополнительная информация, пожалуйста, обновите исходный пост.   -  person sourcx    schedule 19.10.2015
comment
Спасибо, Фрэнк. Я обновил описание проблемы. Это проблема с сериализацией параметров формы. Есть предположения?   -  person LOCKLOCK    schedule 20.10.2015


Ответы (1)


Спасибо за обновление вашего вопроса. Хотя у меня есть ощущение, что ваш код никогда не выполняется из-за этой проверки ($("#report").length > 1) (просто удалите часть > 1, чтобы она заработала), реальная проблема заключается в вложенности форм.

Поскольку вложенные формы недействительны (см. Допустимо ли иметь html-форму внутри другой html-формы?) вы не можете настроить таргетинг на форму, содержащуюся в другой форме.

Я еще раз подтвердил это здесь https://jsfiddle.net/2tuo3yhv

Содержит ли выведенный вами HTML тег <form> в теге <form>? Если это так, вы можете использовать только внешнюю форму для таргетинга и сохранения.

Удачи и дайте мне знать, если вы можете решить свою проблему таким образом!

person sourcx    schedule 20.10.2015
comment
Замените #report на форму и измените длину › 1 на › 0. Именно то, что вы сказали. Теперь у меня другая проблема - отличить автосохранение от фактического отправки. Есть предположения? - person LOCKLOCK; 20.10.2015
comment
Хороший! Не могли бы вы тогда принять мой ответ как официальный ответ? :) Чтобы узнать, какая форма отправлена, вам нужно будет использовать уникальный идентификатор, например. form#first и form#second. Можно ли выбрать вложенную форму с помощью кокона? - person sourcx; 20.10.2015