我目前有一个评论模型,在微博下发布,两者都显示在同一页面上。问题是两者都显示在同一页面上,并且两者都是分页的,我试图用facebook方法进行微观测量。以下是以下问题:
这两个分页的链接都会变为href="/users/2?page=2"
而不是href="/users/2/micropost?page=2"
或href="/users/2/comment?page=2"
。我不确定如何解决这个问题。这是我的一些代码。所有建议都非常感谢!
Micropost呈现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
答案 0 :(得分:8)
问题在于为每个页面创建URL的will_paginate方式(它与jQuery没有任何关系)。
通过设计,will_paginate会尽力猜测页面用户的基本URL是什么(内部使用控制器/动作来执行此操作)。然后将该基本URL与使用:params
和成功页码传递给will_paginate助手的任何额外参数组合。
目前(will_paginate 3.0.3),为了覆盖此默认行为,您需要编写自定义LinkRenderer类。下面是这样一个类的例子 - 它使用了可以传递给will_paginate视图助手的新的额外选项:base_link_url
。然后,在创建分页链接时,将传递的字符串用作基础。如果未传递:base_link_url
选项,则会回退到默认行为。
将以下类放在某个地方,rails可以在加载时找到它(例如/ lib,前提是你已将/ lib添加到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
用法:
# in your view
will_paginate collection, :renderer => CustomLinkRenderer, :base_link_url => '/anything/you/want'
现在回到你的案子。这时您可能会看到解决方案 - 您可以在一个页面上有两个具有不同基本网址的will_paginate小部件,为这两个网址传递不同的:base_link_url
选项。