2012-04-15 7 views
17

나는 ApplicationHelper 모듈 안에있는 모듈 내부에 구현 한 메소드 중 일부를 포함하는 레일스 용 작은 프로그램을 만들고 있습니다. 다음은 예입니다 :모듈을 Ruby의 다른 모듈에서 상속받는 것으로 만들기

module Helper 
    def time 
     Time.now.year 
    end 
end 

module ApplicationHelper 
    # Inherit from Helper here... 
end 

내가 ApplicationHelper < Helperinclude Helper 클래스의 맥락에서 일 것이라고 알고 있지만, 모듈 간 상속을 위해 무엇을 사용해야합니까? 감사.

답변

22

사실 은 다른 모듈의 내부에 모듈을 정의한 다음 을 외부 모듈 내에 포함합니다 ().

so ross$ cat >> mods.rb 
module ApplicationHelper 
    module Helper 
    def time 
     Time.now.year 
    end 
    end 
    include Helper 
end 

class Test 
    include ApplicationHelper 
    def run 
    p time 
    end 
    self 
end.new.run 
so ross$ ruby mods.rb 
2012 
+0

다른 모듈 내부에서 모듈을 사용하는 것에 대해 전혀 생각하지 않았습니다. 도움을 주셔서 감사합니다! – beakr

+7

ApplicationHelper 내에서 Helper를 선언 할 때 전역 코드에서 숨기는 것 이외에 어떤 것이 있는지 확실하지 않습니다. 중요한 것은 '포함'(및 '확장') 모듈뿐만 아니라 클래스 작동합니다. –

1

하나의 잠재적 인 문제는 포함 된 모듈이 클래스 메서드를 연결하면 해당 메서드가 잘못된 개체에 첨부 될 수 있다는 것입니다.

경우에 따라 '부모'모듈을 기본 클래스에 직접 포함시킨 다음 새로운 방법으로 다른 모듈을 포함하는 것이 더 안전 할 수도 있습니다. 예 : include Helper이 메소드 정의 이후에 실행되는 것처럼

module ApplicationHelper 
    def self.included(base) 
    base.class_eval do 
     include Helper 
     include InstanceMethods 
    end 
    end 

    module InstanceMethods 
    def new_method 
     #.. 
    end 
    end 

end 

새로운 방법은 그들을 Helper 덮어 쓰기 원인, ApplicationHelper에 직접 정의되지 않습니다. 다른 방법으로는 class_eval 블록 내부의 메소드를 정의 할 수 있습니다.

+0

여기에는 메소드 정의 내에 include 문이 있는데, 아마도 올바른 방법이 아닙니다. 이것은 메소드 정의에 include를 쓰는 것에 대한 좋은 경고입니다. 포함은 DigitalRoss의 답변 에서처럼 메소드 정의 외부에 있어야합니다. – emery

관련 문제