如何取消控制器中super调用的redirect_to并替换为render?
解决DoorKeeper控制器重定向替换问题
- 核心思路:先清空super触发的重定向响应,再执行自定义渲染
调用super后,Doorkeeper已经给response设置了重定向规则,直接调用render会被之前的重定向覆盖。这时候可以用response.reset清空当前响应的所有状态(包括重定向头、状态码),之后再调用render就能生效。
示例代码:
class YourCustomController < Doorkeeper::AuthorizationsController # 假设继承的是这个控制器 def new super # 重置已有响应,清除重定向设置 response.reset # 渲染自定义模板或内容 render 'custom_auth/new', locals: { some_var: 'value' } end end
为什么直接赋值新Response没用?
Rails控制器的response是和当前请求上下文绑定的实例,直接替换成新的ActionDispatch::Response.new不会被Rails的请求处理流程识别,而response.reset是修改当前绑定的响应实例,清空所有之前的设置,让后续的render能重新构建响应。额外提醒
如果super里有设置flash消息或其他上下文数据,你可以根据需求选择保留(比如flash.keep)或者清空,避免影响自定义渲染的页面。
内容的提问来源于stack exchange,提问作者B Seven
相关产品推荐
相关产品推荐

