Как получить базовый URL (например ,http://localhost:3000) моего приложения Rails?
я использую скрепку, чтобы позволить пользователям прикреплять вещи, а затем я отправляю электронное письмо и хочу прикрепить файл к электронной почте. Я пытаюсь прочитать файл и добавить его в качестве вложения, например:
# models/touchpoint_mailer.rb
class TouchpointMailer < ActionMailer::Base
def notification_email(touchpoint)
recipients "me@myemail.com"
from "Touchpoint Customer Portal <portal@touchpointclients.com>"
content_type "multipart/alternative"
subject "New Touchpoint Request"
sent_on Time.now
body :touchpoint => touchpoint
# Add any attachments the user has included
touchpoint.assets.each do |asset|
attachment :content_type => asset.file_content_type,
:body => File.read(asset.url)
end
end
end
это дает мне следующую ошибку No such file or directory - /system/files/7/original/image.png?1254497688
с трассировкой стека, говорящей, что это вызов File.read
. Когда я посещаю show.html.erb
страница, и нажмите на ссылку на изображение, которое что-то вроде http://localhost:3000/system/files/7/original/image.png?1254497688
, изображение отображается нормально.
как я могу исправить эта проблема?
4 ответов
asset.url
возвращает URL-адрес файла. Это обычно /system/classname/xx/xx/style/filename.ext
. Вы бы поместили это в image_tag
.
вы хотите asset.path
. Он возвращает полный путь к файлу, который обычно будет что-то вроде /home/username/railsapp/public/system/classname/xx/xx/style/filename.ext
HTH.
обычно root_url
должны обеспечить это.
File.read(…)
request.env["HTTP_HOST"]
Я не знаю, почему эта строка кода является труднодостижимым в интернете. Кажется, он должен быть впереди и в центре.
Как говорит ZiggyTheHamster: актив.url-это сгенерированный url-адрес, который будет использоваться на веб-страницах (именно поэтому вы получаете косые черты каталога в стиле unix, как указано в комментариях.)
актив.path должен дать вам путь к файлу с поддержкой ОС,но даже это не требуется с скрепкой. Скрепка:: вложение уже является IOStream.
вам просто нужно :body => asset
вот так:
touchpoint.assets.each do |asset|
attachment :content_type => asset.file_content_type,
:body => asset
end