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指南 。