2012-03-05 78 views
6

我目前有一個評論模型,微博下發布,並且都顯示在同一頁上。問題是,兩者都顯示在同一頁面上,兩者都分頁,我試圖去Facebook的方法microposting。下面是問題:問題與will_paginate頁面鏈接

這兩個分頁的鏈接變成這個href="https://stackoverflow.com/users/2?page=2"而不是href="https://stackoverflow.com/users/2/micropost?page=2"href="https://stackoverflow.com/users/2/comment?page=2"。我不確定如何去解決這個問題。這裏是我的一些代碼。所有建議都非常感謝!

渲染微柱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> 

註釋部分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> 

用戶控制器的顯示頁面

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 

回答

8

問題在於爲每個頁面創建url的will_paginate方式(它與jQuery沒有任何關係)。

通過設計,will_paginate會盡量猜測頁面用戶的基本URL是什麼(內部是使用控制器/操作來完成的)。然後將該基礎URL與使用:params和成功頁碼傳遞給will_paginate幫助器的任何額外參數結合使用。

現在(will_paginate 3.0.3),爲了覆蓋這個默認行爲,你需要編寫你自定義的LinkRenderer類。下面是這樣的類的例子 - 它使用新的,額外的選項:base_link_url,可以傳遞給will_paginate視圖助手。創建分頁鏈接時,通過的字符串將用作基礎。如果:base_link_url選項未通過,它將回退到默認行爲。

認沽以下級的地方軌道可以找到它的負載(/ lib目錄例如,提供您在application.rb添加/ lib添加到您的自動加載路徑):

# 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 

用法:

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

現在回到你的案子。此時你可能會看到解決方案 - 通過爲這兩個選項傳遞不同的:base_link_url選項,您可以在一個頁面上擁有兩個will_paginate小部件和不同的基本URL。

+0

我假設'集合'我替換爲任何需要分頁?因爲如果沒有我得到一個未定義的錯誤 – Kellogs 2012-03-07 00:44:19

+0

也如何將用戶的ID添加到base_link_url?因爲這兩個鏈接不起作用::base_link_url =>「/ users/<%= user.id%>」,'':base_link_url =>「/ users /:id」,' – Kellogs 2012-03-07 00:53:14

+0

是的,用任何其他變量存儲項代替'collection'分頁。至於使用:base_link_url選項 - 不要傳遞字符串與一些佔位符,就像你在routes.rb中 - 只是傳遞url helper方法的結果。例如,如果你有一個命名的路由「user_micropost」被轉換爲(例如)'/ user/2/micropost',那麼'user_micropost_path(:id => 2)'是你需要傳遞的選項:'base_link_url '。所有呈現的鏈接都會得到url:/ user/2/micropost?page = 1/user/2/micropost?page = 2等等。 – WTK 2012-03-07 06:58:23