Rails控制台发控制器请求时如何查看Filter chain halted消息
Rails 3.2/4.2 控制台查看过滤器链中断提示方案
以下是两个版本通用的可落地操作步骤:
1. 开启控制器日志输出到控制台
默认Rails控制台不会输出控制器层的运行日志,首先执行以下代码开启日志打印,就能直接捕获Filter chain halted相关提示:
# 将控制器日志输出到控制台标准流 ActionController::Base.logger = Logger.new(STDOUT) # 日志等级设为DEBUG,确保能捕获过滤器运行的所有细节日志 ActionController::Base.logger.level = Logger::DEBUG
配置完成后再执行app.get('/foo')这类请求,控制台会直接输出完整的请求处理日志,包括具体是哪个过滤器中断了请求链、是否触发了重定向/渲染。
2. 无需日志的快速排查方法
如果临时不想开日志,也可以直接通过app对象的属性快速定位问题:
- 查看请求响应状态码:
app.response.status,30x代表重定向、40x代表客户端请求错误、50x代表服务端处理错误 - 查看重定向目标地址:
app.response.location,重定向响应会直接返回跳转的目标地址 - 查看完整响应内容:
app.response.body,可以直接查看服务端返回的错误提示或渲染内容
3. 版本专属适配配置
3.1 Rails 3.2 额外配置
如果开启日志后还是看不到过滤器中断提示,额外执行以下代码开启过滤器调试模式即可:
ActionController::Base.debug_filters = true
开启后会直接打印每个before过滤器的执行状态,明确标注哪个过滤器触发了中断。
3.2 Rails 4.2 额外配置
如果默认DEBUG日志没有输出过滤器中断细节,可以在执行完请求后,手动打印最后一次请求的过滤器执行状态:
# 获取最后一次请求对应的控制器实例 controller = app.controller # 遍历打印所有before过滤器的执行状态 controller._process_action_callbacks.each do |cb| puts "过滤器 #{cb.filter} 已中断请求链" if cb.kind == :before && cb.performed? end
内容的提问来源于stack exchange,提问作者Jellicle
相关产品推荐
相关产品推荐

