2014-11-14 38 views
1

我已經開始使用PORO方法創建我的鐵軌演示者。實例演示駐留在app/presenters/band_presenter.rb這裏是它的代碼:PORO主持人打破網址幫手

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 

和它的作品好。但是,如果我將在rails 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'是不夠的,OP也應該定義'method_missing'將'缺席的電話'委託給'@ band'。此外,您的第一個解決方案也不起作用,因爲您不僅應該定義'to_param',還要定義'model_name'方法。 –

+0

我沒有理由複製粘貼代碼,當然,我的意思是他應該將方法另外添加到他已有的方法中(他已經定義了'method_missing')。感謝評論'model_name',這就是爲什麼我說「嘗試」,因爲我沒有測試它是否足夠。 – mrbrdo

+0

你說得對,我沒有注意到OP已經定義了'method_missing'。 BTW'model_name'應該委託給'Band'類,而不是實例,'BandPresenter'類應該對它做出響應,如下例所示:https://gist.github.com/myobie/981251。 –