Rails中整个应用程序共享哪些部分?

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

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

由于它是在两个模型之间共享的, 我将在哪里放置该部分

谢谢!

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

更新

布局inheritance现在位于布局和渲染下的指南中。模板inheritance的工作原理与此类似。

Rails 3.1和下面的版本实现了模板inheritance,所以我认为共享partials的正确位置是/app/views/application/ ,比如你在products#index你可以这样做:

 -# products#index = render @products.presence || 'empty' -# /app/views/application/_empty.html.haml There are no items 

btw它的application因为连接是控制器的inheritance,所以这假设ProductsController < ApplicationController

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

Railscast:模板inheritance!

TL; DR

Rails 3.1,Rails 4,Rails 5以及其他方面

 app/views/application 

如果在控制器path中找不到视图,引擎将自动search此path。

Rails 3和之前的版本

 app/views/shared 

引擎不会自动search此path。


很长的故事

Rails 3 (和以前的版本) 没有默认位置来存储共享视图。

非官方的约定是在app / views / shared中存储共享视图。 无论你最终将它们存储在哪里,都必须指定path

 # render app/views/shared/menu.html.erb <%= render :partial => "shared/menu" %> 

敏捷Web开发与Rails推广这个build议。

Rails 3.1引入了存储共享视图的官方标准
应用/视图/应用

由于这个标准,引擎现在自动在app / views / application中查找模板。 因此, 您不必再使用完整path

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

旧的语法

 # 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" %> 

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

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

除非你有很好的理由这样做,否则请坚持新的标准,并将你的共享视图存储在app/views/application

Rails视图使用app/views/layouts共享部分,如页眉和页脚,但Ruby on Rails指南使用示例中的 app/views/shared 。 我想这归结于个人偏好。 我会使用layouts作为主要导航或页脚等高层次的东西,但shared像一个窗体更狭窄的控制器级别的东西。

我一般有一个共享文件夹在我的意见,其中包含常用的偏见。

放在哪里并不重要。 您可以通过提供文件的renderpath来在任意位置渲染任何部分 – 不需要将其与渲染的控制器相关联。 我在view目录下使用一个简单的叫做partials的目录,并像这样调用partials:

 render :partial => 'partials/mypartial'