Как получить полный URL-адрес изображения в асинхронной почтовой программе Rails?

Я хочу, чтобы электронные письма, которые я отправляю с помощью ActionMailer, содержали изображения, ссылающиеся на мое приложение. В моей среде разработки, например:

<img src="http://myfullappurl.dev/assets/myimage.png">

У меня есть это в моем development.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, должно работать нормально.


person Chris Aitchison    schedule 19.03.2013    source источник


Ответы (3)


Ну, это странное поведение, но я решил эту проблему. Оказывается, если action_mailer.asset_host не начинается с http://, то он будет проигнорирован. В actionpack/lib/action_view/helpers/asset_url_helper.rb есть регулярное выражение, определяющее действительный 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.

person Chris Aitchison    schedule 21.03.2013
comment
СПАСИБО. Это было решение для того, чтобы рельсы 4.1.1 отображали полные URL-адреса изображений в электронных письмах HTML. - person Austin Pray; 24.06.2014
comment
еще один недооцененный ответ на SO. Кроме того, я думаю, что в большинстве случаев лучше использовать https, а не dev env. - person Hertzel Guinness; 19.04.2015
comment
У меня не возникло никаких проблем при добавлении протокола в action_controller.asset_host, не уверен, что это поведение изменилось. Само исправление работает так же, как описано. :) - person lime; 30.06.2015
comment
@lime, с какими версиями Rails вы работаете? Рад слышать, что поведение изменилось :) - person Chris Aitchison; 01.07.2015
comment
@cmaitchison У меня 4.2, хотя я не нашел никаких изменений в asset_url_helper, которые объясняли бы разницу. Будем надеяться, что больше не появится. - person lime; 01.07.2015
comment
Спасибо за этот ответ. Я использую Rails 5.0.6, и у меня все еще была эта проблема. - person Adam Colvin; 11.03.2018

Я считаю, что вам нужно установить их в своей конфигурации

config.action_controller.asset_host = 'http://localhost:3000' #Or your domain
config.action_mailer.asset_host = config.action_controller.asset_host
person Josh Wilson    schedule 19.03.2013
comment
У меня такие настроены. Использование Pow в dev, отсюда и расширение .dev. - person Chris Aitchison; 19.03.2013

в файле вашей среды (например, development.rb): -

config.action_mailer.asset_host = 'http://localhost:3000' #Or your domain

в вашем файле представления почтовой программы: -

<%= image_tag('image_name.jpg') %>

or

<img src="<%= image_url('image.jpg') %>" %>
person sahilbathla    schedule 24.06.2014