2012-07-25 5 views
0

상수 MIME_TYPES 해시에 몇 가지 항목을 추가하여 기존 모듈 (즉, Redmine :: MimeType)을 확장해야합니다. Ruby 1.8.7 다른 모듈에서 상수 확장하기

내가 지금까지 뭘하려하고 있음은 나에게 "동적 상수 할당"오류를 제공합니다 :

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 유형 감지)을 얻기위한보다 우아한 접근 방식을 생각할 수 없었다.

답변

0

초기 정의 후 상수에 값을 할당 할 수 없으면 병합 된 해시 값을 갖는 새 상수를 만들어야합니다.

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

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

에서이 줄을 변경 한 다음 동결을 제외하고 더 논리

+0

도움이 되었습니까 ?? – abhas

+0

종류 ... 나는 redmine에서 일부 메서드를 덮어 쓰거나 중복하고 싶지 않았기 때문에이 솔루션을 사용하고 싶지 않았습니다. 나는 코어 해시에 단순히 값을 추가하는 것으로 끝났다. 이 경우에는 더 나은 해결책으로 보입니다. 그러나 귀하의 조언에 감사드립니다. – Dennis

1

이 새로운 일정 MERGED_MIME_TYPES을 사용할 수 있습니다, 당신은 많은 경우에 기존 상수를 수정할 수 있습니다 그 (것)들을 재정의하는 것을 시도보다는 오히려. 예를 들어 #merge이 아닌 #merge!을 사용하는 예제에서는 상수를 변경합니다. 현재 범위의 정의를 상속 된 정의와 구별하는 단계를 수행해야하는지 확신 할 수 없습니다 (). 어떤 경우든지 조상 상류 값 MIME_TYPES을 변경하지 않으려는 경우).

MIME_TYPES.replace(MIME_TYPES.merge(MIME_TYPES_VIDEO)) 

건배 : 관심의 또

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

#replaceHash위한 방법 Array, 그리고 다른 사람입니다!

+0

답변 해 주셔서 감사합니다. 그러나 문제는 언급 한대로 해당 해시가 고정되어 있다는 것입니다. 그래서'#merge! '도'# replace'도 그 문맥에서 작동하지 않습니다. – Dennis

관련 문제