Heroku部署的Rails应用Devise忘记密码未显示用户不存在错误
问题分析
从日志可以看到,生产环境触发了500内部服务器错误,根源是TurboDeviseController::Responder里调用了未定义的rendering_options方法/变量,导致Devise无法正常处理“用户不存在”的场景,直接抛出系统错误,而非显示模型级别的错误提示。
解决方案
1. 修复Turbo Devise控制器的错误
打开app/controllers/turbo_devise_controller.rb,找到to_turbo_stream方法的rescue块,修正未定义的rendering_options:
替换为正确的渲染逻辑:
class TurboDeviseController < DeviseController class Responder < Devise::Responder def to_turbo_stream controller.render(options.merge(formats: :html)) rescue ActionView::MissingTemplate => e # 直接构造渲染参数,避免使用未定义的变量 controller.render( template: "devise/#{controller.action_name}", formats: :html, status: :unprocessable_entity ) end end self.responder = Responder respond_to :html, :turbo_stream end
2. 确保Devise错误提示正常显示
你的忘记密码视图已经包含了Devise错误信息渲染:
<%= render "devise/shared/error_messages", resource: resource %>
修复500错误后,Devise的passwords#create动作会在找不到用户时,自动给resource添加“用户不存在”的错误信息,视图会正常渲染该提示。
3. 部署验证
将修复后的代码部署到Heroku:
git add app/controllers/turbo_devise_controller.rb git commit -m "Fix undefined rendering_options in TurboDeviseResponder" git push heroku main
测试输入不存在的邮箱,此时应该显示“用户不存在”的提示,而非系统错误页面。
内容的提问来源于stack exchange,提问作者aiem2
相关产品推荐
相关产品推荐

