image_tag в почтовой программе не использует asset_host

#ruby-on-rails-3 #actionmailer

#ruby-on-rails-3 #actionmailer

Вопрос:

image_tag не использует asset_host, который я установил. Есть идеи, почему? Единственное, о чем я могу думать, это связано с тем, что это почтовая программа.

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;" %>
  

отображается как:

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

В консоли:

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

Мне нужен image_tag для создания полного URL пути, потому что он будет отображаться в электронном письме.

Комментарии:

1. попробуйте назначить хост ресурса следующим образом и посмотрите, работает ли ActionController ::Base.asset_host = » localhost: 3000 »

2. Согласно моим исследованиям, это использовалось для Rails2, а не Rails3.

3. api.rubyonrails.org/classes/ActionView/Helpers/… здесь они использовали его для настройки хоста ресурсов, а версия rails равна 3.07

Ответ №1:

Раньше я ошибался. Это решение, которое вам нужно (до rails 3.1, где конфигурации asset_host стали унифицированными):

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

Комментарии:

1. Похоже, что он никогда не был унифицирован. В Rails 3.2.8 мне все еще приходится устанавливать это отдельно в action_controller конфигурации.

2. Для этого есть ярлык, по крайней мере, в Rails 3.2: config.asset_host = 'localhost:3000' . Он устанавливает оба config.action_controller.asset_host и config.action_mailer.asset_host .

3. Похоже, это все еще необходимо для rails 4.

4. Все еще необходимо даже в Rails 5.

Ответ №2:

Нам нужно указать как config.action_controller.asset_host, так и config.action_mailer.asset_host в Rails 3.1 и 3.2.

Чтобы добавить имя хоста к image_tag как в представлениях электронной почты, так и в представлениях, отличных от электронной почты, добавьте следующее в свой файл среды:

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

Где ‘http://localhost:3000 ‘ следует заменить на URL вашего хоста (и порт, если применимо).

Это должно быть установлено как в action_controller, так и в action_mailer, даже в Rails 3.2.x .

Комментарии:

1. почему нам нужно config.action_controller.asset_host указывать, это другая форма config.action_mailer.asset_host ?

2. Один из них заключается в настройке менеджера активов для action view, другой — для action mailer. Вам нужно указать оба, чтобы веб-страницы и шаблоны электронной почты работали.

Ответ №3:

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

 # 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 amp;amp; include_host
      has_request = controller.respond_to?(:request)
      source = rewrite_host_and_protocol(source, has_request)
    end
end
  

Вот файл-нарушитель на GH:https://github.com/rails/rails/blob/master/actionpack/lib/action_view/helpers/asset_paths.rb

Поскольку в шаблоне представления ActionMailer отсутствует контроллер, вы не получите команду для перезаписи на основе asset_host. Вероятно, это должен быть тикет, открытый для основной команды Rails.

Вы можете попробовать следующую конфигурацию и посмотреть, поможет ли это:

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

Я почти уверен, что это сработает только для url_for .

Комментарии:

1. Да, похоже, это работает только для url_for. Хотелось бы, чтобы был способ сделать url_тег image_tag для («logo.png»)…

2. Я посмотрю, смогу ли я потратить немного времени на написание патча для этого.