В какой момент использование атрибутов данных является плохой практикой при выполнении ajax-вызовов в ruby ​​on rails?

Моя проблема связана с навигационными ссылками/бесконечной прокруткой.

Я включил кнопку «удалить» для каждого микросообщения. Когда эта кнопка нажата, происходит вызов 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 на странице, получить идентификатор, а затем использовать этот идентификатор, чтобы получить микросообщение, которое следует за ним, и вставить этот микросообщение после него. . Таким образом, когда сообщение удаляется, оно автоматически добавляется.

Если пользователь прокручивает, чтобы загрузить больше сообщений, ни одно из них не пропущено. Я смотрел некоторые рельсовые трансляции и видел, как Райан Бейтс делает аналогичные вещи с использованием атрибутов данных, читал кое-что о них и, похоже, у меня сложилось впечатление, что это плохая практика.

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

Спасибо

С уважением


person LondonGuy    schedule 22.05.2012    source источник


Ответы (1)


Вы можете использовать переменную для отслеживания количества микросообщений на текущей странице. Всякий раз, когда вы удаляете сообщение, уменьшайте значение этой переменной. Всякий раз, когда вы загружаете новую страницу сообщений, сбрасывайте эту переменную на значение по умолчанию (10).

Когда вы получаете новые 10 сообщений, смещение для базы данных будет (при условии, что вы запрашиваете 3 страницы микросообщений, и вы удалили 4 со второй страницы)

(3 * 10) - (4) == 26

Первый микросообщение на странице 3 теперь будет иметь идентификатор микросообщения 26.

Предполагая, что я понял ваш вопрос, то есть!

person Donal.Lynch.Msc    schedule 23.05.2012