Ruby on Rails升级后Heroku环境Devise登录报错
Ruby 3.x + Rails 7.x 升级后Heroku登录500错误(Devise Trackable模块参数问题)
核心原因
这个错误是因为Ruby 3.x的参数校验更严格,加上Rails 7修改了ActiveRecord#save的参数签名——旧版本Devise的Trackable模块里用了save(false)这种位置参数调用,而Rails 7里save只接受关键字参数(比如save(validate: false)),所以触发了ArgumentError(传入1个参数但预期0个)。
本地测试正常大概率是两种情况:要么本地的Devise版本已经是兼容的,要么你的本地测试没覆盖到Trackable触发save的登录流程。
解决步骤
1. 升级Devise到兼容Rails 7的版本
Devise 4.8.0及以上版本已经修复了这个问题,把旧的save(false)改成了save(validate: false)。
- 修改Gemfile:
gem 'devise', '~> 4.9.0' # 用最新稳定版也可以,只要兼容Rails 7 - 本地更新依赖:
bundle update devise - 提交Gemfile和Gemfile.lock到代码仓库,重新部署到Heroku
2. 检查自定义Trackable代码
如果项目中重写了Devise Trackable的方法(比如update_tracked_fields!),搜索代码里的save调用,做如下替换:
- 将
save(false)替换为save(validate: false) - 将
save(true)替换为save(validate: true)(或直接调用save,默认就是验证状态)
3. 确认Heroku上的Devise版本
部署完成后,通过Heroku CLI确认版本是否符合要求:
heroku run bundle show devise --app 你的staging应用名
版本必须≥4.8.0
验证
重新触发登录流程,查看Heroku日志是否仍有错误。通常升级Devise后即可解决该问题。
内容的提问来源于stack exchange,提问作者Victor Athoti.
相关产品推荐
相关产品推荐

