通过Ajax与kaminari进行多重分页

mfq*_*mfq 14 ajax pagination ruby-on-rails-3 kaminari

我想通过Ajax对Kaminari应用多个分页现在这里是我的控制器代码

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
Run Code Online (Sandbox Code Playgroud)

现在对于视图我有两个部分来渲染这个数组

<div id="bookmarks">
<%= render :partial =>"users/bookmark",:locals => { :bookmark => @bookmarks} %>
            </div>
<%= paginate @bookmarks,:remote => true, :param_name => 'page' %>
Run Code Online (Sandbox Code Playgroud)

内部的部分是

<% bookmark.each do |bookmar| %>
  <%= render :partial => 'show_bookmark.html.erb' , :locals => { :bookma => bookmar} %>
<%end%>
Run Code Online (Sandbox Code Playgroud)

分页更新的脚本正在一个单独的文件中处理

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

但是通过做所有事情它不会更新到页面状态既不包含在页面中.

Nad*_*sin 16

你错过了在这条线上传递params

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

我认为它应该是这样的

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

你也在这条路上传递错误的参数

<%= paginate @bookmarks,:remote => true, :param_name => 'page' %>
Run Code Online (Sandbox Code Playgroud)

它应该是这样的

<%= paginate @bookmarks,:remote => true, :param_name => 'page_2' %>
Run Code Online (Sandbox Code Playgroud)

并且还请检查您是否正确地将响应发送到JS文件.


bkn*_*les 5

我发现这个问题是在同一页面上搜索多个模型的分页.我不清楚@notes集合的分页是如何工作的,但如上所述,解决方案只会通过AJAX对@bookmarks集合进行分页.

如果您想通过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'); %>');
    
    Run Code Online (Sandbox Code Playgroud)
  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]} %>
    
    Run Code Online (Sandbox Code Playgroud)

同样,我并不清楚提问者的系统应该如何运作,但是这个解决方案将允许用户通过两个模型进行翻页,而不会通过AJAX或html在其他模型中丢失它们的"位置".