Получить абсолютный URL для прикрепления скрепки
Можно ли получить абсолютный URI для вложения скрепки? В настоящее время проблема заключается в том, что производственная среда развертывается в суб-URI (на Пассажире: RackBaseURI
), но <paperclip attachment>.url
возвращает относительный URI-код Rails-app (/system/images/...
). Есть ли способ получить абсолютный URI для вложений Paperclip?
Я использую Paperclip v2.7 и Rails 3.2.8.
Ответы
Ответ 1
попробовать
URI.join(request.url, @model.attachment_name.url)
или
URI(request.url) + @model.attachment_name.url
Это безопасно, если вы используете S3 или абсолютный URL.
Обновление: этот ответ лучше моего;) fooobar.com/questions/154264/...
Ответ 2
asset_url(model.attachment_name.url(:style))
Релевантная проблема github
Ответ 3
В соответствии с этой проблемой github чище использовать ActionController::Base.asset_host
, поэтому это приведет к помощнику:
def add_host_prefix(url)
URI.join(ActionController::Base.asset_host, url)
end
Это предполагает, что в каждом файле /config/environments/<environment>.rb
у вас есть следующее:
Appname::Application.configure do
# ....
config.action_controller.asset_host = 'http://localhost:3000' # Locally
# ....
end
Ответ 4
Наиболее широко используемый способ - сначала определить хосты вашего ресурса в соответствующем файле конфигурации/среды:
config.action_controller.asset_host = "http://assethost.com"
config.action_mailer.asset_host = "http://assethost.com"
Затем в представлениях и почтовых программах:
asset_url(model.attachment.url(:style))
В консоли:
helper.asset_url(model.attachment.url(:style))
В модели:
ApplicationController.helpers.asset_url(model.attachment.url(:style))
Ответ 5
Вы можете сделать это:
<%= image_tag "#{request.protocol}#{request.host_with_port}#{@model.attachment_name.url(:attachment_style)}" %>
Или создайте вспомогательный метод, чтобы обернуть его.
def absolute_attachment_url(attachment_name, attachment_style = :original)
"#{request.protocol}#{request.host_with_port}#{attachment_name.url(attachment_style)}"
end
И используйте его следующим образом:
<%= image_tag absolute_attachment_url(attachment_name, :attachment_style)}" %>
Ex: Model = Person (@person), attachment_name = avatar, style =: thumb
<%= image_tag absolute_attachment_url(@person.avatar, :thumb)}" %>
Ответ 6
Это не решит исходную проблему с плакатом точно (она работает в представлении, а не в модели), но может быть полезна для людей, которые пытаются "получить абсолютный URL для прикрепления скрепки" в своем представлении: в том же путь, который
image_tag(user.avatar.url(:large))
помещает изображение в ваше представление,
image_url(user.avatar.url(:large))
возвращает только URL-адрес, который вам понадобится, если вы хотите напрямую связать его с объектом (например, в вызове link_to
).
Ответ 7
Вы можете добавить к application.rb
(или для конкретной среды в config/environments/*
):
config.paperclip_defaults = {
url: "http://my.address.com/system/:class/:attachment/:id_partition/:style.:extension",
path: ':rails_root/public/system/:class/:attachment/:id_partition/:style.:extension',
}
Перезагрузите и reimport ваши изображения.
PS: вы можете заменить http://my.address.com с переменной окружения.