Rails 3.1: проблема при отображении изображений в файлах просмотра почты
Я использую Ruby on Rails 3.1, и я хотел бы добавить логотип своего веб-сайта (то есть изображение, обработанное через новый Asset Pipeline), по электронной почте.
Если в файле моего почтового ящика указано следующее:
<% # 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 используется технология Fingerprinting, а в полученном электронном письме это не так. Проверяя элемент 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"
Ответы
Ответ 1
в config/environments/production.rb
(и другие необходимые файлы окружения):
config.action_mailer.asset_host = 'http://mysite.com'
после этого рельсы автоматически добавят имя хоста перед путями, сгенерированными 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"
Ответ 2
Все эти ответы предполагают, что вы используете конвейер активов, но из вашего примера вы указываете изображение в /public/images - это не часть конвейера активов, поэтому все asset_path
основаны ответы не будут работать, и ваше исходное предположение о фингерпринце неверно.
Если вы помещаете изображение в /public/images, вы хотите, чтобы ваш тег изображения имел src
из http://yoursite.com/images/the-image.jpeg
, без отпечатка пальца, никакого пути к ресурсам, ничего - просто скопируйте его в свое представление:
<img src="<%[email protected]_url%>/images/logo.png">
Но вы должны иметь файл в этом месте! Если у вас есть изображение в /app/assets/images, вам нужно будет использовать image_tag и конвейер активов, как ответили другие.
Ответ 3
Альтернативой является включение логотипа изображения по почте. Почта также может быть просмотрена в автономном режиме. Вы можете добавить логотип в свой класс 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 %>
примечание: если почта не отображается правильно, вы можете попробовать решение:
Встроенные в Rails вложения не отображаются правильно в gmail
Ваша почта также может быть просмотрена в автономном режиме.
Ответ 4
Вы пытались добавить что-то вроде этого
config.action_mailer.default_url_options = { :host => 'www.example.com' }
в ваш config/enviroments/production.rb
файл
Ответ 5
Try:
<%= link_to image_tag( "#{@root_url.to_s}/assets/logo.png"), @root_url.to_s %>
Ответ 6
Вы даете image_tag абсолютный URL-адрес, поэтому он думает, что ему не нужно делать какие-либо отпечатки пальцев или что-то еще, кроме срыгивания строки, которую вы ему дали. Я бы попробовал
link_to( image_tag('logo.png'), @root_url)
Вам также необходимо установить хост-ресурс actioncontroller, чтобы получить рельсы, чтобы генерировать полный URL-адрес для изображения, а не только путь
Одно замечание: если вы измените образ, то отпечаток пальца, очевидно, изменится, и поэтому URL-адрес входящей почты во всех ваших ранее отправленных электронных сообщениях станет недействительным. Возможно, вы захотите рассмотреть встроенные изображения, хотя, очевидно, они увеличивают размер электронной почты
Ответ 7
Попробуйте этот
<%= link_to image_tag( asset_path, 'logo.png'), @root_url.to_s %>
Ответ 8
Добавление mode:'rb'
работало для меня:
attachments.inline['Logo.jpg'] = File.read(File.join(Rails.root,'app','assets','images','Logo.jpg'), mode: 'rb')
Ответ 9
Если вы скомпилируете свои активы:
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. Я предполагаю, что не имеет никакого значения, что это представление для почтовой программы.
Ответ 10
убедитесь, что ваша html-страница имеет заголовок follwing
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
и сделать изображение как:
<%= image_tag('http://'[email protected]+'/images/header.jpg')%>
или
Если вы хотите ссылку на изображение, то
<%= link_to image_tag('http://'[email protected]+'/images/header.jpg'),root_path %>
@url = 'адрес вашего веб-сайта