2014-11-14 1 views
1

나는 PORO 방식을 사용하여 제 발표자를 만들기 시작했습니다. 예 발표자는 app/presenters/band_presenter.rb에 있으며 여기의 코드입니다PORO 발표자가 URL 헬퍼를 깨기

class BandPresenter 
    def method_missing(m, *args, &block) 
    @band.send(m) 
    end 

    def initialize(band) 
    @band = band 
    end 

    def thumb_url(size = :large_s) 
    @band.images[size.to_s] if @band.images 
    end 
end 

그리고 그것은 잘 작동합니다. 그러나 레일 url 도우미 메서드에서 해당 발표자의 인스턴스를 사용하는 경우이를 나눕니다. 예 :

@band = Band.find(1) 
= link_to @band.name, band 
# => /bands/1 

@band = @band.find(1) 
@band = BandPresenter.new(@band) 
= link_to @band.name, band 
# => /%23%3CBandPresenter:0x007f9139c50db0%3E/1 

완전히 합법적 인 것 같습니다. 내 질문은 - 어떻게 든 내 발표자가 URL 도우미를 사용하는 그런 식으로 지원할 수 있습니까?

답변

1

to_param 방법

class BandPresenter 
    def to_param 
    @band.id 
    end 

    def model_name 
    @band.model_name 
    end 
end 

respond_to_missing?를 정의하는 데 도움이 될 또 다른 옵션을 정의하려고 여기를 참조 : http://robots.thoughtbot.com/always-define-respond-to-missing-when-overriding

class BandPresenter 
    def respond_to_missing?(method_name, include_private = false) 
    @band.respond_to?(method_name, include_private) || super 
    end 
end 
+0

을 respond_to_missing'가 충분하지 않다'정의, 영업 이익은 또한'method_missing'을 정의해야합니다 '@ band'에 누락 된 전화를 '위임'합니다. 또한,'to_param'뿐만 아니라'model_name' 메소드도 정의해야하기 때문에, 솔루션의 첫 번째 평가는 작동하지 않을 것입니다. –

+0

OP에서 코드를 복사하여 붙여 넣을 이유가 없다는 것을 알았습니다. 당연히 이미 기존 메서드에 메서드를 추가해야한다는 의미였습니다 (이미 'method_missing'이 정의되어 있습니다). 'model_name'에 대한 의견을 보내 주셔서 감사합니다. 그래서 "충분"했는지 테스트하지 않았기 때문에 "시도"라고 말했습니다. – mrbrdo

+0

네 말이 맞아, 나는 OP가 이미 'method_missing'으로 정의 된 것을 알지 못했다. BTW'model_name'은 인스턴스가 아닌'Band' 클래스에 위임되어야하며,'BandPresenter' 클래스는 다음 예제처럼 응답해야합니다 : https://gist.github.com/myobie/981251. –