will_paginate + удаление ajax - PullRequest
       13

will_paginate + удаление ajax

1 голос
/ 04 апреля 2011

У меня есть список ресурсов, которые я показываю в разбивке на страницы, используя will_paginate .

Я ничего не настроил, вот мое мнение:

<ul>
<%= render :partial => "item_li", :collection => @items%>
</ul>
<%= will_paginate @items %>

Элементы рассчитываются так на контроллере:

@items = Item.find(:all)

Сгенерированный код представляет собой простой HTML-список со ссылками навигации по страницам внизу:

<ul>
<li>Item 1</li>
<li>Item 2</li>
...
<li>Item 10</li>
</ul>
<div class="pagination">
  <span class="disabled prev_page">Previous</span>
  <span class="current">1</span>
  ...
</div>

Я включил кнопку «Удалить» в мои пункты. Когда эта ссылка нажата, сервер выполняет ajax-вызов, и элемент исчезает из списка (<li> заменяется на "")

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

  • Скажите, что у меня были пункты с 1 по 10 на первой странице, пункты с 11 по 20 на второй и т. Д.
  • Скажите, что я удаляю пункты 1, 2 и 3 на первой странице.
  • А потом я нажимаю «далее».

Сервер «пересчитает» список предметов; так как я удалил 3 из предыдущего списка, он вернет пункты с 13 по 22. Другими словами, пункты 10, 11 и 12 не появляются ни на первой странице, ни на второй.

Как я могу решить это простым, элегантным способом?

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

Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2011

В зависимости от вашей библиотеки AJAX, вам необходимо реализовать метод обратного вызова, который вызывается всякий раз, когда вызов AJAX завершился успешно.

Сначала поместите <%= will_paginate @items %> в div или в какой-либо контейнер.Затем в обратном вызове «success» удалите этот div и замените его новым, содержащим новый вызов will_paginate @ items.

Это работает при условии, что ваш AJAX-вызов вашего метода delete перезагрузит переменную @items.

Если вы используете jQuery, это выглядело бы примерно так (при условии, что вы даете div, содержащему пагинацию, класс с именем "my_pagination":

$.ajaxSuccess(function(){
  $(".my_pagination").text("");//Cleans out the div
  $(".my_pagination").append(<%=will_paginate @items%>);//Refill the div with a new pagination
});

Возможно, вам придетсяоберните <% = will_paginate @ items%> в кавычки, я не уверен на 100%.

1 голос
/ 08 апреля 2011

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

Мне просто нужно быть осторожным с ситуациями «больше никаких предметов».

Большое спасибо за ваш ответ, Захари, но этот кажется более правильным.

...