Получить абсолютный URL для скрепки вложения
можно ли получить абсолютный URI для крепления Скрепка? Прямо сейчас проблема заключается в том, что производственная среда развернута в суб-URI (на пассажирском:RackBaseURI
), но <paperclip attachment>.url
возвращает относительный URI Rails-app (/system/images/...
). Есть ли способ получить абсолютный URI для вложений скрепки?
Я использую скрепку v2.7 и рельсы 3.2.8.
7 ответов
попробовать
URI.join(request.url, @model.attachment_name.url)
или
URI(request.url) + @model.attachment_name.url
это безопасно, если вы используете S3 или абсолютный url.
Update: этот ответ лучше, чем мой ;)https://stackoverflow.com/a/21027839/683157
по этому выпуск github, чище использовать ActionController::Base.asset_host
таким образом, это приведет к помощнику:
def add_host_prefix(url)
URI.join(ActionController::Base.asset_host, url)
end
это предполагает, что у вас есть в каждом следующее:
Appname::Application.configure do
# ....
config.action_controller.asset_host = 'http://localhost:3000' # Locally
# ....
end
наиболее широко применимый способ сделать это-сначала определить ваши хосты активов в соответствующем файле конфигурации / среды:
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))
вы можете сделать это:
<%= 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 = аватар, style =: thumb
<%= image_tag absolute_attachment_url(@person.avatar, :thumb)}" %>
это не решает проблему оригинального плаката точно (он работает в представлении, а не в модели), но может быть полезно для людей, которые пытаются "получить абсолютный URL для прикрепления скрепки" в их представлении: таким же образом, что
image_tag(user.avatar.url(:large))
помещает само изображение в ваш взгляд,
image_url(user.avatar.url(:large))
возвращает только URL, который вам понадобится, если вы хотите напрямую связаться с активом (например, в link_to
звонок).
вы можете добавить в свой 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',
}
перезагрузите и повторно импортировать изображения.
PS: очевидно, вы можете заменить http://my.address.com с переменной окружения.