Множественная разбивка на страницы с помощью kaminari через 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%>

скрипт для обновления пагинации обрабатывается в отдельном файле

$('#bookmarks').html('<%= escape_javascript render(:partial =>"users/bookmark",:locals => { :bookmark => @bookmarks}) %>');
$('#paginator').html('<%= escape_javascript(paginate(@bookmarks, :remote => true).to_s) %>');

Но, делая все, он не обновляет ни состояние страницы, ни содержание на странице.


person mfq    schedule 26.01.2012    source источник
comment
Вы можете проверить эту ссылку. github.com/amatsuda/kaminari_example/tree/ajax Это может вам помочь.   -  person Gayu    schedule 27.01.2012


Ответы (2)


вам не хватает параметров в этой строке

$('#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 или нет.

person Nadeem Yasin    schedule 26.01.2012

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

Будут проблемы, если вы хотите сохранить нумерацию страниц для обеих коллекций через html ИЛИ если вы измените файл js для отображения обеих коллекций.

Я реализовал решение моей аналогичной проблемы следующим образом:

  1. HTML-представление, отображающее шаблон с двумя частичными элементами: одно для @notes (включая его помощник по разбивке на страницы), а другое — для @bookmarks с его помощником по разбивке на страницы.
  2. Ссылки на страницы, отмеченные remote: true
  3. Одно представление js, которое повторно отображает два частичных фрагмента, что-то вроде

    $('#notes_container').html('<%= j(render partial: 'paginated_notes_list') %>');
    $('#bookmarks_container').html('<%= j(render partial: 'paginated_bookmarks_list'); %>');
    
  4. Это ключ: ссылки на страницы, которые принимают текущую страницу другой модели в качестве параметра. Таким образом, вы не «потеряете», на какой странице вы находитесь в другой модели.

    <%= 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.

person bknoles    schedule 18.07.2013