We've moved discussions to Discord

action_mailer.default_url_options not defined in staging?

When deployed on Heroku with RAILS_ENV=staging, the "Forgot password" page (/users/password/new) returns an error 500:

ActionView::Template::Error
Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true

from app/views/devise/mailer/reset_password_instructions.html.erb at line 5:

<p><%= link_to t('.action'), edit_password_url(@resource, reset_password_token: @token) %></p>

---

This works fine in development and in production however, so it seems closely related to the staging environment.

For development:
action_mailer.default_url_options[:host] is set in config/environments/development.rb:

config.action_mailer.default_url_options = {host: "lvh.me", port: ENV.fetch("PORT", 3000).to_i}

For production:
config/initializers/mail.rb seems to set default_url_options[:host] as well:

if Rails.env.production?
  ActionMailer::Base.default_url_options[:host] = Jumpstart.config.domain

For staging:
Should I manually edit config/environments/staging.rb to add this?
config.action_mailer.default_url_options = {host: "lvh.me", port: ENV.fetch("PORT", 3000).to_i}

Or should I edit config/initializers/mail.rb like this?
if Rails.env.production? || Rails.env.staging?

Thanks!
Chris Oliver
The mail.rb initializer only configures Production, you can add additional ones there.

We might update the config so you can set each environment separately.
Kips Davenport
As some of the docs reference setting up a staging env, setting the environment config individually would probably avoid this sort of confusion.
When deployed on Heroku with RAILS_ENV=staging, the "Forgot password" page (/users/password/new) returns an error 500:

ActionView::Template::Error
Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true

from app/views/devise/mailer/reset_password_instructions.html.erb at line 5:

<p><%= link_to t('.action'), edit_password_url(@resource, reset_password_token: @token) %></p>

---

This works fine in development and in production however, so it seems closely related to the staging environment.

For development:
action_mailer.default_url_options[:host] is set in config/environments/development.rb:

config.action_mailer.default_url_options = {host: "lvh.me", port: ENV.fetch("PORT", 3000).to_i}

For production:
config/initializers/mail.rb seems to set default_url_options[:host] as well:

if Rails.env.production?
  ActionMailer::Base.default_url_options[:host] = Jumpstart.config.domain

For staging:
Should I manually edit config/environments/staging.rb to add this?
config.action_mailer.default_url_options = {host: "lvh.me", port: ENV.fetch("PORT", 3000).to_i}

Or should I edit config/initializers/mail.rb like this?
if Rails.env.production? || Rails.env.staging?

Thanks!
Chris Oliver
The mail.rb initializer only configures Production, you can add additional ones there.

We might update the config so you can set each environment separately.
Kips Davenport
As some of the docs reference setting up a staging env, setting the environment config individually would probably avoid this sort of confusion.
Notifications
You’re not receiving notifications from this thread.
© 2022 Jumpstart Pro by GoRails, LLC