Rails 3:#<Array:0xafd0660> 的未定义方法“page”

Posted

技术标签:

【中文标题】Rails 3:#<Array:0xafd0660> 的未定义方法“page”【英文标题】:Rails 3: undefined method `page' for #<Array:0xafd0660> 【发布时间】:2011-10-19 13:29:45 【问题描述】:

我无法克服这一点。我知道我已经读过数组没有页面方法,但我该怎么办?

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

有什么想法吗?

【问题讨论】:

注意:Rails 3 中的 Model.all 返回导致此问题的记录数组。 Rails 4+ 中的 Model.all 返回一个 ActiveRecord::Relation,您确实可以将 kaminari 范围、页面和每个链接到。 Rails Release notes 【参考方案1】:

No Array 没有页面方法。

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

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

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

【讨论】:

【参考方案2】:

Kaminari 现在有一种对数组进行分页的方法,因此您可以在控制器中执行以下操作:

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

【讨论】:

我得到了一个未定义的方法 "paginate_array" 用于 Kaminari:module 如何解决这个问题? @Þaw 听起来您使用的是旧版本的 Kaminari。【参考方案3】:

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

NoMethodError at /
undefined method `page' for # Array

您需要提醒自己两件事,您愿意分页的集合可以是 ArrayActiveRecordRelation,当然还有其他。 p>

要查看差异,假设我们的模型是 Product,并且我们在 products_controller.rb 上的 index 操作中。我们可以使用以下内容之一来构造我们的 @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]

【讨论】:

【参考方案4】:

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

Kaminari::Hooks.init

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于Rails 3:#<Array:0xafd0660> 的未定义方法“page”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 3 的占位符中使用 <br />?

Rails 3 - 通知和错误闪存不能部分呈现

Rails 3:“未定义的局部变量或方法”如果我将内容放在部分中

使用 rails 3 保存或更新模型时刷新 div

Rails 3:#<Array:0xafd0660> 的未定义方法“page”

Rails 3 - 关联