2012-01-26 9 views
13

Chcę zastosować wiele paginacji z Kaminari poprzez Ajax teraz tu jest mój kod kontroleraMultiple paginacja z Kaminari poprzez 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 

teraz dla widoków Mam dwóch partials, aby ten tablic

<div id="bookmarks"> 
<%= render :partial =>"users/bookmark",:locals => { :bookmark => @bookmarks} %> 
      </div> 
<%= paginate @bookmarks,:remote => true, :param_name => 'page' %> 

część wewnętrzna to

<% bookmark.each do |bookmar| %> 
    <%= render :partial => 'show_bookmark.html.erb' , :locals => { :bookma => bookmar} %> 
<%end%> 

skrypt do aktualizacji paginacji jest obsługiwany w se plik parate

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

Ale robienie wszystkiego nie aktualizuje stanu strony ani zawartości na stronie.

Odpowiedz

14

brakuje przekazać params na tej linii

$('#paginator').html('<%= escape_javascript(paginate(@bookmarks, :remote => true).to_s) %>'); 

myślę, że powinno być jak ten

$('#paginator').html('<%= escape_javascript(paginate(@bookmarks, :remote => true, :param_name => 'page_2').to_s) %>'); 

a także przechodząc złego param w tej linii

<%= paginate @bookmarks,:remote => true, :param_name => 'page' %> 

powinno być tak

<%= paginate @bookmarks,:remote => true, :param_name => 'page_2' %> 

i sprawdź również, czy prawidłowo wysyłasz odpowiedź do pliku JS, czy nie.

5

Znalazłem to pytanie, wyszukując kilka modeli na tej samej stronie. Nie jest dla mnie jasne, w jaki sposób paginacja dla kolekcji @notes ma działać, ale zgodnie z przedstawionymi rozwiązaniami rozwiązania będą jedynie paginować kolekcję @ bookmarks za pośrednictwem AJAX.

Pojawią się problemy, jeśli chcesz zachować paginację dla obu kolekcji za pomocą html LUB, jeśli zmienisz plik js, aby renderować obie kolekcje.

I wdrożone rozwiązanie mojego podobny problem jak poniżej:

  1. widoku HTML, który renderuje szablon z dwoma podszablonów: jeden dla @notes (w tym jego stronicowania pomocnika), a inny, który renderuje @bookmarks z stronicowania pomocnika
  2. linki paginacji oznaczone remote: true
  3. Jeden js zobaczyć, że ponownie renderuje dwóch partials, coś

    $('#notes_container').html('<%= j(render partial: 'paginated_notes_list') %>'); 
    $('#bookmarks_container').html('<%= j(render partial: 'paginated_bookmarks_list'); %>'); 
    
  4. To jest klucz: łącza stronicowania, które pobierają bieżącą stronę drugiego modelu jako parametr. W ten sposób nie "tracisz" strony, na której jesteś w innym modelu.

    <%= paginate @notes, param_name: 'page_1', params: {page_2: params[:page_2]} %> 
    <%= paginate @bookmarks, param_name: 'page_2', params: {page_1: params[:page_1]} %> 
    

Ponownie, nie jestem jasne, w jaki sposób układ Pytający za ma funkcjonować, ale to rozwiązanie pozwoli użytkownikowi na stronie przez obu modelach bez utraty ich „miejsce” w drugim modelu poprzez AJAX lub html.