2012-03-30 2 views
0

나는 레일 젬을 만드는 것을 망설이고 ActiveRecord에 메소드를 추가하는 데 문제가 있습니다. 이 전 다음을 수행 할 가정 해 봅시다 :이 작업을하기 위해레일 : activerecord에 메소드 추가하기

class DemoModel < ActiveRecord::Base 
    custom_method :first_argument, :second_argument 
end 

, 나는 다음에 던져 : 정말 좋은

module DemoMethod 

    def self.included(base) 
    base.extend(ClassMethods) 
    end 

    module ClassMethods  
    def custom_method(*fields) 
     @my_fields = fields 
    end 
    end 

end 

ActiveRecord::Base.send(:include, DemoMethod) 

지금까지.

문제는 모델의 인스턴스에서 my_fields 변수에 액세스하려는 것입니다. 예를 들어, 내가 좋아하는 뭔가 form_for 열 수 있습니다 (

module ActionView::Helpers::FormHelper 
    def fields_for(record_name, record_object, options = {}, &block) 
    the_fields = record_object.<I WANNA ACCESS @my_fields HERE!!!>.html_safe 
    # ... 
    end 
end 

어려움은, 'custom_method'는 내가 수업 방법으로 도우미를 설정 한 경우 작동하는 것 같다,하지만 .self 이제 모델을 의미 DemoModel) 대신에 DemoModel 개체를 사용할 수 있습니다. "custom_method self, : first_argument, : second_argument"를 사용하여 객체를 수동으로 전달할 수는 있지만 내 멋진 "custom_method"보석의 사용자에게 인수 목록에 'self'를 앞에 붙여야한다는 약간의 불편 함이 있습니다.

그래서 현명한 레일스 사용자가 custom_method를 통해 특정 객체에 대한 값을 설정 한 다음 fields_for와 같은 다른 곳에서 값을 검색하는 방법은 무엇입니까?

항상 그렇듯이 모든 의견을 환영합니다.

답변

2

self.includedClassMethods을 사용하면 메소드를 클래스 메소드로 추가합니다.

일반적으로 모듈 내에서 메서드를 정의한 다음이를 포함하면 일반 인스턴스 메서드를 만드는 방법입니다. 좋아요 :

module DemoMethod 

    def custom_method(*fields) 
    @my_fields = fields 
    end 
end 

ActiveRecord::Base.send(:include, DemoMethod) 
+0

물론입니다. .extend는 나를 혼란스럽게했다. 많은 감사합니다. – PlankTon

관련 문제