acts_as_follower上的数组的未定义方法`total_pages'

时间:2013-08-18 22:17:27

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 will-paginate

我想知道是否有人可以为此提供一些启示

我将 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'

1 个答案:

答案 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])

这可以防止您必须为每个页面选择并迭代整个商店列表,干净地分页,并且更具表现力。