Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple pagination with kaminari via Ajax

I want to apply multiple pagination with Kaminari via Ajax now here is my code for controller

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

now for views i have two partials to render this arrays

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

inner partial is

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

script for pagination update is being handled in a separate file

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

But by doing every thing it is not updating to state of page neither the contain in the page.

like image 864
mfq Avatar asked Jan 26 '12 10:01

mfq


2 Answers

you are missing to pass params at this line

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

i think it should be like this

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

and you are also passing wrong param at this line

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

it should be like this

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

and please also check that whether you are sending the response correctly to the JS file or not.

like image 59
Nadeem Yasin Avatar answered Oct 01 '22 19:10

Nadeem Yasin


I found this question searching for paginating multiple models on the same page. It's not clear to me how the pagination for the @notes collection is intended to work, but as presented, the solutions will only paginate the @bookmarks collection via AJAX.

There will be issues if you want to maintain pagination for both collections via html OR if you change the js file to render both collections.

I implemented a solution to my similar problem like this:

  1. An html view that renders a template with two partials: one for @notes (including its pagination helper) and another that renders @bookmarks with its pagination helper
  2. Pagination links marked with remote: true
  3. One js view that re-renders the two partials, something like

    $('#notes_container').html('<%= j(render partial: 'paginated_notes_list') %>');
    $('#bookmarks_container').html('<%= j(render partial: 'paginated_bookmarks_list'); %>');
    
  4. This is the key: Pagination links that take the current page of the other model as a parameter. This way you do not "lose" which page you are on in the other model.

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

Again, I'm not really clear on how the asker's system is supposed to function, but this solution will allow user to page through both models without losing their "place" in the other model via AJAX or html.

like image 32
bknoles Avatar answered Oct 01 '22 17:10

bknoles