未定义的方法`page'for#<Array:0xafd0660>

Chr*_*ton 26 mongoid ruby-on-rails-3 kaminari

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

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

有任何想法吗?

Jam*_*hen 38

No Array没有页面方法.

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

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

Kaminari.paginate_array([1, 2, 3]).page(2).per(1)
Run Code Online (Sandbox Code Playgroud)


Dav*_*ens 11

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

myarray = Class.all
@results = Kaminari.paginate_array(myarray).page(params[:page])
Run Code Online (Sandbox Code Playgroud)


alo*_*cas 5

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

NoMethodError at /
undefined method `page' for # Array
Run Code Online (Sandbox Code Playgroud)

在那里您需要提醒自己两件事,您愿意分页的集合可以是ArrayActiveRecordRelation或者当然是其他东西。

要查看差异,假设我们的模型是 Product 并且我们在products_controller.rb上的索引操作中。我们可以使用以下内容之一构建我们的@products

@products = Product.all
Run Code Online (Sandbox Code Playgroud)

或者

@products = Product.where(title: 'title')
Run Code Online (Sandbox Code Playgroud)

或者别的什么……等等

无论哪种方式,我们都会获得您的@products,但是课程是不同的。

@products = Product.all
@products.class
=> Array
Run Code Online (Sandbox Code Playgroud)

@products = Product.where(title: 'title')
@products.class
=> Product::ActiveRecordRelation
Run Code Online (Sandbox Code Playgroud)

因此,根据集合的类别,我们愿意对 Kaminari 提供的内容进行分页:

@products = Product.where(title: 'title').page(page).per(per)
@products = Kaminari.paginate_array(Product.all).page(page).per(per)
Run Code Online (Sandbox Code Playgroud)

总结一下,一个向模型添加分页的好方法:

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
Run Code Online (Sandbox Code Playgroud)

在你想要分页的模型中(product.rb):

paginates_per 5
# Constants
PAGINATION_OPTIONS = [5, 10, 15, 20]
Run Code Online (Sandbox Code Playgroud)