Многократное разбиение на страницы с каминари через Ajax
Я хочу применить множественную разбивку на страницы с Kaminari через Ajax, теперь вот мой код для контроллера
def user_note
@user = current_user
@notes = Bookmark.where('user_id = ? && note is not NULL',current_user.id).order('created_at DESC').page(params[:page_1]).per(4)
@bookmarks = Bookmark.where('user_id = ? && note is NULL',current_user.id).order('created_at DESC').page(params[:page_2]).per(4)
respond_to do |format|
format.html
format.xml{ render :xml => @user}
end end
теперь для представлений у меня есть две частичные части для рендеринга этих массивов
<div id="bookmarks">
<%= render :partial =>"users/bookmark",:locals => { :bookmark => @bookmarks} %>
</div>
<%= paginate @bookmarks,:remote => true, :param_name => 'page' %>
внутренняя частичная
<% bookmark.each do |bookmar| %>
<%= render :partial => 'show_bookmark.html.erb' , :locals => { :bookma => bookmar} %>
<%end%>
script для обновления pagination обрабатывается в отдельном файле
$('#bookmarks').html('<%= escape_javascript render(:partial =>"users/bookmark",:locals => { :bookmark => @bookmarks}) %>');
$('#paginator').html('<%= escape_javascript(paginate(@bookmarks, :remote => true).to_s) %>');
Но, делая все, он не обновляет до состояния страницы ни содержание на странице.
Ответы
Ответ 1
вам не хватает параметров в этой строке
$('#paginator').html('<%= escape_javascript(paginate(@bookmarks, :remote => true).to_s) %>');
Я думаю, что это должно быть так
$('#paginator').html('<%= escape_javascript(paginate(@bookmarks, :remote => true, :param_name => 'page_2').to_s) %>');
и вы также передаете неверный параметр в этой строке
<%= paginate @bookmarks,:remote => true, :param_name => 'page' %>
он должен быть таким
<%= paginate @bookmarks,:remote => true, :param_name => 'page_2' %>
и, пожалуйста, также проверьте, правильно ли вы отправляете ответ в файл JS или нет.
Ответ 2
Я нашел этот вопрос, пытаясь разбивать страницы на несколько страниц на одной странице. Мне непонятно, как будет предназначено разбиение на страницы для коллекции @notes, но, как представлено, решения будут только разбивать коллекцию @bookmarks через AJAX.
Будут проблемы, если вы хотите сохранить разбивку на страницы для обеих коллекций через html ИЛИ, если вы измените файл js, чтобы отобразить обе коллекции.
Я применил решение для моей аналогичной проблемы:
- Представление html, которое отображает шаблон с двумя частичными: один для
@notes
(включая его помощник для разбивки на страницы) и другой, который отображает @bookmarks
с помощью вспомогательного помощника
- Разделительные ссылки, помеченные
remote: true
-
Один вид js, который повторно отображает два частичных элемента, что-то вроде
$('#notes_container').html('<%= j(render partial: 'paginated_notes_list') %>');
$('#bookmarks_container').html('<%= j(render partial: 'paginated_bookmarks_list'); %>');
-
Это ключ: ссылки на страницы, которые используют текущую страницу другой модели в качестве параметра. Таким образом, вы не "теряете", на какой странице вы находитесь в другой модели.
<%= paginate @notes, param_name: 'page_1', params: {page_2: params[:page_2]} %>
<%= paginate @bookmarks, param_name: 'page_2', params: {page_1: params[:page_1]} %>
Опять же, я не совсем понимаю, как должна функционировать система афер, но это решение позволит пользователю перейти через обе модели, не теряя своего "места" в другой модели через AJAX или html.
Ответ 3
Вы можете проверить эту ссылку.
https://github.com/amatsuda/kaminari_example/tree/ajax
Это может вам помочь.