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
您需要提醒自己两件事,您愿意分页的集合可以是 Array 或 ActiveRecordRelation,当然还有其他。 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:“未定义的局部变量或方法”如果我将内容放在部分中