Rails 3.1: проблема с отображением изображений в почтовых файлах - PullRequest
18 голосов
/ 18 октября 2011

Я использую 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 %>

он не работает в режиме производство (то есть я не могу отобразить изображение логотипа), потому что я думаю, что Asset Pipeline использует технику снятия отпечатков пальцев, а в полученном электронном письме - нет. Изучив элемент 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"

Ответы [ 10 ]

29 голосов
/ 28 мая 2013

in 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" 
9 голосов
/ 12 января 2012

Все эти ответы предполагают, что вы используете конвейер активов, но из вашего примера вы указываете изображение в / public / images - это не часть конвейера активов, поэтому все основанные на asset_path ответы не сработают, и в дальнейшем ваше первоначальное предположение о дактилоскопии неверно.

Если вы помещаете изображение в / public / images, вы хотите, чтобы ваш тег изображения имел src из http://yoursite.com/images/the-image.jpeg, без отпечатка пальца, без пути к активу, ничего - просто закодируйте его в виде:

<img src="<%=@root_url%>/images/logo.png">

Но , у вас должен быть файл в этом месте! Если у вас есть изображение в / app / assets / images, вам нужно будет использовать image_tag и конвейер ресурсов, как уже ответили другие.

2 голосов
/ 02 января 2012

Альтернативой является включение логотипа изображения в почту.Почту также можно просматривать в автономном режиме.Вы можете добавить логотип в своем классе 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 не отображаются правильно в gmail Ваша почта также может просматриваться в автономном режимеправильно.

0 голосов
/ 15 июля 2015

Добавление mode:'rb' у меня сработало:

attachments.inline['Logo.jpg'] = File.read(File.join(Rails.root,'app','assets','images','Logo.jpg'), mode: 'rb')
0 голосов
/ 30 декабря 2011

убедитесь, что ваша 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 = 'адрес вашего сайта'

0 голосов
/ 28 декабря 2011

Попробуйте это

<%= link_to image_tag( asset_path, 'logo.png'), @root_url.to_s %>
0 голосов
/ 21 декабря 2011

Вы даете image_tag абсолютный URL, поэтому он думает, что ему не нужно делать никаких отпечатков пальцев или чего-либо еще, кроме как отрыгивать строку, которую вы ему дали.Я бы попробовал

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

Вам также понадобится установить хост ресурса actioncontroller, чтобы получить рельсы для генерации полного URL-адреса изображения, а не просто путь

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

0 голосов
/ 06 декабря 2011

Попробуйте:

<%= link_to image_tag( "#{@root_url.to_s}/assets/logo.png"), @root_url.to_s %>
0 голосов
/ 06 декабря 2011

Вы пытались добавить что-то вроде этого

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

в ваш config/enviroments/production.rb файл

0 голосов
/ 20 октября 2011

Если вы компилируете свои активы:

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.Я предполагаю, что это не имеет значения, что это представление для почтовой программы.

...