我看到:user_ssl
中有一个attachment_fu
选项,用于检查amazon_s3.yml文件,以便通过https://
在s3_backend.rb中你有这个方法:
def self.protocol
@protocol ||= s3_config[:use_ssl] ? 'https://' : 'http://'
end
但是这会使它通过SSL服务所有s3附件。如果当前请求是使用https://即:
进行的,我想使其动态化 if request.ssl?
@protocol = "https://"
else
@protocol = "http://"
end
我怎样才能让它以这种方式运作?我已经尝试修改方法,然后得到 NameError:undefined局部变量或方法`request'for Technoweenie :: AttachmentFu :: Backends :: S3Backend:Module error
答案 0 :(得分:0)
问题是您正在修改的方法(Technoweenie::AttachmentFu::Backends::AWS::S3.protocol
)是静态的,无法访问相关文件或请求。您要修改的是Technoweenie::AttachmentFu::Backends::AWS::S3#s3_url(thumbnail)
。你必须添加一个options参数,这样你的控制器就可以传入它是否需要SSL,因为这个模型级包不了解像“当前请求”这样的控制器级问题(也不应该)。
但真正的答案是“你可能不想这样做”。如果客户说“我们有免费增值模式,其中只有我们的付费客户获得他们照片的SSL传输”,那么你应该回过头来说:“实际上更难瘫痪SSL文件传输,它是我们可能只会提出另一种免费增值方案。“如果客户不在乎,您也可以为所有上传功能启用SSL。
答案 1 :(得分:0)
这是一个需要正确解决的重要问题,或者影响非常严重(特别是如果你不在IE中测试,错误和警告可能会被你忽略)。我的解决方案是将以下内容放在ApplicationController
around_filter :set_attachment_fu_protocol
def set_attachment_fu_protocol
protocol = Technoweenie::AttachmentFu::Backends::S3Backend.instance_variable_get(:@protocol)
Technoweenie::AttachmentFu::Backends::S3Backend.instance_variable_set(:@protocol, request.protocol)
yield
ensure
Technoweenie::AttachmentFu::Backends::S3Backend.instance_variable_set(:@protocol, protocol)
end
此解决方案旨在具有以下属性: