Search code examples
ruby-on-railsactionmailerhostnameactioncontroller

How do I configure the hostname for Rails ActionMailer?


I'm working on a fairly traditional forgot password email - I want to email the user a password change token embedded in a link that they can click on in order to change their password. I'm emailing via the traditional ActionMailer.

If I use a normal link_to tag

<%= link_to "click here", :controller => foo, :action => 'bar', :token => token %>

I get a relative link - rather useless from an email.

If I add in

:only_path => false, then it errors saying I need to set default_url_options[:host]. The ActionController docs imply that you do that by overriding the #default_url_options methods in your controller. Surely there's a configuration option to tell Rails what it's hostname is without adding my own config file, parsing it, etc?


Solution

  • default_url_options is available from config.action_mailer and should be set in your environment's configuration file.

    For example, in config/environments/production.rb:

    config.action_mailer.default_url_options = {
      :host => 'www.yourdomain.com'
    }
    

    For local testing, modify config/environments/development.rb:

    config.action_mailer.default_url_options = {
      :host => '127.0.0.1',
      :port => 3000
    }
    

    Then, assuming you have a named route called forgot_password_login, you can generate the login link URL in your mailer using something like this:

    forgot_password_login_url(:token => 'a7s8q15sk2...')