我想知道是否有人可以为此提供一些启示
我将 acts_as_follower 与 will_paginate
一起使用控制器
@products = current_user.following_shops.includes(:products).collect{|u| u.products.paginate(:page => params[:page]).order("created_at DESC")}.flatten
查看
<table>
<% @products.each do |p| %>
<tr>
<td>
<%= image_tag p.shop.logo.url(:thumb_feed).to_s %>
</td>
<td>
<%= link_to(image_tag(p.f1.url(:table).to_s), product_path(p.id)) %>
<%= link_to p.name, product_path(p.id)%>
</td>
</tr>
<% end %>
</table>
<%= will_paginate(@products) %>
但是rails继续吐出这个错误:
的未定义方法`total_pages'
答案 0 :(得分:2)
#paginate
方法创建一个装饰的WillPaginate集合,其中包含翻阅结果所需的信息。你只是通过收集WillPaginate数组并将它们展平成一个正常数组来创建一个数组,因此它们没有必要的装饰来进行分页。这里的快速,肮脏和错误的答案是获取您的产品数组,并将其包装为分页集合:
@products = WillPaginate::Collection.create(current_page, per_page, @products.length) do |pager|
pager.replace @products
end
你在这里做了一个相当不正统的行动,而且效率很低;看起来你想要在给定用户的所有商店中获得所有产品,并通过它们进行分页,对吧?如果是这种情况,您可能想采取不同的方法。
首先,设置一个has_many :through
关联,通过您关注的商店协会获取这些产品(这种语法可能需要一些工作;我的ActiveRecord生锈了):
class User
has_many :following_products, through: :following_shops, class_name: "Product"
end
然后对该关联进行分页:
current_user.following_products.order("created_at DESC").paginate(page: params[:page])
这可以防止您必须为每个页面选择并迭代整个商店列表,干净地分页,并且更具表现力。