[RUBY-ON-RAILS] 3 레일 : alias_method_chain 아직 사용?
RUBY-ON-RAILS3 레일 : 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.아니,이 모듈에 무시 방법과 슈퍼 키워드의 영리한 사용에 의해 대체되었습니다.
아니,이 모듈에 무시 방법과 슈퍼 키워드의 영리한 사용에 의해 대체되었습니다.
기본적으로, 당신은 포함 모듈에 원래의 함수를 정의하고 다른 포함 된 모듈에 우선합니다. 당신이 오버라이드 (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.일반적으로, 모듈은 클래스의 메소드를 오버라이드 (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.그 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에 존재하는 지적했다.
from https://stackoverflow.com/questions/3689736/rails-3-alias-method-chain-still-used by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 레일에 어떤 루비는 루비 버전과 호환? (0) | 2020.02.11 |
---|---|
[RUBY-ON-RAILS] jQuery를 : 어떻게하는 동안 문서의 제목을 변경하는 .ready ()? (0) | 2020.02.11 |
[RUBY-ON-RAILS] LEFT OUTER 레일에 조인 3 (0) | 2020.02.11 |
[RUBY-ON-RAILS] 3 모델없이 사용자 정의 SQL 쿼리를 실행 레일 (0) | 2020.02.11 |
[RUBY-ON-RAILS] 포맷 날짜를 레일 (0) | 2020.02.11 |