Rails: activeadmin,#<ActiveRecord::Relation:0x4d15ee0>没有定义方法“per”

18

我成功安装了 ActiveAdmin:

我的 gemfile 代码:

source 'https://rubygems.org'

 gem 'rails', '3.2.10'

 # Bundle edge Rails instead:
 # gem 'rails', :git => 'git://github.com/rails/rails.git'

 gem 'sqlite3'


 # Gems used only for assets and not required
 # in production environments by default.
 group :assets do
   gem 'sass-rails',   '~> 3.2.3'
   gem 'coffee-rails', '~> 3.2.1'

   # See https://github.com/sstephenson/execjs#readme for more supported runtimes
   # gem 'therubyracer', :platforms => :ruby

   gem 'uglifier', '>= 1.0.3'
 end

 gem 'jquery-rails'

 gem 'twitter-bootstrap-rails'

 gem 'activeadmin'

  # gem "meta_search",    '>= 1.1.0.pre'
 gem "spud_photos"
 gem 'devise'

 gem 'cancan'
 gem 'rolify'

然后我做了这件事:

 bundle
 rails g active_admin:install
 rake db:migrate
 rails g active_admin:resource product

我将一些模型与ActiveAdmin连接了起来。

在仪表板上单击产品链接后出现错误:

 undefined method `per' for #<ActiveRecord::Relation:0x4d15ee0>

这个对我很有帮助:http://tech-brains.blogspot.in/2012/11/kaminari-willpaginate-incompatibility.html - RAJ
8个回答

41

Active Admin需要使用kaminari分页。如果您想使用will_paginate,可以创建别名以匹配kaminari函数:

# config/initializers/will_paginate.rb
if defined?(WillPaginate)
  module WillPaginate
    module ActiveRecord
      module RelationMethods
        alias_method :per, :per_page
        alias_method :num_pages, :total_pages
      end
    end
  end
end

module ActiveRecord
  class Relation
    alias_method :total_count, :count
  end
end

而且这一个对我有用。


3
太好了,它对我有效,谢谢,请批准这个。 - Asnad Atta

26

这个帮了我:

 if defined?(WillPaginate)
   ActiveSupport.on_load :active_record do
     module WillPaginate
       module ActiveRecord
         module RelationMethods
           def per(value = nil) per_page(value) end
           def total_count() count end
         end
       end
       module CollectionMethods
         alias_method :num_pages, :total_pages
       end
     end
   end
 end

不要忘记提醒将此代码添加到文件中并将其粘贴到config/initializers文件夹中。我会将文件命名为will_paginate.rb,但您可以使用任何您喜欢的名称,以便提醒您它的用途。 - JCC
请重新启动服务器,并确保不要忘记这个步骤。 - truongnm
这个解决方案解决了我的问题,谢谢!适用于2018年! 我的 Gemfilegem 'will_paginate', '~> 3.1.1', 没有 gem kaminari(will_paginate 与 kaminari 冲突) 但是在 Gemfile.lock 中我看到 administrate 正在使用 kaminari。 无论如何,我把这些代码放到了 config/initializers/will_paginate.rb 中,它就工作了! - NamNamNam

11

您可以像这样为Kaminari创建一个Initializer:

Kaminari.configure do |config|
  config.page_method_name = :per_page_kaminari
end

根据我的经验,我需要重启服务器才能使它正常工作。就这样。


5
上述答案已经过时。@zitoon在这里提供了更新的答案:
if defined?(WillPaginate)
  module WillPaginate
    module ActiveRecord
      module RelationMethods
        def per(value = nil) per_page(value) end
        def total_count() count end
      end
    end
    module CollectionMethods
      alias_method :num_pages, :total_pages
    end
  end
end

我亲自尝试过,有效。


4
我使用的是Ruby 2.1.5p273和Rails 4.1.8。我遇到了相同的问题。@mohamed-ibrahim的答案解决了错误"underfined method 'per'",但出现了另一个错误。
在c:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/bundler/gems/activeadmin-06bf79c58216/app/views/active_admin/resource/index.html.arb中显示,第二行引发了错误:参数错误(0个用于1个)。
添加alias_method :total_count, :count即可解决它。
if defined?(WillPaginate)
  module WillPaginate
    module ActiveRecord
      module RelationMethods
        alias_method :per, :per_page
        alias_method :num_pages, :total_pages
        alias_method :total_count, :count
      end
    end
  end
end

4
如果你同时使用kaminari和will_paginate,你肯定会遇到这个错误。简而言之,kaminari和will_paginate是不兼容的。如果你正在使用rails_admin(它使用kaminari进行分页)并且还使用will_paginate,那么你需要将下面的代码添加到config目录下的任一initializer文件中,或者创建一个名为“will_paginate”的新文件,将代码添加进去,并将其放置在initializers目录下。
if defined?(WillPaginate)
  module WillPaginate
    module ActiveRecord
      module RelationMethods
        def per(value = nil) per_page(value) end
        def total_count() count end
      end
    end
    module CollectionMethods
      alias_method :num_pages, :total_pages
    end
  end
end

这是唯一一个没有给我“方法丢失”错误的答案,使用Rails 5.2 ruby 2.5。 - Randall Coding

0

这对我很有用:

initializers/will_paginate.rb

if defined?(WillPaginate)
  module WillPaginate
    module ActiveRecord
      module RelationMethods
        alias_method :per, :per_page
        alias_method :num_pages, :total_pages
        alias_method :total_count, :total_entries
      end
    end
  end
end

0

我曾经遇到同样的问题,并在我的应用程序中从WillPaginate切换到了Kaminari。

这是一个简单的更改:paginate(page:1,per_page:10)变成了page(1)。per(10)

我想这取决于willPaginate与您的应用程序深度融合的程度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接