对于#<array:0xafd0660> </array:0xafd0660>的未定义方法`page'

时间:2011-08-03 23:44:04

标签: ruby-on-rails-3 mongoid kaminari

我无法超越这个。我知道我已经读过没有数组的页面方法,但我该怎么办?

如果我在控制台中运行Class.all,则返回#,但如果我运行Class.all.page(1),则会出现上述错误。

有什么想法吗?

5 个答案:

答案 0 :(得分:37)

No Array没有页面方法。

看起来你正在使用kaminari。 Class.all返回一个数组,因此你无法在其上调用页面。相反,直接使用Class.page(1)。

对于普通数组,kaminari有一个很好的辅助方法:

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

答案 1 :(得分:11)

Kaminari现在有一种分组数组的方法,所以你可以在你的控制器中做这样的事情:

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

答案 2 :(得分:3)

当您获得Array的未定义方法页面时,可能您使用的是 kaminari gem,并且您正尝试在控制器操作中对模型进行分页。

NoMethodError at /
undefined method `page' for # Array

你需要提醒自己两件事情,你愿意分页的集合可能是数组 ActiveRecordRelation ,或者是其他东西。

要了解其中的差异,我们可以说我们的模型是Product,我们在 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

因此,根据集合的类别,我们愿意为Kaminari提供分页:

@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]

答案 3 :(得分:1)

我通过手动调用Kaminari的钩子来解决这个问题。添加此行以在您的第一个初始化程序中运行:

Kaminari::Hooks.init

我在另一个答案中发布了更多详细信息:

undefined method page for #<Array:0xc347540> kaminari "page" error. rails_admin

答案 4 :(得分:0)

我有同样的错误。捆绑更新然后重新启动服务器。其中一个修好了它。