2012-03-05 83 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