我有两个控制器用于两个相应的模型,例如照片和类别.index和show方法在每个控制器中非常相似,并且视图是相同的.两个模型分享视图的最佳方法是什么?
我有两个选择:
使用帮助器.在帮助器中将放置视图的代码,并将从每个视图调用帮助器(照片/视图和类别/视图)
在每个视图中使用partial.我认为这是一个更干净的解决方案,但在我编写这个解决方案时,我会在脑海中看到巨大的DRY.
所以,我有两个模型的两个控制器,每个控制器都有一个@photo对象(照片控制器包含所有照片,类别控制器只有所选类别的照片),我需要一个视图来显示两者.
我正在寻找一个优雅的解决方案,抱怨REST和DRY原则.任何的想法?
提前致谢.
我和我的一个项目有类似的情况.大多数控制器的所有删除视图都采用相同的方式设置,显示相同的确认框,并简单地呈现可删除任何对象的可预测显示.
在我看来,解决方案非常简单和优雅.简而言之,我们(开发人员)所做的是在app/views
被调用中创建一个新目录shared
并在其中放置共享视图.这些可能是完整的模板文件或只是部分文件.
我建议使用共享模板(既不是类别也不是照片视图目录,而是在共享目录中)并从视图中手动渲染.
例如,在控制器和文件中都有这样的方法app/views/shared/photo.html.erb
:
def show @photo = Photo.first # ... or whatever here render :template => 'shared/photo' end
这应该成功呈现共享模板.它是DRYest路线,并且在每个控制器的视图目录中使用一个或多或少的空视图时只是包含一个共享的部分,没有污染的感觉,正如我理解你的问题所暗示的那样.
关于第一个答案:
如果必须从视图呈现部分:
<%= render :partial => "shared/photo" %>
部分必须在app/views/shared/_photo.html.erb中