Rails 6.1.4运行rails test触发render含.弃用警告如何解决?
解决方案
你可以直接修改控制器中的render代码为如下写法即可同时满足所有要求:
# 加return确保后续控制器逻辑不会执行 return render( template: '/actions/action_success', formats: [:json], locals: { view: action.lookup_view('default'), action: action, area: current_area, account: current_account } )
问题原因说明
- 弃用警告触发原因:Rails 7.1+ 版本已废弃在render的模板路径参数中直接携带
.后缀的写法,避免将格式、模板处理器后缀误识别为模板名称的一部分,你之前把.json写在路径里就触发了该警告。 - 去掉后缀后模板缺失报错原因:你当前的测试请求默认走HTML格式,Rails会自动匹配对应格式的模板,找不到
action_success.html.*的模板就会报错,显式指定formats: [:json]即可让Rails正确匹配你存在的action_success.json.jbuilder模板。 - 不要使用
ApplicationController.render的原因:该方法是离线渲染接口,设计用于在控制器请求上下文之外渲染模板,不会终止当前请求的控制器执行流程,自然会出现后续代码继续运行、最终重复渲染或报no_content错误的问题,直接使用控制器实例自带的render方法即可。 - 控制器逻辑终止实现:只需要在
render前加return即可,这是Rails控制器渲染后终止后续逻辑的标准写法,不会有额外副作用。
可选优化方案
如果该接口固定返回JSON格式,你也可以在对应路由规则中添加defaults: { format: :json }限定,后续同路由下的所有render调用都不需要再单独指定formats: [:json]参数。
内容的提问来源于stack exchange,提问作者B-M
相关产品推荐
相关产品推荐

