适当的“Rails”方式在特定页面上执行javascript

我试图在特定页面上运行javascript,我唯一的解决方案似乎是反模式。 我在assets/javascripts/生成了controller.js 。 我正在使用gem 'jquery-turbolinks'我的代码类似于以下内容:

 $(document).ready(function () { //Initiate DataTables ect.. } ) 

此代码在每个页面上触发,因此我在其中添加了以下内容。

 if ($('#page-specific_element').length > 0) { //Initiate Datatables ect. } 

我的问题是,有没有办法设置rails只使用特定控制器所需的javascript文件或逻辑门控元素搜索最佳解决方案?

这是一个非常好的turbolinks特定解决方案:

  
 // Instead of listening for document ready $(document).on('users#show:loaded', function(){ $('#logger').append('
  • Users Show action loaded
  • '); }); // Instead of listening for document ready $(document).on('users:loaded', function(){ $('#logger').append('
  • Some users controller method loaded
  • '); }); // Turbolinks fires "page:change" when it changes the page content. // you could change this to just document ready if you are not using // turbolinks. $(document).on("page:change", function(){ var data = $('body').data(); $(document).trigger(data.controller + ':loaded'); $(document).trigger(data.controller + '#' + data.action + ':loaded'); }); // This is just for demonstration purposes... $(document).trigger("page:change");
       

      很多方法可以做到这一点。 我会形容一个。

      我使用这个旧的gem来包装commonjs模块中的所有.module.js文件。

      然后我有一个帮助器,它将类似下面的内容写入每个HTML页面头部的标记。

        

      posts/create是从当前控制器和呈现请求的动作的简化混合生成的。

      然后我在我的application.js为我的application.js提供了类似下面的内容。

       try { App.pageModule = require(App.pageModule); } catch(e) { console.log('%c' + e, 'color:red; background-color:yellow'); } if (_.isPlainObject(App.pageModule) && _.has(App.pageModule, 'initialize')) { App.pageModule.initialize(); } 

      最后,我将有一个这样的文件,特定于/posts/create URL。

      应用程序/资产/职位/ create.module.js

       module.exports = { initialize: function() { // data-tables stuff here... } }