Подтвердить что ты не робот

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"
4b9b3361

Ответ 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 = 'адрес вашего веб-сайта