Как получить полный URL-адрес изображения в асинхронной почтовой программе Rails?
Я хочу, чтобы сообщения электронной почты, отправленные с помощью ActionMailer, содержали изображения, которые ссылаются на мое приложение. В моей среде разработки, например:
<img src="http://myfullappurl.dev/assets/myimage.png">
У меня это в моем развитии .rb
config.action_controller.asset_host = 'myfullappurl.dev'
config.action_mailer.asset_host = config.action_controller.asset_host
config.action_mailer.default_url_options = { host: 'myfullappurl.dev', only_path: false }
Но я не могу заставить свои почтовые шаблоны отображать полный URL-адрес любым из этих способов:
asset_path('myimage.png')
asset_path('myimage.png', only_path: false)
image_url('myimage.png')
На множество подобных вопросов по этой теме можно ответить примерно так:
"#{request.protocol}#{request.host_with_port}#{asset_path('image.png')}"
Но поскольку мои письма отправляются асинхронно с Sidekiq, нет объекта request
, например, если бы они были отправлены синхронно в контроллере.
Есть ли очевидная вещь, которую я пропускаю, или мне нужно бороться с Rails, чтобы сделать это? Я использую Rails 4, но я уверен, что все, что работает в 3.1/3.2, должно делать только хорошо.
Ответы
Ответ 1
Ну, это странное поведение, но я решил эту проблему. Оказывается, что если action_mailer.asset_host не начинается с http://
, то он будет проигнорирован. В actionpack/lib/action_view/helpers/asset_url_helper.rb
существует Regex, который определяет допустимый URI ActionMailer:
URI_REGEXP = %r{^[-a-z]+://|^(?:cid|data):|^//}
Однако, если вы положите http://
перед action_controller.asset_host
, тогда вы получите ссылки на http://http://myfullappurl.dev
Итак, чтобы решить проблему, мне пришлось добавить следующее к моему development.rb
config.action_controller.asset_host = 'myfullappurl.dev'
config.action_mailer.asset_host = 'http://myfullappurl.dev'
Просто, чтобы быть ясным, это Rails 4.0.0beta1, при этом электронные письма отправляются асинхронно с Sidekiq, я не уверен, влияет ли это на Rails 3.
Ответ 2
Я считаю, что вам нужно установить их в своей конфигурации
config.action_controller.asset_host = 'http://localhost:3000' #Or your domain
config.action_mailer.asset_host = config.action_controller.asset_host
Ответ 3
в файле среды (i.e development.rb): -
config.action_mailer.asset_host = 'http://localhost:3000' #Or your domain
в вашем файле просмотра почты: -
<%= image_tag('image_name.jpg') %>
или
<img src="<%= image_url('image.jpg') %>" %>