部署到Heroku后Ruby on Rails用户注册错误排查求助
问题解决:Heroku部署后Devise注册报错(Missing host to link to)
问题本质
部署到Heroku后注册用户出现500错误,核心原因是Devise生成账户确认邮件时,生产环境未配置网站主机地址。本地开发用letter_opener时仅需相对路径即可打开链接,但生产环境发送邮件给用户必须生成完整的URL,缺少主机地址会导致模板渲染失败。
解决步骤
1. 配置生产环境的default_url_options
编辑config/environments/production.rb,添加Action Mailer的主机配置:
Rails.application.configure do # 保留原有配置,新增以下内容 config.action_mailer.default_url_options = { host: '你的Heroku应用域名' } # 示例:若应用域名为my-rails-app.herokuapp.com,写为: # config.action_mailer.default_url_options = { host: 'my-rails-app.herokuapp.com' } end
更灵活的环境变量方式(推荐)
如果担心域名变更,可通过环境变量配置:
# config/environments/production.rb config.action_mailer.default_url_options = { host: ENV['APP_HOST'] }
然后在Heroku控制台设置环境变量:
heroku config:set APP_HOST=your-app-name.herokuapp.com
2. 区分开发与生产环境的邮件投递方式
确保letter_opener仅在开发环境启用,生产环境使用实际邮件服务:
- 开发环境(
config/environments/development.rb):
config.action_mailer.delivery_method = :letter_opener
- 生产环境(
config/environments/production.rb):配置实际邮件服务(如SendGrid、Mailgun),示例:
config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { address: 'smtp.sendgrid.net', port: 587, user_name: ENV['SENDGRID_USERNAME'], password: ENV['SENDGRID_PASSWORD'], authentication: :plain, enable_starttls_auto: true }
3. 重新部署到Heroku
提交配置修改后重新部署:
git add . git commit -m "Fix Devise host configuration for production emails" git push heroku main
验证
部署完成后,尝试注册新用户,此时Devise能生成完整的确认链接,不会再触发500错误。
内容的提问来源于stack exchange,提问作者Dennis Akagha
相关产品推荐
相关产品推荐

