使用will_paginate在Ruby中分页数组

时间:2012-11-01 23:29:20

标签: ruby-on-rails ruby ruby-on-rails-3 will-paginate kaminari

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

5 个答案:

答案 0 :(得分:78)

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

在尝试之前只需require 'will_paginate/array'即可。如果是我,我会把它放在config/initalizers/will_paginate_extensions.rb说,所以它可以立即在任何地方使用。

答案 1 :(得分:26)

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

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

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

答案 2 :(得分:5)

在Rails项目中给出will_paginate ~>3.0.5 collection.paginate(page: params[:page], per_page: 10) 数组

require 'will_paginate/array'

返回数组值的分页。

不要忘记控制器顶部的{{1}}。

答案 3 :(得分: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

答案 4 :(得分: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。