【问题标题】:Rails - Abstract/Shared ViewsRails - 抽象/共享视图
【发布时间】:2010-11-03 03:32:57
【问题描述】:

我有一些非常相似的对象。事实上,他们使用 STI 并将所有数据存储在数据库的同一张表中。目前,每次添加功能或修复错误时,我都必须在 3 个不同的地方更新它,所以我想稍微干一下我的代码。最常见的代码重复出现在视图中。我见过人们使用render :template => 'shared/something' 来表达他们的共同观点,问题是,我有很多这些,但只针对一个特定的对象(发货),所以我更喜欢render :template => 'shipments/shared/something'render :template => 'abstract_shipments/something' 之类的东西。更重要的是,如果需要,我希望任何实际的类都能够覆盖模板。

你们对如何解决这个问题有什么建议吗?非常感谢您的任何回答!

【问题讨论】:

    标签: ruby-on-rails model-view-controller


    【解决方案1】:

    inherit_views 插件可能会完成这项工作:http://github.com/ianwhite/inherit_views/tree/master。我之前用过成功。

    然后,您可以为所有需要渲染货物的控制器创建一个通用的基本控制器类,并在该基本控制器的视图文件夹中拥有任何通用模板,并在各个控制器的视图文件夹中具有任何特定的覆盖。

    【讨论】:

    • 谢谢,这看起来正是我需要的!
    【解决方案2】:

    类(至少是模型)不知道或不应该知道它们的显示方式。这是 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
    

    DRYer,考虑使用约定(Rails 喜欢约定):

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

    每个子类都有一个部分。

    希望其中的一些帮助/有意义...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-27
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 2013-05-12
      相关资源
      最近更新 更多