我正在寻找一个解决方案来获取带回形对象的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
我坚持这个!
谢谢你的时间!答案 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存储的神奇之处),所以它应该可以工作。