web-dev-qa-db-ja.com

Rails 3:#<Array:0xafd0660>の未定義のメソッド `page '

私はこれを乗り越えることができません。配列のページメソッドがないことを読んだことは知っていますが、どうすればよいですか?

コンソールでClass.allを実行すると、#が返されますが、Class.all.page(1)を実行すると、上記のエラーが発生します。

何か案は?

26
Chris Bolton

配列にはページメソッドがありません。

カミナリを使用しているようです。 Class.allは配列を返すため、ページを呼び出すことはできません。代わりに、Class.page(1)を直接使用してください。

通常の配列の場合、kaminariには優れたヘルパーメソッドがあります。

Kaminari.paginate_array([1, 2, 3]).page(2).per(1)
38
James Chen

Kaminariに配列をページ付けするメソッドが追加されたため、コントローラーで次のような操作を実行できます。

myarray = Class.all
@results = Kaminari.paginate_array(myarray).page(params[:page])
11
DaveStephens

Arrayの未定義のメソッドページが表示された場合は、おそらくkaminari gemを使用していて、コントローラーアクション内でモデルをページ分割しようとしています。

NoMethodError at /
undefined method `page' for # Array

そこで、ページ付けするコレクションはArrayまたはActiveRecordRelation、あるいはもちろん他の何かである可能性があることを2つ思い出す必要があります。

違いを確認するために、モデルがProductであり、indexアクションのproducts_controller.rb内にあるとします。 @ productsを次のいずれかで作成できます。

@products = Product.all

または

@products = Product.where(title: 'title')

または何か他のもの...など

どちらの方法でも@productsを取得できますただしクラスは異なります。

@products = Product.all
@products.class
=> Array

および

@products = Product.where(title: 'title')
@products.class
=> Product::ActiveRecordRelation

したがって、コレクションのクラスに応じて、カミナリが提供するページを喜んでページ付けします。

@products = Product.where(title: 'title').page(page).per(per)
@products = Kaminari.paginate_array(Product.all).page(page).per(per)

少し要約すると、モデルにページネーションを追加する良い方法です:

def index
  page = params[:page] || 1
  per  = params[:per]  || Product::PAGINATION_OPTIONS.first
  @products = Product.paginate_array(Product.all).page(page).per(per)

  respond_to do |format|
    format.html
  end

end

そして、ページ付けしたいモデル内(product.rb):

paginates_per 5
# Constants
PAGINATION_OPTIONS = [5, 10, 15, 20]
4
aloucas

カミナリのフックを手動で呼び出すことで問題を修正しました。この行を追加して、最初の初期化子の1つで実行します。

Kaminari::Hooks.init

私は別の回答で詳細を投稿しました:

#<Array:0xc347540> kaminari "page"エラーの未定義のメソッドページ。Rails_admin

1
joelvh

同じエラーが発生しました。バンドルの更新を行った後、サーバーを再起動しました。 2つのうちの1つがそれを修正しました。

0
Bashar Abdullah