2012-03-05 34 views
6

Tôi hiện có mô hình nhận xét bài đăng dưới micropost và cả hai được hiển thị trên cùng một trang. Vấn đề là cả hai được hiển thị trên cùng một trang và cả hai được phân trang và tôi đang cố gắng để đi cho phương pháp tiếp cận facebook để microposting. Đây là vấn đề bên dưới:Vấn đề với will_paginate liên kết trang

Các liên kết cho cả hai lần chuyển trang sẽ chuyển thành số này href="https://stackoverflow.com/users/2?page=2" thay vì href="https://stackoverflow.com/users/2/micropost?page=2" hoặc href="https://stackoverflow.com/users/2/comment?page=2". Tôi không chắc chắn cách giải quyết vấn đề này. Đây là một số mã của tôi. Tất cả các đề xuất đều được đánh giá cao!

Micropost Render HTML

<table class="microposts"> 
<% if microposts.any? %> 
<%= render microposts %> 
<%= will_paginate microposts, :page_links => false %> 
<% else %> 
<div class="EmptyContainer"><span class='Empty'>Add a thread!</span></div> 
<% end %> 
</table> 

Mục Comment HTML

<div id='CommentContainer-<%= micropost.id%>' class='CommentContainer Condensed2'> 
<div class='Comment'> 
<%= render :partial => "comments/form", :locals => { :micropost => micropost } %> 
</div> 
<div id='comments'> 
    <% comments = micropost.comments.paginate(:per_page => 5, :page => params[:page]) %> 
    <%= render comments %> 
    <%= will_paginate comments, :class =>"pagination" %> 
</div> 
</div> 

điều khiển tài khoản cho Hiển thị Trang

def show 
    @user = User.find(params[:id]) 
    @comment = Comment.find(params[:id]) 
    @micropost = Micropost.new 
    @comment = Comment.new 
    @comment = @micropost.comments.build(params[:comment]) 
    @comments = @micropost.comments.paginate(:page => params[:page], :per_page => 5) 
    @microposts = @user.microposts.order('created_at DESC').paginate(:per_page => 10, :page => params[:page]) 
     respond_to do |format| 
     format.html 
     format.js 
    end 
    end 

Trả lời

8

Sự cố nằm trong will_paginate cách tạo url cho mỗi trang (nó không liên quan gì đến jQuery).

Bằng cách thiết kế, will_paginate cố gắng hết sức để đoán url cơ sở cho người dùng trang đang bật (nội bộ là sử dụng bộ điều khiển/hành động để thực hiện điều đó). Url cơ sở đó sau đó được kết hợp với bất kỳ thông số bổ sung nào được chuyển tới trình trợ giúp will_paginate bằng cách sử dụng :params và số trang liên tiếp.

Hiện tại (will_paginate 3.0.3), để ghi đè hành vi mặc định này, bạn cần phải viết lớp LinkRenderer tùy chỉnh của mình. Dưới đây là ví dụ về lớp như vậy - nó sử dụng tùy chọn mới, bổ sung :base_link_url có thể được chuyển tới will_paginate trình trợ giúp xem. Chuỗi được chuyển sau đó được sử dụng làm cơ sở khi tạo liên kết pagination. Nếu :base_link_url tùy chọn không được thông qua, nó sẽ dự phòng cho hành vi mặc định.

Đặt lớp sau ở đâu đó đường ray có thể tìm thấy nó trên tải (/ lib ví dụ, với điều kiện bạn đã thêm/lib để đường dẫn autoload của bạn trong application.rb):

# custom_link_renderer.rb 
class CustomLinkRenderer < WillPaginate::ActionView::LinkRenderer 
    def prepare(collection, options, template) 
    @base_link_url = options.delete :base_link_url 
    @base_link_url_has_qs = @base_link_url.index('?') != nil if @base_link_url 
    super 
    end 

    protected 
    def url(page) 
    if @base_link_url.blank? 
     super 
    else 
     @base_url_params ||= begin 
     merge_optional_params(default_url_params) 
     end 

     url_params = @base_url_params.dup 
     add_current_page_param(url_params, page) 

     query_s = [] 
     url_params.each_pair {|key,val| query_s.push("#{key}=#{val}")} 

     if query_s.size > 0 
     @base_link_url+(@base_link_url_has_qs ? '&' : '?')+query_s.join('&') 
     else 
     @base_link_url 
     end 
    end 
    end 
end 

Cách sử dụng:

# in your view 
will_paginate collection, :renderer => CustomLinkRenderer, :base_link_url => '/anything/you/want' 

Và bây giờ trở lại trường hợp của bạn. Đến thời điểm này, bạn có thể thấy giải pháp - bạn có thể có hai tiện ích will_paginate trên một trang với các url cơ sở khác nhau bằng cách chuyển các tùy chọn :base_link_url khác nhau cho hai tiện ích đó.

+0

Tôi giả định cho 'bộ sưu tập' tôi thay thế bằng bất kỳ thứ gì cần được phân trang? Nguyên nhân nếu không, tôi nhận được lỗi không xác định – Kellogs

+0

cũng làm cách nào để thêm id của người dùng vào base_link_url? Vì hai liên kết này không hoạt động ': base_link_url =>"/users/<%= user.id%> ",' ': base_link_url =>"/người dùng /: id ",' – Kellogs

+0

Có, thay thế 'bộ sưu tập' bằng bất kỳ biến nào khác đang nắm giữ mục được phân trang. Khi sử dụng: tùy chọn base_link_url - không chuyển chuỗi với một số trình giữ chỗ như bạn làm trong routes.rb - chỉ cần chuyển kết quả của phương thức trợ giúp url. Ví dụ: nếu bạn có một tuyến đường được đặt tên là "user_micropost" được chuyển sang (ví dụ) '/ user/2/micropost' thì' user_micropost_path (: id => 2) 'sẽ là tùy chọn bạn cần chuyển thành': base_link_url '. Tất cả các liên kết được hiển thị sau đó sẽ nhận được url như:/user/2/micropost? Page = 1/user/2/micropost? Page = 2 và cứ tiếp tục như vậy. – WTK

Các vấn đề liên quan