Rails获取成员嵌套路由参数时触发无限循环问题排查
问题根源与解决方向
核心问题:方法名冲突
Rails控制器(继承自ActionController::Base)本身内置了request方法,用于获取当前请求对象。你在ExperiencesController里自定义的request动作方法,直接覆盖了这个内置方法。无限循环触发逻辑
当你在自定义的request方法里访问params时,params的底层实现会调用控制器的request方法来获取请求参数。但此时request已经被你的方法覆盖,调用它就会再次执行你写的request方法,而方法里又会访问params,如此反复形成递归,最终导致栈溢出(SystemStackError)。
甚至发起GET ../experiences这类请求也会触发,是因为其他控制器动作在执行过程中,可能间接调用到request方法(比如处理请求参数、访问请求信息时),同样会触发你重写的request方法进入递归。解决方案
- 重命名控制器动作:把控制器里的
request方法改成其他名称,比如submit_request:def submit_request puts 'Loaded experience' puts 'params' puts params[:id] # 业务代码 end - 同步修改路由配置:确保路由里的动作名称和控制器方法名一致:
resources :experiences do post 'submit_request', on: :member end - 验证修复:执行
rails routes确认路由正确,再发起请求测试,递归循环会消失。
- 重命名控制器动作:把控制器里的
内容的提问来源于stack exchange,提问作者m3.b
相关产品推荐
相关产品推荐

