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

Posted

技术标签:

【中文标题】Ruby on Rails 中一个共享视图的两个控制器【英文标题】:Two controllers for one shared view in Ruby on Rails 【发布时间】:2010-10-03 03:16:15 【问题描述】:

我有两个控制器分别用于两个模型,例如照片和类别。 index 和 show 方法在每个控制器中都非常相似,并且视图是相同的。两个模型共享视图的最佳方法是什么?

我有两个选择:

使用助手。在帮助器中将放置视图的代码,并从每个视图(照片/视图和类别/视图)调用帮助器

在每个视图中使用部分。我认为这是一个更干净的解决方案,但在编写此解决方案时,我的脑海中出现了巨大的 DRY。

所以,我有来自两个模型的两个控制器,每个都暴露在 @photo 对象上(照片控制器包含所有照片,类别控制器仅包含所选类别的照片),我需要一个视图来显示两者。

我正在为此寻找一个优雅的解决方案,抱怨 REST 和 DRY 原则。有什么想法吗?

提前致谢。

【问题讨论】:

【参考方案1】:

我的一个项目也有类似的情况。大多数控制器的所有删除视图都以相同的方式设置样式,显示相同的确认框,并简单地呈现正在删除的任何对象的可预测显示。

在我看来,解决方案非常简单和优雅。简单地说,我们(开发人员)所做的就是在app/views 中创建一个名为shared 的新目录,并将共享视图放入其中。这些可以是完整的模板文件或只是部分。

我建议使用共享模板(不在类别或照片视图目录中,而是在共享目录中)并从视图中手动呈现。

例如在控制器和文件app/views/shared/photo.html.erb 中都有这样的方法:

def show
  @photo = Photo.first # ... or whatever here
  render :template => 'shared/photo'
end

这应该会成功呈现共享模板。这是最干燥的路线,并且没有在每个控制器的视图目录中使用或多或少的空视图只是为了包含共享部分时得到的污染感觉,正如我理解你的问题所暗示的那样。

【讨论】:

啊,太棒了!我只花了 2 个小时试图擦干我的一个让我悲伤的部分。谢谢 - 这很简单。 现在,当您需要使用 AJAX 加载该模板时会发生什么? :) 当我在 Rails 4.2.5 中尝试此操作时,我收到错误“ActionController::RackDelegation#content_type delegated to @_response.content_type, but @_response is nil: #<0x007fda1c5c30c0.... rails> 【参考方案2】:

关于first答案:

如果必须从视图中呈现局部:

"共享/照片" %>

并且部分必须在 app/views/shared/_photo.html.erb 中

【讨论】:

【参考方案3】:

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

【讨论】:

是的,我认为这是最好的解决方案,因为它可以从每个控制器或视图中看到,但是,将视图代码(html 代码)放在帮助程序中是否正确? 视图代码最好不要放在助手中,除非它少于几行 我会混合使用部分 HTML 代码和代码助手。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

这就是我正在做的:我的大部分视图都是默认的,我只在需要时创建特定的视图

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

【讨论】:

以上是关于Ruby on Rails 中一个共享视图的两个控制器的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on rails 参数出现在 url

如何改进 Ruby on Rails 视图中的代码

Ruby on Rails 变量在视图中显示 Active Record 数据而不是整数

Ruby on Rails 中的社交媒体共享按钮

Ruby on Rails,带有对象方法的表单助手

Ruby on Rails 4,在视图中形成