2012-01-26 10 views
13

Tôi muốn áp dụng nhiều pagination với Kaminari qua Ajax tại đây là mã của tôi cho điều khiểnNhiều pagination với Kaminari qua 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 

bây giờ cho xem tôi có hai partials để render mảng này

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

phần bên trong là

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

tập lệnh để cập nhật phân trang đang được xử lý trong se parate file

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

Nhưng bằng cách làm mọi thứ, nó không cập nhật trạng thái trang không chứa trong trang.

Trả lời

14

bạn đang thiếu để vượt qua params tại dòng này

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

tôi nghĩ rằng nó phải như thế này

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

và bạn cũng đang đi qua param sai ở dòng này

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

phải giống như thế này

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

và cũng vui lòng kiểm tra xem bạn có đang gửi phản hồi chính xác cho tệp JS hay không.

5

Tôi đã tìm thấy câu hỏi này đang tìm kiếm phân trang nhiều mô hình trên cùng một trang. Nó không rõ ràng với tôi cách phân trang cho bộ sưu tập @notes được dự định làm việc, nhưng như đã trình bày, các giải pháp sẽ chỉ phân trang bộ sưu tập @bookmarks thông qua AJAX.

Sẽ có vấn đề nếu bạn muốn duy trì phân trang cho cả hai bộ sưu tập qua html HOẶC nếu bạn thay đổi tệp js để hiển thị cả hai bộ sưu tập.

tôi thực hiện một giải pháp cho vấn đề tương tự của tôi như thế này:

  1. An xem html mà ám một mẫu với hai partials: một cho @notes (bao gồm helper pagination của nó) và một người khác mà ám @bookmarks với helper pagination của nó
  2. liên kết Pagination được đánh dấu bằng remote: true
  3. Một js xem mà lại ám chỉ rằng hai partials, một cái gì đó giống như

    $('#notes_container').html('<%= j(render partial: 'paginated_notes_list') %>'); 
    $('#bookmarks_container').html('<%= j(render partial: 'paginated_bookmarks_list'); %>'); 
    
  4. Đây là khóa: Liên kết pagination lấy trang hiện tại của mô hình khác làm tham số. Bằng cách này bạn không "mất" trang nào bạn đang ở trong mô hình khác.

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

Một lần nữa, tôi không thực sự rõ ràng về cách hệ thống của người hỏi là nghĩa vụ thực hiện chức năng, nhưng giải pháp này sẽ cho phép người dùng đến trang thông qua cả hai mô hình mà không làm mất "vị trí" của mình trong mô hình khác thông qua AJAX hoặc html.