13

私はRailsプロジェクトを持っています.Railsプロジェクトでは、リクエストを処理しているときに定数が削除されています.

mime/typesrestclientgemsを使用しています。モジュールは、メソッドを含むrestclient拡張機能を定義します。MIMEtype_for_extension

module RestClient
    ...
    def stringify_headers headers
      result[key] = target_values.map { |ext| MIME::Types.type_for_extension(ext.to_s.strip) }.join(', ')
      ...
    end
  end
end

module MIME
  class Types
    def type_for_extension ext
      candidates = @extension_index[ext]
      candidates.empty? ? ext : candidates[0].content_type
    end
    class << self
      def type_for_extension ext
        @__types__.type_for_extension ext
      end
    end
  end
end

特定のコントローラー アクションの最初の呼び出しでMIME::Types.type_for_extensionアクセスできます。2回目の呼び出しで、それはなくなりました。

まだ使用できますMIME::Types.type_forが、追加されたメソッドは単純になくなっているため、RestClient モジュールを使用しようとすると、showin in の行で例外がスローされstringify_headersます。

NoMethodError, message: undefined method `type_for_extension' for MIME::Types:Class

**これはどのように可能ですか? と同じファイルtype_for_extension定義されています。後者は核攻撃を受けて、前者は核攻撃を受けないのはどうしてですか?stringify_headers


編集:修正しました!

私の設定では:

config.gem "aws-s3", :version => ">= 0.6.2", :lib => "aws/s3"  
config.gem 'mime-types', :lib => 'mime/types'

aws-s3mime-typesを介してロードしていましrequire_library_or_gemた。最終的に呼び出されたのは、呼び出されたときにnukedActiveSupport::Dependencies.autoload_module!れるテーブルを維持する呼び出しです。autoloaded_constantsActionController.closeDispatcher.cleanup_application

修正はmime-types最初にロードすることだったので、自動ロードされません。

*うわー*

4

1 に答える 1

3

リクエストに応じて自分の質問に答えます。

私の設定では:

config.gem "aws-s3", :version => ">= 0.6.2", :lib => "aws/s3"  
config.gem 'mime-types', :lib => 'mime/types'

aws-s3ライブラリは をmime-types介し​​てロードされrequire_library_or_gem、最終的に呼び出され、呼び出されたときに呼び出さActiveSupport::Dependencies.autoload_module!れるテーブルを維持しますautoloaded_constantsActionController.closeDispatcher.cleanup_application.

最初に MIME タイプをロードするように修正されたため、自動ロードされません。

于 2011-07-26T03:24:42.667 に答える