У меня есть индексный указатель в приложении Rails 3.2, в котором отображается кнопка удаления рядом с каждой записью.
<%= link_to "Delete", object, method: :delete, remote: true, class: 'delete' %>
Я изначально создал файл destroy.js.erb для удаления объекта, когда он был уничтожен. Тем не менее, это не дало мгновенный и отзывчивый опыт, который я искал.
Вместо этого я создал эту функцию coffeescript
jQuery ->
if $('a.delete').length
$("a.delete").click ->
if confirm("Are you sure?")
row = $(this).closest("tr").get(0)
$.post @href,
_method: "delete"
, null, "script"
$(row).hide()
false
else
#they clicked no.
false
Это хорошо работает в 99% случаев. Но я нахожу некоторые крайние случаи, когда пользователь быстро удаляет несколько объектов подряд. Хотя объекты скрыты, некоторые из них, похоже, не удалены должным образом и снова отображаются на перезагрузке страницы.
Есть ли лучший способ выполнить это или поставить в очередь мои запросы.post, чтобы я мог быть на 100% уверен, что они все делают?
Если вы хотите ставить задачи в очередь, вам может потребоваться рассмотреть затянувшийся жемчуг, https://github.com/collectiveidea/delayed_job.
Что касается лучшего способа хранения элементов, предназначенных для удаления со страницы, вы можете комбинировать delayed_job с логическим полем "pending_deletion" на вашей модели. Когда пользователь указывает, что объект должен быть удален, отметьте его, отправьте задание удаления, а затем запустите свою функцию Coffeescript, чтобы скрыть ее. Ваш первоначальный запрос перед рисованием представления может быть изменен, чтобы включить объекты, где pending_delete! = True. Это мне очень нравится, но если процесс удаления медленный или ваша очередь часто подкрепляется, это кажется разумным.
Вы также можете (или альтернативно) захотеть, чтобы ваша функция CoffeeScript выполнялась как ответ на действие контроллера. Если Object.delete возвращает true, функция запускается и объект скрыт.
pending_deletion
или обновлением поляpending_deletion
будет сэкономлено очень мало времени - и то, и другое требует задержки, пока соединение установлено и отправлено. Я ищу очень быстрый ответ на стороне клиента для обновления представления, но мне нужно больше уверенности, что все запросы на уничтожение будут выполнены, чем обеспечивает моя текущая настройка. Спасибо за ваши идеи$(row).hide()
на основе успешного ответа от$.post
. Если я неправильно читаю ваш CoffeeScript или чего-то не хватает, похоже, он пытается создать сообщение, а затем скрывает строку, независимо от результата публикации. Или есть задержка в ответе почты, которая препятствует тому, чтобы это было выбором?