2012-07-27 2 views
0

그래서 필자는 필자의 레일 애플리케이션 용 Presenter를 사용하기위한 첫 걸음을 내딛었으며 필자는 일부 코드에 대한 리팩터링을 검토하고있다. 전화 번호 (예 : 전화, 셀 및 팩스)를 멋지게 표시하거나 '없음'으로 표시하는 여러 입력란이 있습니다. 당연히 나는 원래 이것을 보았지만 논리를 내 발표자로 옮겼다. 일단 거기 나는 그것이 발견 모두 같은 그래서 개인 메소드 이름과 송신 기능을 사용하는 방법으로 그것을 리팩토링 :__method__에 의존하는 리팩토링 방법

class CustomerPresenter < BasePresenter 
    presents :customer 

    def phone 
    format_number(__method__) 
    end 

    def cell 
    format_number(__method__) 
    end 

    def fax 
    format_number(__method__) 
    end 

private 

    def format_number(method) 
    hande_none customer.send(method) do 
     h.number_to_phone(customer.send(method), :area_code => true) 
    end 
    end 
end 

아직이 코드는 여전히 건조하지 않는 것 같습니다. format_number는 메서드 이름을 사용하기 때문에 세 개의 별도 메서드를 정의해야합니다. 내가 여기서 할 수있는 것이 더 있다면 궁금했다.

p.s. hande_none은 블록이 없거나 "none"을 반환하면 블록을 반환합니다.

답변

0

일반적으로 실제 getter/method/attributes 이름을 형식화하는 데 사용되는 메서드와 함께 사용하지 마십시오. 일반적인 접미사로, 당신은 같은 당신을 이끌 것입니다 간단한 method_missing 가질 수 있습니다 : 나는 *_formatted 접미사를 사용하는 거라고 왜

가 그의 기본적

class CustomerPresenter < BasePresenter 
    presents :customer 

    private 

    def format_number(method) 
    hande_none customer.send(method) do 
     h.number_to_phone(customer.send(method), :area_code => true) 
    end 
    end 

    def method_missing(method_name, *args, &block) 
    case method_name 
    when /(.*)_formatted$/ 
     #here you could create the method on the fly to avoid method missing next time 
     return format_number($1) 
    end  
    super(method_name, *args, &block) 
    end 
end 

을, 나는 *_currency_format 내 BasePresenter이를했습니다