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

Yuv*_*rmi 53 ruby-on-rails dry partials

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

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

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

谢谢!

Joh*_*ley 59

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

  • 不再是,对于rails 4,正确的目录是app/views/application,我认为这是有道理的... https://robots.thoughtbot.com/directory-for-shared-partials-in-rails (11认同)
  • 由于某些原因,/ app/views/shared /中的部分内容未在我的Rails 4应用程序中被选中?!? (3认同)
  • "这使得'app/views/application /`成为你共享部分的好地方" - [Rails指南布局和渲染](http://edgeguides.rubyonrails.org/layouts_and_rendering.html) (3认同)

eco*_*gic 48

更新

布局继承现在位于布局下的指南中,并且渲染 模板继承的工作方式类似.

Rails 3.1和以下版本实现模板继承,所以我认为现在共享部分的正确位置/app/views/application/,比如你在products#index你身边可以做到以下几点:

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

-# /app/views/application/_empty.html.haml
There are no items
Run Code Online (Sandbox Code Playgroud)

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

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

Railscast:模板继承!

  • 我一直在寻找这个解决方案一段时间了.无法相信指南或任何其他在线教程忽略了这一点. (2认同)

Mih*_*scu 24

TL; DR

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

app/views/application
Run Code Online (Sandbox Code Playgroud)

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

Rails 3和之前的

app/views/shared
Run Code Online (Sandbox Code Playgroud)

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


很长的故事

Rails 3(和先前版本)没有用于存储共享视图的默认位置.

非官方约定是共享视图存储在应用程序/视图/共享.无论你最终存储它们,你都必须指定路径

# render app/views/shared/menu.html.erb
<%= render :partial => "shared/menu" %> 
Run Code Online (Sandbox Code Playgroud)

这个建议由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" %> 
Run Code Online (Sandbox Code Playgroud)

新语法

# render app/views/application/menu.html.erb
# unless menu.html.erb is found in appp/views/my_controller
<%= render partial: "menu" %> 
Run Code Online (Sandbox Code Playgroud)

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

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

除非您有充分的理由这样做,否则请坚持使用新标准并存储您的共享视图app/views/application.


小智 5

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