Прежде всего, ваш $.post
звонок не делает того, чего вы, вероятно, ожидаете. Это:
$.post "savesort", c, $("#output").html("<p id=\"flash_notice\">Saved Successfully</p>")
такой же, как этот:
$.post "savesort", c
Я думаю, что вы намереваетесь выполнить $('#output').html()
, когда асинхронный вызов $.post
завершится, но для этого вам нужна функция обратного вызова. Эта часть вашего $.post
:
$("#output").html("<p id=\"flash_notice\">Saved Successfully</p>")
будет выполняться, пока создается вызов $.post
, а его возвращаемое значение будет объектом jQuery, с которым $.post
не будет знать, что делать. Чтобы это исправить, просто оберните ваш обратный вызов, ну, в общем, обратный вызов:
$.post "savesort", c, ->
$("#output").html("<p id=\"flash_notice\">Saved Successfully</p>")
Если вы добавите window.location.reload(false)
сразу после $.post
, то перезагрузите страницу до завершения процедуры POST, и это, вероятно, не то, что вы хотите сделать, и это объяснило бы вашу проблему с «запутанным порядком». Попробуйте переместить это в обратный вызов $.post
, чтобы он выполнялся после завершения POST:
$.post "savesort", c, ->
$("#output").html("<p id=\"flash_notice\">Saved Successfully</p>")
window.location.reload(false)
Ваш исходный код полностью игнорировал ответ от SiteController#savesort
, поэтому не имеет значения, что он ничего не возвратил, что-то вернул или перенаправил. Вышеуказанные изменения обратного вызова все еще игнорируют то, что возвращает контроллер, но это нормально, и :nothing => true
- разумная вещь для этого.
Как только все это заработает, вы можете заменить перезагрузку, если ваш контроллер вернет новые данные для вставки на страницу, а затем обратный вызов $.post
может вставить эти новые данные на страницу. Это был бы довольно стандартный подход AJAX.