2009-01-23 120 views
24

我有两个控制器为两个相应的模型,例如,照片和类别。索引和显示方法在每个控制器中非常相似,并且视图是相同的。两种模式共享视图的最佳方法是什么?两个控制器的Ruby on Rails的一个共享视图

我有,虽然两个选项:

  • 使用帮手。在助手将把视图的代码,并会从每个视图(照片/视图和类别/视图)调用助手

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

所以,我有两个型号两个控制器,每个人在暴露了一个@photo对象(照片控制器的所有照片和类别控制器只选定categorie的照片),我需要一个视图同时显示。

我正在寻找一个优雅的解决方案,抱怨REST和DRY principes。任何想法?

在此先感谢。

回答

38

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

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

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

例如具有在两个控制器的方法本身和一个文件app/views/shared/photo.html.erb

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

这应成功地呈现共享的模板。这是DRYest路线,当我在每个控制器的视图目录中使用或多或少的空视图时,并没有感觉到污染,只是为了包含共享的部分,因为我的理解是您的问题提示。

1

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

+0

是的,我认为这是最好的解决方案,因为它从每个控制器或视图的可见性,但是,将视图代码(html代码)放在助手中是否正确? – ARemesal 2009-01-23 13:30:28

+0

最好不要将视图代码放在帮助器中,除非它少于几行 – 2009-01-23 14:00:41

6

关于first答案:

如果部分必须从一个视图被呈现:

 
<%= render :partial => "shared/photo" %> 

和部分必须在共享/ _photo.html.erb

应用/视图/
1

这看起来像是一个很好用的Cells宝石。

0

@bjeanes如果你所有的删除视图都一样,你可以创建views/default/delete.html。erb和所有删除操作将使用它。

这就是我在做什么:我的大多数观点都在默认情况下,并只在需要时我创建特定的人

更新:好吧,这个帖子是从2009年,反正我会继续我的评论在这里有人像我一样从Google那里来到这里。

相关问题