在Rails中将整个应用程序共享的部分放在何处?

时间:2010-03-05 04:49:00

标签: ruby-on-rails dry partials

我将在哪里放置由多个模型共享的部分文件? 我有一个名为crop.html.erb的页面,用于一个模型 - Photo。 现在我想将它用于另一个名为User的模型。

可以复制并粘贴代码,但这不是很干,所以我想我会把它移到一个部分。

因为它是在两个模型之间共享的 - 我会在哪里放置

谢谢!

7 个答案:

答案 0 :(得分:59)

Rails约定是将共享部分放在/app/views/shared

答案 1 :(得分:47)

<强>更新

布局继承现在位于layout and rendering下的指南中 模板继承的工作原理类似。

Rails 3.1和以下版本实现模板继承,所以我认为共享部分的正确位置现在是/app/views/application/,比如你在products#index你可以执行以下操作:

-# products#index
= render @products.presence || 'empty'

-# /app/views/application/_empty.html.haml
There are no items

btw它是application,因为连接是控制器继承,所以这假定为ProductsController < ApplicationController

这样一来,如果你实现了/app/views/products/_empty.html.haml将被采用,上面是所有缺失部分的后备,我现在无法检查,但我认为即使是模板本身... < / p>

Railscast: template inheritance!

答案 2 :(得分:23)

TL; DR

Rails 3.1,Rails 4,Rails 5 以及接下来的任何内容

app/views/application

如果在控制器路径中找不到视图,引擎会自动搜索此路径。

Rails 3和之前的

app/views/shared

引擎不会自动搜索此路径。

长篇故事

  

Rails 3 (和之前的版本)具有无默认位置,用于存储共享视图。

     

非正式约定是在 app / views / shared 中存储共享视图。无论你最终存储它们,你都必须指定路径

# render app/views/shared/menu.html.erb
<%= render :partial => "shared/menu" %> 

这个建议由Agile Web Development with Rails推广。

  

Rails 3.1 引入了官方标准,用于存储共享视图的位置:
  应用/视图/应用

     

由于此标准,引擎现在会自动在 app / views / application 中查找模板。因此,您不必再使用完整路径

     

那些好奇的人可以遵循here这个决定背后的思考过程。

旧语法

# render app/views/application/menu.html.erb
# unless menu.html.erb is found in appp/views/my_controller
<%= render :partial => "menu" %> 

新语法

# render app/views/application/menu.html.erb
# unless menu.html.erb is found in appp/views/my_controller
<%= render partial: "menu" %> 

当然,您仍然可以将您的共享视图放在任何位置,并通过路径

引用它们

<%= render :partial => "my_own_special_shared_folder/menu" %>

除非您有充分的理由这样做,否则请坚持使用新标准并将您的共享观点存储在app/views/application中。

答案 3 :(得分:4)

The Rails View使用app/views/layouts作为页眉和页脚等共享部分,但Ruby on Rails指南使用an example中的app/views/shared。我想这取决于个人喜好。我会将layouts用于主要导航或页脚等高级内容,但shared用于更简单的控制器级内容,例如表单。

答案 4 :(得分:3)

我一般在我的视图中有一个包含常用部分的共享文件夹。

答案 5 :(得分:0)

你把它们放在哪里都没关系。您可以通过提供文件到render的路径在任意位置渲染任何部分 - 它不需要与渲染它的控制器相关联。我在partials目录下使用一个名为view的目录,并在其中调用partials:

render :partial => 'partials/mypartial'

答案 6 :(得分:0)

我于 2021 年来到这里(rails 6),但对答案(许多不同的方式)感到困惑。

我问了一些高级 Rails 开发人员他们会做什么,他们也给了我两个不同的答案。

但是 TL;DR

在您的 views 文件夹(例如 app/views/sharedapp/views/application)中创建一个名为“共享”或“应用程序”的文件夹。

然后只需将部分移动到那里,然后使用其中之一访问它

<%= render partial: 'shared/socials' %>

# or

<%= render partial: 'application/socials' %>

甚至更简单

<%= render 'shared/socials' %>

# or

<%= render 'application/socials' %>