Rails 3.1:在邮件程序视图文件中显示图像时出现问题

时间:2011-10-18 15:52:28

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

我正在使用Ruby on Rails 3.1,我想将我的网站徽标(即通过新资产管道处理的图像)添加到电子邮件中。

如果在我的邮件程序视图文件中,我说明了以下内容:

<% # Note: '@root_url' is my application hostname (eg: http://www.mysite.com) %>
<%= link_to image_tag( "#{@root_url.to_s}/images/logo.png"), @root_url.to_s %>

它无法在生产模式下工作(也就是说,我无法显示徽标图像),因为我认为资产管道使用指纹技术并且在收到的电子邮件中它没有。检查电子邮件中的HTML徽标元素我得到这样的结果:

<img src="http://www.mysitecom/images/logo.png"> # without Fingerprinting

如何解决问题?


在我的production.rb文件中,我有以下注释掉的代码:

# Enable serving of images, stylesheets, and javascripts from an asset server
# config.action_controller.asset_host = "http://assets.example.com"

9 个答案:

答案 0 :(得分:29)

config/environments/production.rb(以及其他需要的环境文件)中添加:

config.action_mailer.asset_host = 'http://mysite.com'

之后,rails会自动在image_tag

生成的路径前添加主机名
# haml
= image_tag 'foo.jpg'

将成为

#html
<img alt="" src="http://mysite.com/assets/foo.jpg" >

...同样适用于image_path

#haml
%table#backgroundTable{background: image_path('email-background.jpg'), width: '100%', :border => "0", :cellpadding => "0", :cellspacing => "0"}

将成为

<table background="http://mysite.com/assets/email-background.jpg" border="0" cellpadding="0" cellspacing="0" id="backgroundTable" width="100%">

小心!!!

# this will make your emails display images
config.action_mailer.asset_host = 'http://mysite.com'

不同
# this wont make your email images work
config.action_controller.asset_host = "http://mysite.com" 

答案 1 :(得分:9)

所有这些答案都假设您正在使用资产管道,但是从您的示例中,您在/ public / images中指定了一个图像 - 这不是资产管道的一部分,因此所有{{1}基于答案的答案是行不通的,而且你的初始指纹识别假设是不正确的。

如果您将图片放在/ public / images中,您希望图片代码的asset_path src,没有指纹,没有资产路径,什么都没有 - 只需将其硬编码到您的观点:

http://yoursite.com/images/the-image.jpeg

但是,你必须在该位置实际拥有该文件!如果你的图像在/ app / assets / images中,那么你需要使用image_tag和资产管道,就像其他人已经回答一样。

答案 2 :(得分:2)

另一种方法是在邮件中包含图像徽标。邮件也可以离线查看。您可以使用以下代码在Mailer类中添加徽标。

attachments["your_logo.png"] = File.read("#{Rails.root}/assets/images/your_logo.png")

此代码会将您的图片包含在邮件中。我相信当您想要在邮件中显示附件时,您需要执行以下操作:

Class YourMailer < ActionMailer::Base
def sendmail
.....
attachments.inline['your_logo.png'] = File.read("#{Rails.root}/assets/images/your_logo.png")
end

在sendmail.html.erb视图中,您可以使用image_tag方法:

<%= image_tag attachments['your_logo.png'].url %>

note :如果邮件没有正确显示,您也可以尝试以下解决方案: Rails attachments inline are not shown correctly in gmail 您的邮件也可以正常离线查看。

答案 3 :(得分:0)

您是否尝试过添加类似

的内容
config.action_mailer.default_url_options = { :host => 'www.example.com' }

到您的config/enviroments/production.rb文件

答案 4 :(得分:0)

尝试:

<%= link_to image_tag( "#{@root_url.to_s}/assets/logo.png"), @root_url.to_s %>

答案 5 :(得分:0)

你给image_tag一个绝对的网址,所以它认为它不需要做任何指纹或其他任何事情,除了回流你给它的字符串。我会试试

link_to( image_tag('logo.png'), @root_url)

您还需要设置actioncontroller的资产主机以获取rails以生成图像的完整URL而不仅仅是路径

需要注意的一点是:如果更改图像,则指纹显然会发生变化,因此以前发送的所有电子邮件中的中间网址都将无效。您可能希望考虑内嵌图像,但显然这些会增加电子邮件的大小

答案 6 :(得分:0)

试试这个

<%= link_to image_tag( asset_path, 'logo.png'), @root_url.to_s %>

答案 7 :(得分:-3)

如果您编译资产:

RAILS_ENV=production bundle exec rake assets:precompile

并在视图中使用asset_path:

<%= link_to image_tag( asset_path('logo.png') ), @root_url.to_s %>

- 它应该在开发和生产中都有效。这就是我的观点和.css.scss.erb样式表的方式。我认为它是一个邮件的视图没有区别。

答案 8 :(得分:-3)

确保您的html页面有以下标题

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

将图像渲染为:

<%= image_tag('http://'+@url+'/images/header.jpg')%>

如果你想要链接到图像

<%= link_to image_tag('http://'+@url+'/images/header.jpg'),root_path %>

@url ='您的网站地址'