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

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

的application.js

//= require jquery //= require jquery_ujs //= require_tree ./includes //= require global  //= require    //= require /  

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

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

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

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

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

希望这可以帮助。

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

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

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

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

 $("body#user_show").each(function() { $(".user_info_box").each(load_user_info) // ... }) 

这样我可以缓存所有内容,只为我在页面上检测到的内容加载js。

我不会在javascript本身中包含控制器名称,因为您希望缓存资产。 更好的解决方案是使用标记中可能的数据属性来自定义脚本初始化过程。 例如,

  

然后在您的application.js中,您可以根据控制器名称调用模块,即。 Users.init()