복붙노트

[RUBY-ON-RAILS] 3 레일 : alias_method_chain 아직 사용?

RUBY-ON-RAILS

3 레일 : alias_method_chain 아직 사용?

난 그냥 그 alias_method_chain가 더 이상 사용되지 말한다이 게시물에서 보석 / 플러그인 레일 3 개발 및 RAN에 대해 읽고 있었다. 나는이 방법은 activesupport-3.0.0 / lib 디렉토리 / active_support / core_ext / 모듈 / aliasing.rb에 여전히 존재 볼 수 있습니다.

나는 아직도 레일 3 alias_method_chain을 이용해야 하는가?

이것은 여전히 ​​액티브을 수정할 레일 3 보석 / 플러그인에 대한 모범 사례 반영되어 있습니까?

해결법

  1. ==============================

    1.아니,이 모듈에 무시 방법과 슈퍼 키워드의 영리한 사용에 의해 대체되었습니다.

    아니,이 모듈에 무시 방법과 슈퍼 키워드의 영리한 사용에 의해 대체되었습니다.

    기본적으로, 당신은 포함 모듈에 원래의 함수를 정의하고 다른 포함 된 모듈에 우선합니다. 당신이 오버라이드 (override) 함수에서 슈퍼 호출 할 때, 원래의 함수를 호출합니다. 그러나 하나의 캐치가있다. 당신은 기본 모듈을 포함 후에 확장 모듈을 포함해야하고, 순서대로 당신은 체인이 발생합니다.

    class Something
      module Base  
        def my_method
          # (A) original functionality
        end
      end
    
      module PreExtension
        def my_method
          # (B) before the original
          super # calls whatever was my_method before this definition was made
        end
      end
    
      module PostExtension
        def my_method
          super # calls whatever was my_method before this definition was made
          # (C) after the original
        end
      end
    
      include Base # this is needed to place the base methods in the inheritance stack
      include PreExtension # this will override the original my_method
      include PostExtension # this will override my_method defined in PreExtension
    end
    
    s = Something.new
    s.my_method 
    #=> this is a twice extended method call that will execute code in this order:
    #=> (B) before the original
    #=> (A) the original
    #=> (C) after the original
    

    Railscasts의 라이언 베이츠이이 레일 라우팅 코드에서 사용하는 방법에 대해 이야기합니다. 나는 그것을보고 추천하고, 그의 다른 스크린 캐스트 것입니다. 그들은 레일 전문가로 뜨개질 할머니를 변환하는 힘이있다.

    PS : 신용은 내 원래의 대답에 근본적인 오류를 정정하는 Peeja로 이동합니다. 감사.

  2. ==============================

    2.일반적으로, 모듈은 클래스의 메소드를 오버라이드 (override) 할 수 없다 에 포함. 이것은 모듈을 포함 그냥 작동하기 때문에 같은 서브 클래스. 슈퍼 클래스는 '하위 클래스를 재정의 할 수 없습니다 방법은 하나,도 아니다 당신은 그것을 기대.

    일반적으로, 모듈은 클래스의 메소드를 오버라이드 (override) 할 수 없다 에 포함. 이것은 모듈을 포함 그냥 작동하기 때문에 같은 서브 클래스. 슈퍼 클래스는 '하위 클래스를 재정의 할 수 없습니다 방법은 하나,도 아니다 당신은 그것을 기대.

    모듈이 클래스에 포함되는 경우, 모듈을 삽입 단지 클래스의 조상 체인의 클래스 후. 부름 클래스에서 슈퍼 모듈의 구현을 호출합니다.

    class Something
      module PreExtension; end
      module PostExtension; end
    
      include PreExtension
      include PostExtension
    end
    
    Something.ancestors # => [Something, Something::PostExtension, Something::PreExtension, Object, Kernel]
    

    방법이 무엇인가에 호출 될 때마다, 루비를 통해 보이는 이 순서의 목록이며, 발견 된 최초의 구현을 호출합니다. 구현이 슈퍼 호출하는 경우, 그것은보고 발견 유지 다음 하나.

    이 방법은 모듈이 포함 된 것을 나중에보다 우선 모듈은 이전 포함되어 있으며 이전 얻기 위해 슈퍼 호출 할 수 있습니다 모듈의 구현 예. 포함 된 모듈이 있기 때문입니다 직접 클래스 후 상위 체인에 삽입 하였다. 이 라우팅 코드 edgerunner이 작품을 언급 한 방법이다. 그 코드 모듈의 풋 모든 것이 너무 좋아한다 :

    class SomethingNew
      module Base
        def my_method
          puts "(A)"
        end
      end
    
      module Extension
        def my_method
          puts "(B)"
          super
        end
      end
    
      include Base
      include Extension
    end
    
    SomethingNew.new.my_method
    # Output:
    # >> (B)
    # >> (A)
    
    SomethingNew.ancestors # => [SomethingNew, SomethingNew::Extension, SomethingNew::Base, Object, Kernel]
    

    alias_method_chain가 처음부터 존재 이유입니다. 모듈의 기본 코드를 넣는 것은 옵션이 아닌 경우에, 나는 확실하지 alias_method_chain에 해당하는 작업을 수행하는 방법입니다.

  3. ==============================

    3.그 alias_method_chain가 더 이상 레일 3.0.0에 존재 볼 수 없습니다. http://api.rubyonrails.org/ 그것을보고하고 지역 변수 또는 메소드를 undefined로보고 콘솔을 레일하지 않습니다.

    그 alias_method_chain가 더 이상 레일 3.0.0에 존재 볼 수 없습니다. http://api.rubyonrails.org/ 그것을보고하고 지역 변수 또는 메소드를 undefined로보고 콘솔을 레일하지 않습니다.

    참조 - https://rails.lighthouseapp.com/projects/8994/tickets/285-alias_method_chain-limits-extensibility#ticket-285-20

    UPDATE :로는 주석 @ecoologic에 의해, alias_method_chain 여전히 레일 3.1.1에 존재하는 지적했다.

  4. from https://stackoverflow.com/questions/3689736/rails-3-alias-method-chain-still-used by cc-by-sa and MIT license