DRY MVC声明最小控制器特定资产管道
有几种方法可以在Rails中包含特定于控制器的资产:
一个不是DRY的选项是在布局中添加= yield :head
,在每个顶级视图中 添加 content_for(:head) { ... }
。 如果资产是特定于控制器的,则应仅为每个控制器指定一次,而不是在每个视图中指定。 当然,这种方法对于特定于视图的资产来说非常棒。
第二个非声明性选项是添加与控制器名称相对应的资产(如果存在) 。 我不应该检查某些东西是否存在,而应该简单地说(在适当的情况下)它存在并且必须包括在内。 此外,我不确定是否会缓存响应以避免运行时性能损失。 从积极的方面来看,这种方法不需要对视图或控制器进行任何更改,但它可能会打开名称冲突的可能性,尤其是对于遗留模型。
第三种选择是将所有类型的资产包含在单个文件中 。 浏览器不应下载他们不需要的资产,这会使调试应用程序变得更加困难。 如果总资产规模仍可管理,则此选项可以。
有没有办法以DRY方式声明性地将单个控制器特定资产包含在单独的文件中,而不使用非常少的代码破坏MVC模型?
如果在应用程序布局中使用以下include命令,Rails将仅将控制器特定资产文件中的代码提供给指定的控制器:
<%= javascript_include_tag params[:controller] %> <%= stylesheet_link_tag params[:controller] %>
我怀疑如果你这样做,你还需要做以下事情:
- 仍然包含
<%= javascript_include_tag :application %>
和<%= stylesheet_link_tag :application %>
以获取所有跨控制器资产 - 检查
require_tree .
如何require_tree .
指令用于确保application.css
和<%= stylesheet_link_tag params[:controller] %>
不加载控制器特定资产,实际上您可能需要删除require_tree .
并将任何交叉控制器表直接加载到application
文件中
有关详细信息,请参阅第2节中资产管道上的Rails指南 。