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) %>

しかし、レールはこのエラーを吐き続けます:

未定義のメソッド「total_pages」

4

1 に答える 1

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

これにより、ページごとにショップのリスト全体を選択して反復する必要がなくなり、きれいに改ページされ、より表現力豊かになります。

于 2013-08-19T00:52:47.967 に答える