我将在哪里放置由多个模型共享的部分文件?我有一个名为crop.html.erb
用于一个模型的页面 - Photo
. 现在我想将它用于另一个名为User
的模型。
我可以复制和粘贴代码,但这不是很干,所以我想我会把它移到部分中。
由于它在两个模型之间共享 -我将把那个部分放在哪里?
谢谢!
我将在哪里放置由多个模型共享的部分文件?我有一个名为crop.html.erb
用于一个模型的页面 - Photo
. 现在我想将它用于另一个名为User
的模型。
我可以复制和粘贴代码,但这不是很干,所以我想我会把它移到部分中。
由于它在两个模型之间共享 -我将把那个部分放在哪里?
谢谢!
Rails 约定是将共享部分放在/app/views/shared
.
更新
布局继承现在在布局和渲染下的指南中 模板继承的工作方式类似。
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
将采用这种方式,以上是所有缺失部分的后备,我现在无法检查,但我认为即使是模板本身......
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
.
我的视图中通常有一个共享文件夹,其中包含常用的部分。
我于 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' %>
你把它们放在哪里都没关系。您可以通过提供文件的路径来在任意位置渲染任何部分render
- 它不需要与渲染它的控制器相关联。我使用一个在目录partials
下简单调用的view
目录,并在其中调用 partials,如下所示:
render :partial => 'partials/mypartial'