1

我看到有一个: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 local variable or method `request' for Technoweenie::AttachmentFu::Backends::S3Backend:Module错误

4

2 回答 2

0

问题是您正在修改的方法 ( Technoweenie::AttachmentFu::Backends::AWS::S3.protocol) 是静态的,并且无权访问相关文件或请求。您要修改的是Technoweenie::AttachmentFu::Backends::AWS::S3#s3_url(thumbnail). 您必须添加一个选项参数,以便您的控制器可以传入是否需要 SSL,因为此模型级包不了解控制器级问题,如“当前请求”(也不应该)。

然而,真正的答案是“你可能不想这样做”。如果客户说“我们有一个免费增值模式,其中只有我们的付费客户才能获得他们的照片的 SSL 传输”,您应该反驳:“实际上,削弱 SSL 文件传输更难,而且很可能只是在路。让我们考虑提供另一种免费增值选项。如果客户并不真正关心,您不妨为所有上传打开 SSL。

于 2009-09-07T13:32:10.050 回答
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

此解决方案旨在具有以下属性:

  • 不需要修补 attachment_fu
  • 为每个请求设置 S3 后端的协议
  • 即使发生异常也会重置协议
  • 如果您从控制台运行,则保留默认 :use_ssl 设置
  • 不需要 around_filter 是通用的,因为它总是在每次请求后将其重置为原始状态
于 2010-04-27T04:38:37.057 回答