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

Получить абсолютный URL для прикрепления скрепки

Можно ли получить абсолютный URI для вложения скрепки? В настоящее время проблема заключается в том, что производственная среда развертывается в суб-URI (на Пассажире: RackBaseURI), но <paperclip attachment>.url возвращает относительный URI-код Rails-app (/system/images/...). Есть ли способ получить абсолютный URI для вложений Paperclip?

Я использую Paperclip v2.7 и Rails 3.2.8.

4b9b3361

Ответ 1

попробовать

URI.join(request.url, @model.attachment_name.url)

или

URI(request.url) + @model.attachment_name.url

Это безопасно, если вы используете S3 или абсолютный URL.

Обновление: этот ответ лучше моего;) fooobar.com/questions/154264/...

Ответ 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 с переменной окружения.