0

MIME_TYPES定数ハッシュにいくつかの項目を追加して、既存のモジュール (つまり Redmine::MimeType) を拡張する必要があります。

これは私がこれまでに試したことであり、「動的定数割り当て」エラーのみが表示されます。

module MimeTypePatch
  def self.included(base) # :nodoc:
    base.extend(ClassMethods)

    base.class_eval do
      MIME_TYPES_VIDEO = {
        'video/x-flv' => 'flv,f4v',
        'video/mpeg' => '*.mpeg *.mpg *.mpe',
        'video/quicktime' => 'qt,mov',
        'video/vnd.vivo' => 'viv,vivo',
        'video/x-msvideo' => 'avi'
      }.freeze

      # merge the new mime types with the existing ones
      MIME_TYPES = MIME_TYPES.merge(MIME_TYPES_VIDEO).freeze

      EXTENSIONS = MIME_TYPES.inject({}) do |map, (type, exts)|
        exts.split(',').each {|ext| map[ext.strip] = type}
        map
      end
    end
  end
end

では、何が間違っているのでしょうか。また、別のモジュールの既存の定数を変更するための正しいアプローチは何でしょうか? 実行時に定数を変更するのは少しずれていることがわかりますが、私が望むものを達成するためのより洗練されたアプローチ (ビデオ MIME タイプの検出) は考えられませんでした。

4

2 に答える 2

1

フリーズを除いて、多くの場合、既存の定数を再定義するのではなく、変更することができます。たとえば、あなたの例では、定数を変更するの#merge!ではなく、を使用しています。#merge現在のスコープの定義と継承されたスコープの定義を区別するための手順を実行する必要があるかどうかはわかりません(つまりMIME_TYPES、祖先の上流の値がある場合は変更したくない)。

MIME_TYPES = {} unless (defined?(MIME_TYPES))
MIME_TYPES.merge!(MIME_TYPES_VIDEO)

、、およびその他の#replaceメソッドも興味深いです。HashArray

MIME_TYPES.replace(MIME_TYPES.merge(MIME_TYPES_VIDEO))

乾杯!

于 2012-08-15T16:19:23.980 に答える
0

初期定義後に定数に値を割り当てることはできません。マージされたハッシュ値を持つ新しい定数を作成する必要があります。この行を次から変更します

# merge the new mime types with the existing ones
MIME_TYPES = MIME_TYPES.merge(MIME_TYPES_VIDEO).freeze

# merge the new mime types with the existing ones
MERGED_MIME_TYPES = MIME_TYPES.merge(MIME_TYPES_VIDEO).freeze

そして、この新しい定数MERGED_MIME_TYPESをさらなるロジックで使用できます

于 2012-07-25T13:32:33.150 に答える