在 Ruby on Rails 中,total_pages
方法通常与分页库(如 Kaminari 或 WillPaginate)一起使用。如果你在使用分页时遇到 undefined method 'total_pages' for #<PG::Result:0x007f3ede39dae0>
错误,可能是因为你直接在 PostgreSQL 查询结果上调用了分页方法,而不是在 ActiveRecord 关系对象上调用。
以下是一些可能的解决方案和检查步骤:
分页方法(如 total_pages
)应该在 ActiveRecord 关系对象上调用,而不是在原始 SQL 查询结果上调用。确保你在 ActiveRecord 查询上调用分页方法。例如:
# 错误的做法
result = ActiveRecord::Base.connection.execute("SELECT * FROM users")
result.total_pages # 这会导致错误
# 正确的做法
users = User.all.page(params[:page])
users.total_pages # 这应该可以正常工作
确保你已经安装并配置了分页库,如 Kaminari 或 WillPaginate。
在 Gemfile 中添加 Kaminari:
gem 'kaminari'
然后运行 bundle install
。
在控制器中使用 Kaminari:
class UsersController < ApplicationController
def index
@users = User.page(params[:page]).per(10)
end
end
在视图中渲染分页链接:
<%= paginate @users %>
在 Gemfile 中添加 WillPaginate:
gem 'will_paginate', '~> 3.1.0'
然后运行 bundle install
。
在控制器中使用 WillPaginate:
class UsersController < ApplicationController
def index
@users = User.paginate(page: params[:page], per_page: 10)
end
end
在视图中渲染分页链接:
<%= will_paginate @users %>
确保你没有直接在原始 SQL 查询结果上调用分页方法。原始 SQL 查询返回的是 PG::Result
对象,而不是 ActiveRecord 关系对象。你应该使用 ActiveRecord 查询方法来获取结果。
如果你仍然遇到问题,可以在控制器中添加一些调试代码来检查对象的类型:
class UsersController < ApplicationController
def index
@users = User.page(params[:page]).per(10)
Rails.logger.debug @users.class.name # 应该输出 ActiveRecord::Relation
Rails.logger.debug @users.total_pages # 检查 total_pages 方法是否可用
end
end