Rails:是否可以从资产文件中获取控制器和操作名称?

Raz*_*orm 1 ruby-on-rails asset-pipeline

我想在我的资产管道中做这样的事情:

的application.js

//= require jquery
//= require jquery_ujs
//= require_tree ./includes
//= require global
<% if File.exists? "#{Rails.root}/assets/javascripts/#{params[:controller]}.js" %>
    //= require <%= params[:controller] %>
<% end %>
<% if File.exists? "#{Rails.root}/assets/javascripts/#{params[:controller]}/#{params[:action]}.js" %>
    //= require <%= params[:controller] %>/<%= params[:action] %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

现在这不起作用,因为资产文件无法访问params变量.现在有没有办法从资产中获取当前控制器动作名称?

或者是整个项目的预编译资产文件,这是不可能的?

Bla*_*lor 9

你可以通过一些Tom Foolery来实现这一点,但我会高度反对它.

我这么说的原因是因为你希望这个js资源是可缓存的,并且为了这种情况,它确实需要是静态的.根据正在调用的控制器来定制资产将导致潜在的大量独特资源,所有这些资源都应单独识别,下载和缓存.注意到你已经包含了明显不变的资源,比如jQuery,并且考虑到这些资源需要一次又一次地下载的可能性,我认为这一点很明显,这种方法并不适用.

如果您要做的是基于控制器/操作自定义视图的初始化,我建议在您提供的静态js资产中包含函数定义,然后可以直接从页面调用.

希望这可以帮助.


jde*_*eno 5

资产将被正常预编译,除非您禁用它并构建每个请求,否则这将无法实现.

如果这是为了加载一些只能在某些页面上的js,那么你仍然可以在视图中明确地包含该文件.

如果你出于性能原因试图这样做; 每页加载1个js文件通常是最快的事情.整个文件可以缓存,每个页面加载它可以节省一些额外的请求.文件的大小几乎不是一个因素.

通常我遵循将所有js文件塞入一个模式,然后使用特征检测来启用某些javascript,例如,如果某个元素在页面上,然后加载一些东西.

$("body#user_show").each(function() {
    $(".user_info_box").each(load_user_info)
    // ...
})
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我可以缓存所有内容,只为我在页面上检测到的内容加载js.