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
像一个窗体更狭窄的控制器级别的东西。
我一般有一个共享文件夹在我的意见,其中包含常用的偏见。
放在哪里并不重要。 您可以通过提供文件的render
path来在任意位置渲染任何部分 – 不需要将其与渲染的控制器相关联。 我在view
目录下使用一个简单的叫做partials
的目录,并像这样调用partials:
render :partial => 'partials/mypartial'