回形针网址返回asset_host

时间:2011-07-27 15:11:17

标签: ruby-on-rails ruby ruby-on-rails-3 paperclip

我正在寻找一个解决方案来获取带回形对象的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 个答案:

答案 0 :(得分:4)

这是一个有点复杂的解决方案,但您可以这样做,首先使用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存储的神奇之处),所以它应该可以工作。