邮件中的 image_tag 不使用asset_host

Posted

技术标签:

【中文标题】邮件中的 image_tag 不使用asset_host【英文标题】:image_tag in mailer not using asset_host 【发布时间】:2011-08-10 00:51:25 【问题描述】:

image_tag 没有使用我设置的asset_host。任何想法为什么?我唯一能想到的就是它与成为 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;" %>

呈现为:

<img  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,因为它将显示在电子邮件中。

【问题讨论】:

尝试按以下方式分配资产主机,看看是否有效 ActionController::Base.asset_host = "localhost:3000" 根据我的研究,它用于 Rails2,而不是 Rails3。 api.rubyonrails.org/classes/ActionView/Helpers/… 这里他们用它来设置资产主机,rails 版本是 3.07 【参考方案1】:

关于为什么你不能这样做的违规代码在这里:

# 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

这是 GH 上的违规文件:https://github.com/rails/rails/blob/master/actionpack/lib/action_view/helpers/asset_paths.rb

由于 ActionMailer 视图模板缺少控制器,因此您无法获得基于资产主机重写的命令。这应该是向 Rails 核心团队开放的一张票。

您可以尝试以下配置,看看是否有帮助:

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

我很确定它只适用于url_for

【讨论】:

是的,看起来它只适用于 url_for。希望有办法做 image_tag url_for("logo.png")... 我看看能不能凑个时间给它写个补丁。【参考方案2】:

我之前错了。这是您需要的解决方案(直到 rails 3.1,asset_host 配置变得统一):

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

【讨论】:

它似乎从未统一过。在 Rails 3.2.8 上,我仍然需要将其单独设置为 action_controller 配置。 至少在 Rails 3.2 中有一个快捷方式:config.asset_host = 'localhost:3000'。它同时设置了config.action_controller.asset_hostconfig.action_mailer.asset_host 似乎这对于 Rails 4 来说仍然是必要的。 即使在 Rails 5 中仍然需要。【参考方案3】:

我们需要在 Rails 3.1 和 3.2 上同时指定 config.action_controller.asset_host 和 config.action_mailer.asset_host。

要将主机名添加到电子邮件和非电子邮件视图的 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 中也是如此。

【讨论】:

为什么我们需要config.action_controller.asset_host来指定,它与config.action_mailer.asset_host的形式不同吗? 一个为action view设置asset manager,另一个为action mailer。您需要同时指定网页和电子邮件模板才能正常工作。

以上是关于邮件中的 image_tag 不使用asset_host的主要内容,如果未能解决你的问题,请参考以下文章

使用 image_tag 显示通过 CarrierWave 上传的图像

带有回形针的markdown中的image_tag

裁剪和调整图像大小 - 是不是可以使用 <%= image_tag %> 设置背景图像?

image_tag 未在 aws beanstalk 生产模式下显示图像

Rails 测试:在视图上测试 image_tag

Rails:将请求标头添加到 image_tag