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

Posted

技术标签:

【中文标题】在 Rails 中将整个应用程序共享的部分放在哪里?【英文标题】:Where to put partials shared by the whole application in Rails? 【发布时间】:2011-01-23 23:40:26 【问题描述】:

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

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

因为它在两个模型之间共享 - 我应该把那个部分放在哪里

谢谢!

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

render :partial => 'partials/mypartial'

【讨论】:

哦,我很清楚。我对最佳实践很感兴趣。不过谢谢! render 'partials/mypartial'render partial: 'partials/mypartial有什么区别?【参考方案3】:

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

【讨论】:

/app/views/shared/ 中的部分内容由于某种原因没有在我的 Rails 4 应用程序中被拾取?!? 不用了,对于rails 4,正确的目录是app/views/application,我觉得有道理...robots.thoughtbot.com/directory-for-shared-partials-in-rails “这使app/views/application/ 成为您共享部分的好地方” - Rails Guide Layouts & Rendering【参考方案4】:

更新

布局继承现在位于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

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

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

Railscast: template inheritance!

【讨论】:

我一直在寻找这个解决方案。不敢相信指南或任何其他在线教程都忽略了这一点。 我已经向guides doc发送了一个关于这个问题的公关,希望它迟早会得到一些关注github.com/rails/rails/pull/16738 dhh 写道:这是 [app/views/application] 这个合理案例的副作用:EmployeesController github.com/rails/rails/pull/9911#issuecomment-15462128 有趣。我喜欢app/views/application:它非常一致,我怀疑他们现在会删除它。【参考方案5】:

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

【讨论】:

【参考方案6】:

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

多亏了这个标准,引擎现在会自动在 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" %> 

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

&lt;%= render :partial =&gt; "my_own_special_shared_folder/menu" %&gt;

除非您有充分的理由这样做,否则请遵守新标准并将您的共享视图存储在 app/views/application

【讨论】:

【参考方案7】:

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

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

但是 TL;DR

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

然后只需将部分移动到那里,并使用任一访问它

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

# or

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

甚至更简单

<%= render 'shared/socials' %>

# or

<%= render 'application/socials' %>

【讨论】:

以上是关于在 Rails 中将整个应用程序共享的部分放在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 4.1 中将页面特定的 jQuery 代码放在哪里?

在公共 Rails 应用程序中将敏感数据存储在哪里?

在一个露天项目中将 live-search-docs 配置文件放在哪里?

在哪里放置不是模型、视图、控制器或助手的 Rails 代码?

我可以在 vue.js 中将授权逻辑放在哪里?

在 Fortran 中将“隐式无”放在哪里