如何在Rails异步邮件程序中获取映像的完整URL?

时间:2013-03-19 02:06:41

标签: ruby-on-rails ruby-on-rails-3 asset-pipeline actionmailer

我希望我用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中有效的任何东西都应该没问题。

3 个答案:

答案 0 :(得分:43)

这是奇怪的行为,但我已经解决了这个问题。事实证明,除非action_mailer.asset_host以http://开头,否则它将被忽略。 actionpack/lib/action_view/helpers/asset_url_helper.rb中有一个正则表达式,用于定义有效的ActionMailer URI:

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。

答案 1 :(得分:9)

我相信您需要在配置中设置这些

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

答案 2 :(得分:2)

在你的环境文件中(即development.rb): -

config.action_mailer.asset_host = 'http://localhost:3000' #Or your domain
邮件程序视图文件中的

: -

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

<img src="<%= image_url('image.jpg') %>" %>