1

https:// 経由でファイルを提供するために amazon_s3.yml ファイルをチェックする:user_sslオプションがあるようですattachment_fu

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 に答える