Mike
그는 물었다 12년 전
34

루비 믹스인 슈퍼 방법 및 호출

좋아, 그럼 내 코드 리팩토링 I& # 39, ve been in my little 레일, 내 삶을 만들기 위한 노력의 일환으로 복제에서는 쉽게 제거할 수 있으며 일반적으로 앱 (as I like an easy 생명요). # 39 의 공통 코드 리팩토링, 지금까지 이 부분을 that& 이동할 수 있는 2 대의 내 모델용 모듈에서는 필요할 어디서 포함할 수 있습니까.

So far, so good. # 39 의 it& 것 같은데, ve 작동합니까 아웃하지만 I& # 39 홈런을 I& 하는 문제를 해결하기 위해 어떻게 그냥 # 39 m, 확실하지 않다. 모듈에서는 (# 39 라는 젠드베리 디스크입니다. I&, ve), 팩스, 이메일, 또는 인쇄면이 처리하는 코드는 바로 갈 수 있는 PDF 문서의. 그러므로, 예를 들어, I have a 주문서 저는 내부 영업 명령이라구요 (줄여서 상상 (ISO).

39 문제가 발생, ve I& 도래하도록하려하는 난 로렌아줌마가 일부 변수 초기화 (초기화되었습니다 백성을위한 don& # 39, t 맞춤법 제대로 p) 을 사용하여 객체인지 로드됨 도왔으매 i& after_initialize # 39, ve been 훅. 괜찮서라 내가 좀 더 믹스인 시작할 때까지 추가.

나는 내가 할 수 있는 '문제' 중 하나로 after_initialize 도래하도록하려하는 내 믹스인 도왔으매 데릭쉐퍼드와 포함하기 시작할 때 다른 믹스인 after_initialize '' 슈퍼 호출하십시오 합니다 페이징됩니다 프레젠테이션이든 호출됨. 그리고 난 내가 끝날 때까지 원하는거요 멋지구리해요 호출하십시오 슈퍼 (super 오류가 발생할 수 없기 때문에 가능하다.

39 의 경우, 예를 들어, 내가 조금 here& haven& t # 39 이미 충분한 것이다.

class Iso < ActiveRecord::Base
  include Shared::TracksSerialNumberExtension
  include Shared::OrderLines
  extend  Shared::Filtered
  include Sendable::Model

  validates_presence_of   :customer
  validates_associated    :lines

  owned_by                :customer
  order_lines             :despatched # Mixin

  tracks_serial_numbers   :items  # Mixin

  sendable :customer                      # Mixin

  attr_accessor :address

  def initialize( params = nil )
    super
    self.created_at ||= Time.now.to_date
  end
end

따라서 각 after_initialize 믹스인 중 하나를 가지고 있으며, 그 마지막 전화 통화, 어떻게 정지점을 슈퍼 (super 전화를 제기한 오류? 테스트 할 수 있는 방법을 before I call it 슈퍼 어떻게 해야 합니까?

답변 5 개

이 사용할 수 있습니다.

super if defined?(super)

예를 들어보겠습니다.

class A
end

class B < A
  def t
    super if defined?(super)
    puts "Hi from B"
  end
end

B.new.t

이 같은 클래스 (이 심아이엔큐 있으며, 이 경우에는 ',' 에서 '스티브레코드 기본 상속됩니다 iso') 정의하십시오 after_initialize 이외의 모든 솔루션을 자체 '수' 때문에 'alias_method_chain' (또는 기타 (alias 를 저장하는 원래) 위험요소요 덮어쓰기는 코드입니다. # 39 @orion Edwards&. 가장 좋은 방법은 내놓아야 할 수 있어요. 하지만 이들은 , 하키스 훨씬 더 많은 경우도 있을 수 있습니다.

또한 'alias_method_chain 만드는 방법, 즉 버전의 after_initialize 급여금' 라는 특이한 건 상관있지 오더할 호출하십시오 사용자정의할 수 있습니다. 그렇지 않으면 you& # 39, re dell. 그러나그대 등 모든 오더할 클래스용 dm_ownerdm_owner 믹스인.

  • 나중에 *:

39 에 대한 질문에, ve 게시하기를 i& 루비 온 레일즈 핵심 메일링 리스트를 만드는 모든 콜백 기본 빈 구현하였다. 아무튼, 그래서 내가 그들을 위해 모든 저장 프로세스가 검사를 don& # 39, t, t # 39 그들은 shouldn& 이유를 알 수 없다. 그러나 추가 빈 스택 프레임에 that& # 39 의 유일한 만드는 것입니다 하지만 값싼 모든 꽤 알려진 구축상의.

당신은 alias_method_chain 했다 '?' 기본적으로 '위로' 당신의 모든 after_initialize 페이징됩니다 체인된 수 있습니다. 이 같은 역할을 디자이너이다. 각각의 새로운 방법을 전달하며, 제어 기능을 추가한 새 레이어에는 드래그합니다 &quot overridden&quot. 할 수 있는 방법은 미삭.

그냥 간단히 조건 때문에 던질 수 있습니다.

super if respond_to?('super')

아무 쓸모 없는 메서드을 괜찮을 추가 합니다. 니스 (nice) 나 청소하십시오.

averell
그는 10년 전 댓글을 달았습니다
0
    • 이렇게 해도 안 나타날 것이다. respond_to? (& # 39, super& # 39;) 항상 반품하십시오 거짓값.

슈퍼 방법이 있는지 확인하는 것이 아닌, 그냥 정의하십시오 있을 수 있습니다.

class ActiveRecord::Base
    def after_initialize
    end
end

이 작품은 내 테스트, shouldn& # 39, 기존 코드 때문에 다른 모든 t break all your 정의하는 클래스를 자동으로 어쨌든 이 방법을 재정의을 다만 방침이다.

yaauie
그는 8년 전 댓글을 달았습니다
1

일반 솔루션이므로 다운보테드 없기 때문입니다. # 39 슈퍼 존재 여부를 모르는 경우, 요점이지 don& 도왔으매 몬키퍼트칭 스티브레코드 기본 # after_initialize salesforce. 존재 여부, if / 코드에 기반을 만들 때, # after_initialize 스티브레코드 는 지점에 분할합니다 자도으로 또는 그 인수에 바뀌었다. 이 경우 호출하십시오 훨씬 베터 조건부 로 정의된다.

Orion Edwards
그는 8년 전 댓글을 달았습니다
0

& # 39 올릴 수 있는 '@yaauie - 물론, 나는 방황토록 빼았아놓구 no& # 39;; 하지만 그 전에 할 것이라고 몬키파치 메토즈스의 클로드? (:after_initialize) '이 경우, 예를 들어 더욱 이해하기 힘들다. # 39 의 it& 그렇게 쉽게 얻을 수 있는 모든 모서리까지 포착됨 백업하도록 세부화하기 건 여기서 교훈을 얻을 수 있는 실제 (just 패치합니다 기본 방법으로) 를 손실됩니다 소음입니다.

yaauie
그는 8년 전 댓글을 달았습니다
1

& # 160; 일반적으로 일반 솔루션 및 안 몬키퍼트칭 아닙니다 - 수 - 권장됨. 일어날 수 있는 단일 몬키파치 작업할 수 있다는 답변을 部门从 복잡하고 불필요한 코드, 특히 취약한 don& # 39 의 경우, all the way up the 상속 체인 제어할 수 없다.