两个控制器,用于Ruby on Rails中的一个共享视图

我有两个控制器用于两个相应的模型,例如照片和类别。 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中

我会使用帮助器,因为它们在视图之间共享。 对于HTML部分,我会使用partials,因此它将是两种方式的混合。

这看起来像是Cells gem的一个很好的用例。

@bjeanes如果所有删除视图都相同,则可以创建views / default / delete.html.erb,所有删除操作都将使用它。

这就是我正在做的事情:我的大多数观点都是默认的,我只在需要时创建特定的观点

更新:好的,这篇文章是从2009年开始的,无论如何,我会在这里保留我的评论,万一有人像我一样从谷歌来到这里。