Legacy应用will_paginate报错total_pages未定义如何临时修复
分页报错修复方案
错误原因
报错undefined method 'total_pages' for nil:NilClass是因为全局分页局部视图调用@paging.total_pages时,@paging变量未被正确赋值为空值,触发空对象方法调用错误。
快速修复方案(无需修改110个业务页面,仅需改动1处代码即可生效)
选择以下任意一种方案即可:
方案1:仅修改全局分页局部视图(推荐,改动最小)
把原局部视图开头的条件判断代码:
<% if @paging.total_pages > 1 %>
修改为带空值校验的写法:
# 若使用Ruby 2.3+ 支持安全调用符,可直接用此写法 <% if @paging&.total_pages&.> 1 %> # 老版本Ruby不支持&.的话,用兼容写法 <% if @paging && @paging.total_pages > 1 %>
修改后如果@paging为空,条件会直接返回false,不会渲染分页模块,不会触发报错。
如果需要更彻底的兜底,可以在全局分页局部视图最开头加入默认赋值逻辑,就算@paging未赋值也会自动生成一个空分页对象:
<% @paging ||= WillPaginate::Collection.new(1, 25, 0) %>
这个空分页对象总页数为0,不会触发分页渲染,完全规避空值报错。
方案2:全局控制器兜底(零视图改动)
在项目根控制器ApplicationController中加入全局兜底赋值逻辑,所有控制器都会自动继承该逻辑:
class ApplicationController < ActionController::Base # 其他原有逻辑... after_action do # 若@paging未被赋值,自动设置为空分页对象 @paging ||= WillPaginate::Collection.new(1, 25, 0) end end
该方案无需修改任何视图或业务控制器代码,全局生效。
后续重构建议
后续优化分页逻辑时,可以把分页赋值逻辑统一抽到父控制器层,无需每个业务页面手动执行@paging = @xxx_pages赋值,从根源避免变量遗漏赋值的问题。
内容的提问来源于stack exchange,提问作者Ben Bagley
相关产品推荐
相关产品推荐

