我有两个控制器用于两个相应的模型,例如照片和类别。 index和show方法在每个控制器中非常相似,并且视图是相同的。两个模型分享视图的最佳方法是什么?
我有两种选择:
使用帮助器。在帮助器中将放置视图的代码,并将从每个视图调用帮助器(照片/视图和类别/视图)
在每个视图中使用partial。我认为这是一个更干净的解决方案,但是在我编写这个解决方案时,我会看到很大的DRY。
所以,我有两个模型的两个控制器,每个控制器都有一个@photo对象(照片控制器包含所有照片,类别控制器只有所选类别的照片),我需要一个视图来显示两者。 / p>
我正在寻找一个优雅的解决方案,抱怨REST和DRY原则。有什么想法吗?
提前致谢。
答案 0 :(得分:38)
我的一个项目也有类似的情况。大多数控制器的所有删除视图都采用相同的方式设置,显示相同的确认框,并简单地呈现可删除任何对象的可预测显示。
在我看来,解决方案非常简单和优雅。简而言之,我们(开发人员)所做的是在app/views
中创建一个名为shared
的新目录,并在其中放置共享视图。这些可能是完整的模板文件,也可能只是部分文件。
我建议使用共享模板(既不是类别也不是照片视图目录,而是在共享目录中),并从视图中手动渲染。
e.g。在控制器和文件app/views/shared/photo.html.erb
中都有这样的方法:
def show
@photo = Photo.first # ... or whatever here
render :template => 'shared/photo'
end
这应该成功呈现共享模板。它是DRYest路线,并且在每个控制器的视图目录中使用或多或少的空视图时只是包含共享部分,没有污染感,正如我理解你的问题所暗示的那样。
答案 1 :(得分:6)
关于first答案:
如果必须从视图中呈现部分:
<%= render :partial => "shared/photo" %>
且部分必须位于app / views / shared / _photo.html.erb
中答案 2 :(得分:1)
我会使用帮助器,因为它们在视图之间共享。对于HTML部分,我会使用partials,因此它将是两种方式的混合。
答案 3 :(得分:1)
这似乎是Cells gem的一个很好的用例。
答案 4 :(得分:0)
@bjeanes如果所有删除视图都相同,您可以创建views / default / delete.html.erb,所有删除操作都将使用它。
我正在做的事情:我的大多数观点都是默认的,我只在需要时创建特定的观点
更新:好的,这篇文章是从2009年开始的,无论如何,我会在这里保留我的评论,万一有人像我一样从谷歌来到这里。