【问题标题】:Rails 3: undefined method `page' for #<Array:0xafd0660>Rails 3:#<Array:0xafd0660> 的未定义方法“page”
【发布时间】: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

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


【解决方案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】:

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

        【讨论】:

          猜你喜欢
          • 2013-06-05
          • 2012-06-30
          • 2012-05-28
          • 1970-01-01
          • 2011-04-22
          • 2015-08-23
          • 1970-01-01
          • 1970-01-01
          • 2012-02-26
          相关资源
          最近更新 更多