【问题标题】: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
【解决方案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 } %>
每个子类都有一个部分。
希望其中的一些帮助/有意义...