34

我有一个数组@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 对此进行分页?

4

5 回答 5

82

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

require 'will_paginate/array'在你尝试之前,它会工作得很好。如果是我,我会把它说出来,config/initalizers/will_paginate_extensions.rb这样它就可以立即从任何地方使用。

于 2012-11-02T00:15:49.027 回答
27

当然,您可以使用WillPaginate::Collection跨集合构建任意分页。假设一个名为 的数组values

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

然后,您可以@values像对待任何其他 WillPaginate 集合一样处理,包括将其传递给will_paginate视图助手。

于 2012-11-01T23:40:08.830 回答
6

collection在 Rails 项目中给定一个数组

will_paginate ~>3.0.5

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

返回数组值的分页。

不要忘记require 'will_paginate/array'在控制器的顶部。

于 2016-08-02T15:22:55.453 回答
2

这是我基于@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
于 2016-01-15T18:27:04.587 回答
0

我对这个线程中提供的答案并不满意。

我想出了这个解决方案。

# 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。

于 2019-01-13T15:27:35.650 回答