0

我想知道是否有人可以对此有所了解

我正在使用带有will_paginate的acts_as_follower

控制器

@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”

4

1 回答 1

2

#paginate方法创建一个修饰的 WillPaginate 集合,其中包括对结果进行分页所需的信息。您只是通过收集 WillPaginate 数组并将它们展平为普通数组来创建一个数组,因此它们不会具有进行分页所需的所有装饰。这里快速、肮脏和错误的答案是获取您的 products 数组,并将其包装为分页集合:

@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])

这使您不必为每个页面选择和迭代整个商店列表,分页干净,并且更具表现力。

于 2013-08-19T00:52:47.967 回答