次のような配列@ 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を使用してこれでページ分割を実行するにはどうすればよいですか?
もちろん、WillPaginate::Collection
コレクション全体で任意のページネーションを構築します。 values
という配列を想定すると、
@values = WillPaginate::Collection.create(current_page, per_page, values.length) do |pager|
pager.replace values
end
その後、@values
は、他のWillPaginateコレクションと同様に、will_paginate
ヘルパーを表示します。
参照 https://github.com/mislav/will_paginate/blob/master/lib/will_paginate/array.rb
ただrequire 'will_paginate/array'
試す前に、問題なく動作します。もし私だったら、それをconfig/initalizers/will_paginate_extensions.rb
なので、すぐにどこからでも利用できます。
Railsプロジェクトでcollection
配列を指定
will_paginate ~>3.0.5
collection.paginate(page: params[:page], per_page: 10)
配列値のページネーションを返します。
忘れないで require 'will_paginate/array'
コントローラーの上。
これは@ 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
私はこのスレッドで提供された答えに本当に満足していませんでした。
私はこの解決策を思いつきました。
# 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に依存しています。