URL скрепки для возврата asset_host - PullRequest
1 голос
/ 27 июля 2011

Я ищу решение, чтобы получить абсолютную ссылку с asset_host объекта скрепки.метод url возвращает только относительный URL.поэтому я попытался это:

Paperclip::Attachment.default_options.update({
  :url => "#{ActionController::Base.asset_host.call(nil, request)}/system/:attachment/:id/:style/:filename",
  :path => ":rails_root/public/system/:attachment/:id/:style/:filename"
})

но запрос отсутствует в инициализаторе.или как мне его получить?

моя конфигурация asset_host выглядит так:

ActionController::Base.asset_host = Proc.new do |source, request|
  if request.ssl?
    "#{request.protocol}#{request.host_with_port}"
  else
    "http://cdn.somehost.com"
  end
end

Я застрял с этим!

спасибо за ваше время!

1 Ответ

4 голосов
/ 27 июля 2011

Это несколько сложное решение, но вы можете сделать это следующим образом: сначала используйте before_filter, чтобы установить переменную, которая будет храниться, если запрос SSL или нет:

class ApplicationController < ActionController::Base

  before_filter :set_current_request
  after_filter :unset_current_request

  protected

  def set_current_request
    Thread.current[:current_request] = request
  end

  def unset_current_request
    Thread.current[:current_request] = nil
  end         

end

С этим определением выВам нужно будет определить интерполяцию Paperclip:

Paperclip.interpolates :assets_host  do |attachment, style|
  request = Thread.current[:current_request]
  if request.ssl?
    "#{request.protocol}#{request.host_with_port}"
  else
    "http://cdn.somehost.com"
  end
end

Затем вы можете включить эту интерполяцию в вашу конфигурацию:

Paperclip::Attachment.default_options.update({
  :url => ":assets_host/system/:attachment/:id/:style/:filename",
  :path => ":rails_root/public/system/:attachment/:id/:style/:filename"
})

Я не сделал это точно так же, но у меня естьмного раз использовал интерполяции (и это также, как хранилище S3 делает свое волшебство), поэтому оно должно работать.

...