Получить абсолютный 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


asset_url(model.attachment_name.url(:style))

соответствующая проблема github


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