web-dev-qa-db-ja.com

Ruby will_paginateで配列をページ分割する

次のような配列@ level1があります:

[[3.0, 4, 2], [2.0, 48, 3], [2.1, 56, 4], ............]

この配列にページ分割を適用して、各ページに一度に数行しか表示されないようにします。私はこれを試しました:

@temp1 = @level1.paginate(:page => params[:page])

ただし、次のエラーがスローされます。

undefined method `paginate' for [[3.0, 4, 2], [2.0, 48, 3], [2.1, 56, 4]]:Array

Will_paginateを使用してこれでページ分割を実行するにはどうすればよいですか?

33
Pi Horse

もちろん、WillPaginate::Collectionコレクション全体で任意のページネーションを構築します。 valuesという配列を想定すると、

@values = WillPaginate::Collection.create(current_page, per_page, values.length) do |pager|
  pager.replace values
end

その後、@valuesは、他のWillPaginateコレクションと同様に、will_paginateヘルパーを表示します。

26
Chris Heald

参照 https://github.com/mislav/will_paginate/blob/master/lib/will_paginate/array.rb

ただrequire 'will_paginate/array'試す前に、問題なく動作します。もし私だったら、それをconfig/initalizers/will_paginate_extensions.rbなので、すぐにどこからでも利用できます。

78

Railsプロジェクトでcollection配列を指定

will_paginate ~>3.0.5

collection.paginate(page: params[:page], per_page: 10)

配列値のページネーションを返します。

忘れないで require 'will_paginate/array'コントローラーの上。

5

これは@ chris-healdの回答に基づいた私の例です

products = %w(i love Ruby on Rails)
@products = WillPaginate::Collection.create(params[:page], params[:per_page], products.length) do |pager|
   pager.replace products[pager.offset, pager.per_page]
end
2
Alberto Camargo

私はこのスレッドで提供された答えに本当に満足していませんでした。

私はこの解決策を思いつきました。

# app/lib/paged_array.rb

require 'will_paginate/array'

class PagedArray
  delegate_missing_to :@paged_collection

  def initialize(collection, page: 1, per_page: 20)
    @paged_collection = collection.paginate(
      page: page,
      per_page: per_page
    )
  end
end

そして、あなたはそれをそのように使うことができます:

superheroes = %w[spiderman batman superman ironman]

PagedArray.new(superheroes, page: 1, per_page: 2)

このソリューションは明示的であり、標準クラスを汚染しないため、このソリューションが好きです。

とはいえ、私は「delegate_missing_to」を使用しているため、Railsに依存しています。

0
Jeremie Ges