Подтвердить что ты не робот

Как получить полный 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, должно делать только хорошо.

4b9b3361

Ответ 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') %>" %>