module FileService
class LetterGenerator
def initialize(user)
@user = user
end
def process
WickedPdf.new.pdf_from_string(
ApplicationController.new.render_to_string(
template: 'services/main.pdf.erb',
locals: { user: user}
)
margin: { top: 10, bottom: 20 }
)
end
private
attr_reader :user
end
end
main.pdf.erb
<meta http-equiv = "content-type" content = "text/html; charset=utf-8" />
<div class = "letter">
<div class='header'>
<div class='header-right'>
<b>Letter</b>
</div>
<div class='logo'>
<% if @user.client %>
<%= image_tag Setting.take.logo.url, size: "100x50" %>
<% else %>
<%= image_tag wicked_pdf_asset_base64('mailer/logo.png') %>
<% end %>
</div>
</div>
</div>
Изображение присутствует в таблице настроек, но не отображается в файле pdf.erb. Я думаю, что эта проблема заключается в том, как использовать image_tag для отображения изображения в сервисе. Не уверен на 100%. Пожалуйста, помогите мне решить эту проблему
Настройка.take.logo.url
/uploads/setting/logo/1/America_1.png
@engineersmnky, это не так, потому что я использую Setting.take.logo.url, как в файле mailer/send_user.html.erb, и там он работает нормально. Это как-то связано с тем, как evilpdf используется в сервисе.
@engineersmnky это изображение отображается <%= image_tag evil_pdf_asset_base64('mailer/logo.png') %>, когда пользователь не является клиентом
Согласно документации вам может понадобиться использовать wicked_pdf_image_tag, потому что, как я уже упоминал, для этого требуется абсолютная ссылка (настоящий URL-адрес).
@engineersmnky это местоположение файла, где он хранится на моем локальном компьютере. Код, который я пытаюсь использовать выше, находится на моем локальном компьютере. /Users/xyz/Documents/project/onboarding_app/public/uploads/setting/logo/1/America_1.png
@engineersmnky Да, я пробовал <%= image_tag evil_pdf_asset_base64(Setting.take.logo.url), size: "100x50" %> возвращает ошибку. Не удалось найти актив 'uploads/setting/logo/1/America_1.png'
@engineersmnky даже попробовал <%= evil_pdf_image_tag Setting.take.logo.url %> все равно не получилось, изображение не отображается в сгенерированном PDF-файле
Хорошо, последняя попытка, которую я могу вспомнить. Пожалуйста, попробуйте asset_url(Setting.take.logo.url, skip_pipeline: true), возможно, вам также придется передать опцию host, если config.action_controller.asset_host не установлен или установлен неправильно. например host: 'http://mywebsite.com'
<img src = "<%= Settings.default.host + Setting.take.logo.url %>"> У меня это сработало
@engineersmnky, вы можете опубликовать ответ, и я поставлю галочку. Спасибо за все что ты сделал для меня
Ты решил это для себя, все, что я делал, это говорил об этом. Не стесняйтесь опубликовать свой ответ. Я даже проголосую за это. Хотя URI.join(Setting.default.host,Setting.take.logo.url) было бы более идиоматично, и если вам это нужно чаще, я бы предложил сделать это методом Settings, например. def full_url(asset_path)= URI.join(Setting.default.host,asset_path)
Для локально хранящихся ресурсов вы можете использовать путь к файлу вместо URL-адреса. Это должен быть абсолютный путь, а не относительный.





<img src = "<%= Settings.default.host + Setting.take.logo.url %>">
Это сработало для меня
Здесь просто выстрел в темноте, но, вероятно, это как-то связано с тем фактом, что src «url» является относительным путем, а не полным URL-адресом.