2012-05-03 3 views
4

모듈이 포함 된 모델이 있습니다. 모듈 내의 접근 자 메소드를 오버라이드하고 싶습니다. 예를 들어믹스 인/모듈에서 모델의 속성 접근자를 재정의합니다.

는 :

class Blah < ActiveRecord::Base 
    include GnarlyFeatures 
    # database field: name 
end 

module GnarlyFeatures 
    def name=(value) 
    write_attribute :name, "Your New Name" 
    end 
end 

이것은 분명히 작동하지 않습니다. 이 작업을 수행하기위한 아이디어가 있습니까?

답변

7

코드가 올바르게 표시됩니다. 이 정확한 패턴을 아무 문제없이 사용하고 있습니다.

제가 기억한다면 Rails는 속성 설정자에 #method_missing을 사용하므로 모듈이 ActiveRecord의 설정자를 차단하여 우선 순위를 갖습니다. 당신이 ActiveSupport :: 우려를 사용하는 경우

(다음 인스턴스 메소드는 특수 모듈로 이동해야합니다, this blog post를 참조하십시오..

class Blah < ActiveRecord::Base 
    include GnarlyFeatures 
    # database field: name 
end 

module GnarlyFeatures 
    extend ActiveSupport::Concern 

    included do 
    def name=(value) 
     write_attribute :name, value 
    end 
    end 
end 
+0

흠 난에 대해 당신이 ActiveSuppport을 확장하는 방법 뭔가 잘못하고 있어야합니다 : : – KendallB

+0

변경된 사항 업데이트 된 답변보기 – tihm

+0

정말 도움이되었지만 정확한 것은 아니 었습니다. 레일스 3.2에서는 InstanceMethods가 더 이상 포함되지 않은 것처럼 보입니다 : 사용 중단 경고는 간단하게 말했습니다 "포함 된"블록에 접근자를 포함하는 것 – KendallB