54

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

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

由于它在两个模型之间共享 -我将把那个部分放在哪里

谢谢!

4

7 回答 7

62

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

于 2010-03-05T07:29:08.760 回答
51

更新

布局继承现在在布局和渲染下的指南中 模板继承的工作方式类似。

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

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

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

顺便说一句,这是application因为连接是控制器继承,所以假设ProductsController < ApplicationController

这样,如果您实现/app/views/products/_empty.html.haml将采用这种方式,以上是所有缺失部分的后备,我现在无法检查,但我认为即使是模板本身......

Railscast:模板继承!

于 2012-03-27T14:56:44.470 回答
29

TL;博士

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

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

那些好奇的人可以在这里跟随这个决定背后的思考过程。

旧语法

# 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.

于 2016-02-07T14:30:28.143 回答
5

Rails 视图用于app/views/layouts页眉和页脚等共享部分,但 Ruby on Rails 指南app/views/shared示例中使用。我想这取决于个人喜好。我将layouts用于主导航或页脚之类的高级内容,但shared用于更窄的控制器级别的内容,例如表单。

于 2012-11-27T13:47:18.660 回答
3

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

于 2010-03-05T05:12:22.893 回答
2

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

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

但是 TL;DR

在文件夹中创建一个名为“shared”或“application”的views文件夹(例如app/views/shared,或app/views/application.

然后只需将部分移动到那里,并使用

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

# or

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

甚至更简单

<%= render 'shared/socials' %>

# or

<%= render 'application/socials' %>
于 2021-01-18T10:49:14.150 回答
0

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

render :partial => 'partials/mypartial'
于 2010-03-05T05:24:40.390 回答