55

image_tag isn't using the asset_host I've set. Any ideas why? The only thing I can think of is it having to do with it being a Mailer.

config/environment/development.rb

config.action_controller.asset_host = "http://localhost:3000"

myMailer.rb

<%= image_tag "logo.png", :style=>"margin-left:10px; padding-bottom:15px;" %>

rendered as:

<img alt="Logo" src="/images/logo.png?1303090162" style="margin-left:10px; padding-bottom:15px;" />

In console:

> MyApp::Application.config.action_controller
#<OrderedHash {… :asset_host=>"http://localhost:3000", …}>

I need the image_tag to create a full path url because it will be showing up in an email.

Patrick Robertson
  • 2,306
  • 16
  • 12
RyanJM
  • 7,028
  • 8
  • 60
  • 90

3 Answers3

95

I was wrong before. This is the solution you need (until rails 3.1 where the asset_host configurations become unified):

config.action_mailer.asset_host = "http://localhost:3000"
Patrick Robertson
  • 2,306
  • 16
  • 12
22

We need to specify both config.action_controller.asset_host and config.action_mailer.asset_host, on Rails 3.1 and 3.2.

To add the hostname to the image_tag on both e-mail and non-email views, add the following to your environment file:

config.action_controller.asset_host = 'http://localhost:3000'
config.action_mailer.asset_host = config.action_controller.asset_host

Where 'http://localhost:3000' should be replaced by your host URL (and port if applicable).

This needs to be set on both action_controller and action_mailer, even in Rails 3.2.x.

Tiago Franco
  • 1,016
  • 10
  • 19
  • why we need `config.action_controller.asset_host` to specify, is it different form `config.action_mailer.asset_host` ? – Aamir Jun 09 '16 at 05:55
  • 1
    One is to set the asset manager for action view, the other for action mailer. You need to specify both in order for the web pages and email templates to work. – Tiago Franco Jul 25 '16 at 23:05
0

The offending code as to why you can't do it is here:

# actionpack/lib/action_view/helpers/asset_paths.rb, line 27
def compute_public_path(source, dir, ext = nil, include_host = true)
  # More code up here....

    if controller && include_host
      has_request = controller.respond_to?(:request)
      source = rewrite_host_and_protocol(source, has_request)
    end
end

Here is the offending file on GH: https://github.com/rails/rails/blob/master/actionpack/lib/action_view/helpers/asset_paths.rb

Since an ActionMailer View template lacks a Controller, you don't get the command to rewrite based on an asset_host. This should probably be a ticket opened to the Rails core team.

You can try the following config and see if it helps:

config.action_mailer.default_url_options = {:host=>"localhost", :port=>3000, :protocol=>"http://"}

I'm pretty sure it's only going to work for url_for though.

Hannes
  • 2,451
  • 2
  • 18
  • 11
Patrick Robertson
  • 2,306
  • 16
  • 12