2009-06-15 79 views
0

我有幾個令人難以置信的相似的對象。事實上,他們使用STI並將所有數據存儲在數據庫中的同一個表中。目前,每當我添加一個功能或修復一個bug時,我都必須在3個不同的地方更新它,所以我想稍微幹一點我的代碼。最常見的代碼重複是在視圖中。我已經看到了使用render :template => 'shared/something'來呈現他們的共同觀點的人,問題是,我有很多的這些,但只針對一個特定的對象(出貨量),所以我寧願像render :template => 'shipments/shared/something'render :template => 'abstract_shipments/something'。更重要的是,我希望任何實際的類能夠覆蓋模板,如果需要的話。Rails - 抽象/共享視圖

難道你們都對如何去這個問題有什麼建議?非常感謝任何答案!

回答

1

inherit_views插件可能做的工作:http://github.com/ianwhite/inherit_views/tree/master。我以前成功地使用過它。

然後,您可以對所有的控制器需要渲染出貨量,並在該基地控制器的意見的任何普通模板的基礎類的在單個控制器的意見文件有任何特定的覆蓋文件夾中。

+0

謝謝,這看起來很像我所需要的! – 2009-06-15 21:52:14

0

類(至少機型)不 - 或者不應該 - 瞭解他們是如何顯示的東西。這是MVC模式提供的問題分離的基礎。

我想我會嘗試這樣的事:

使用單個控制器用於所有的STI車型,ShipmentsController或類似的東西。除了看起來合乎邏輯的事情之外,你所有的觀點都會在同一個地方出現,這應該有所幫助。

至於視圖,怎麼樣一個「主」一個爲共同的部分,並且一個部分爲每一組特定的子類字段的?在你看來使用case,或者可能更乾淨,一個輔助方法,像

def partial_name_for_subclass(obj) 
    if obj.is_a?(CrudeOilShipment) # or kind_of? or test the type column or use respond_to? 
    'crude_oil_shipment' 
    # etc 
    end 
end 

機,可以考慮使用一個約定(Rails的愛慣例):

<%= render :partial => @shipment.class.name.downcase, :locals => { :item => @shipment } %> 

,你有一個局部的每個子類。

希望一些有助於/有意義...