2009-06-15 39 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 } %> 

,你有一个局部的每个子类。

希望一些有助于/有意义...