我将在哪里放置由多个模型共享的部分文件?
我有一个名为crop.html.erb
的页面,用于一个模型 - Photo
。
现在我想将它用于另一个名为User
的模型。
我可以复制并粘贴代码,但这不是很干,所以我想我会把它移到一个部分。
因为它是在两个模型之间共享的 - 我会在哪里放置?
谢谢!
答案 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>
答案 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/shared
或 app/views/application
)中创建一个名为“共享”或“应用程序”的文件夹。
然后只需将部分移动到那里,然后使用其中之一访问它
<%= render partial: 'shared/socials' %>
# or
<%= render partial: 'application/socials' %>
甚至更简单
<%= render 'shared/socials' %>
# or
<%= render 'application/socials' %>