2010-05-27 4 views
2

내 모델의 한 특성에 메서드 체인을 동적으로 만들려고합니다.alias_attribute 원래 특성 이름을 사용하여 메서드를 만들고 루프하면 루프가 발생합니다.

def create_filtered_attribute(attribute_name) 
      alias_attribute "#{attribute_name}_without_filter", attribute_name 

      define_method "#{attribute_name}" do 
      filter_words(self.send("#{attribute_name}_without_filter")) 
      end 
end 

그래서 난, 속성 이름과 함께 '_without_filter'에 대한 별칭을 문자열을받는 클래스가 생성 될 때 속성이 밤은 때문에 (alias_method 또는 alias_method_chain이 여기에 실패 지금까지 나는이 기능이), 그리고 나는 그 내용을 필터링하는 속성 이름으로 새로운 메소드를 만든다.

그러나 어떻게 든 을 "# {attribute_name} _without_filter"으로 호출하면 내 새 메서드를 호출합니다. (왜냐하면 alias_attribute가 어떤 방법으로 생각하기 때문에) 프로그램이 스택 루프로 들어갑니다.

임은 그 속성의 이름을 변경하려고, 그래서 방법에 대해 이름을 사용할 수 있습니다 ...

은 누군가가 나이에 계몽하십시오 할 수 있습니다.

답변

6

alias_methodalias_attribute 사이에 차이가 있습니다. alias_method은 실제로 이전 방법의 복사본을 만듭니다. 반면 alias_attribute은 새로운 메서드를 정의합니다. 은 이전 메서드를이라고합니다. alias_attribute 대 alias_method에 대한 블로그 게시물이

define_method "#{attribute_name}" do 
    filter_words(self.read_attribute(attribute_name)) 
    end 
+0

있다 : 당신은 항상 당신의 속성에 액세스 할 수 있도록 당신이 그것을 무시하더라도 액티브에 model.attributemodel.attribute= 방법은 간단, read_attributewrite_attribute를 호출하는 것이

참고 게터 또는 세터의 사용 사례 : http://www.chrisrolle.com/blog/aliasing-the-rails-way –

관련 문제