2010-02-09 5 views
3

다음과 같은 상황이 발생했습니다.클래스 레벨 메소드를 레일즈에서 별도의 모듈로 확장하는 방법은 무엇입니까?

module Extension 
    def self.included(recipient) 
    recipient.extend(ModelClassMethods) 
    end 

    module ModelClassMethods 
    def self.msg 
     puts 'Hi from module' 
    end 
    end 
end 

class B 
    include Extension 
end 

B.msg를 사용할 수없는 이유는 무엇입니까?

>> B.msg 
NoMethodError: undefined method `msg' for B:Class 
    from (irb):16 

이 잘못된 생각입니까? 이 모든 것이 성취하기 어려워 야하는 것처럼 보이지 않습니다.

답변

4

ModelClassMethods 모듈 내의 msg 메소드는 이미 수신자 클래스를 확장하는 행위가 이미 클래스 메소드가되기 때문에 클래스 메소드가 아니라 인스턴스 메소드로 선언되어야합니다. 그래서 :

module Extension 
    def self.included(recipient) 
    recipient.extend(ModelClassMethods) 
    end 

    module ModelClassMethods 
    def msg # Note lack of 'self.' 
     puts 'Hi from module' 
    end 
    end 
end 
+0

존 : 그것은 전체 코드 샘플 (굵게 변경) 변경 사항 –

+0

좋은 생각 포함하도록 당신이 당신의 예를 편집 할 수 있습니다 - 수행한다. –

+0

일단 메서드를 인스턴스 메서드로 선언했다는 것을 알게되면 즉시 해당 메서드가 클릭됩니다. 감사! – Matthew

관련 문제