Моя проблема связана с навигационными ссылками/бесконечной прокруткой.
Я включил кнопку «удалить» для каждого микросообщения. Когда эта кнопка нажата, происходит вызов ajax на сервер, и микросообщение удаляется, а div удаляется из DOM.
Скажем, у меня были микропосты с 1 по 10 на первой странице, микропосты с 11 по 20 на второй и т. д. Скажем, что я удаляю пункты 1, 2 и 3 на первой странице. Затем прокрутите вниз. Сервер будет «пересчитывать» микросообщения; поскольку я удалил 3 из предыдущего списка, он вернет элементы с 13 по 22. Другими словами, микросообщения 10, 11 и 12 не отображаются ни на первой, ни на второй странице.
Покопавшись в stackoverflow, я нашел решение:
Всякий раз, когда я удаляю микросообщение из списка, я загружаю микросообщение, которое пришло сразу после последнего микросообщения на странице, и вставляю его в него внизу.
Как я сейчас работаю над исправлением:
По умолчанию я показываю 10 микросообщений на странице, используя гем will_paginate. Мне нужно знать идентификатор любого микросообщения, отображаемого в любой момент времени. Я достигаю этого, сохраняя его в открывающем теге div для контейнера, содержащего каждый микросообщение:
<% @microposts.each do |m| %>
<div class="postHolder" data-micropost-id="<%= m.id %>">
Я получаю к нему доступ следующим образом в моем файле ресурсов microposts.js:
$(function() {
$('.message_delete').on('ajax:success', function(event, data, status, xhr){
console.log(data); //to check if json is working
console.log($('.postHolder').last().data('micropost-id'));
});
});
Вот мое действие по уничтожению контроллера:
def destroy
micropost = Micropost.find(params[:id])
respond_to do |format|
micropost.destroy
format.json { render :json => micropost } #just to check if json is working
end
end
Теперь я знаю идентификатор каждого микросообщения, поэтому, когда оно удаляется, я использую селектор jquery, чтобы уточнить последний элемент div .postHolder на странице, получить идентификатор, а затем использовать этот идентификатор, чтобы получить микросообщение, которое следует за ним, и вставить этот микросообщение после него. . Таким образом, когда сообщение удаляется, оно автоматически добавляется.
Если пользователь прокручивает, чтобы загрузить больше сообщений, ни одно из них не пропущено. Я смотрел некоторые рельсовые трансляции и видел, как Райан Бейтс делает аналогичные вещи с использованием атрибутов данных, читал кое-что о них и, похоже, у меня сложилось впечатление, что это плохая практика.
Я пытался придумать другие способы сделать это, но не могу придумать ни одного, но делать это таким образом кажется немного странным. Может быть, это все в моей голове, но я хотел бы другое лучшее решение, если это возможно.
Спасибо
С уважением