如何加载页面特定的rails 4 js文件?

我正在阅读有关资产管道的rails指南文档。 它声明,如果清单上有require_tree指令,则默认情况下,coffeescript页面特定生成的文件可供用户使用。 这不适合我,我必须包括这个

 

在特定的控制器上。 我错过了什么?

资产管道将所有JS压缩为单个文件application.js 。 为了为特定页面调用JS,您需要通过控制器和操作来组织JS。 有一个gem,RailsS​​cript自动执行此操作,它与Turbolinks兼容,可以为您提供单页应用程序的感觉。

RailsS​​cript只需几分钟即可学习, https://github.com/gemgento/rails_script 。

使用rails脚本的具体示例:

 # app/assets/javascripts/users.js.coffee window.App ||= {} class App.Users extends App.Base show: -> alert('The users#show action!') 

我认为你总体上误解了资产管道。 它不会单独加载javascript文件,而是所有的.js.coffee文件都会被编译成一个大的js文件,你必须将它包含在你的视图/布局中

  <%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %> 

如果你想要一些只在一个视图中可用的js-code,你绝对不应该将它包含在资产管道中。

不确定我是否误解了你的第一段,但我认为该行意味着如果你的application.js清单包含一行如下:

 //= require_tree . 

确实如此,页面特定的javascript或coffeescript将被加载,不仅针对该特定页面,也针对所有页面。 如果您想将资产约束到您所描述的某些页面,则需要一个位于app/assets/javascripts/的文件,其中包含控制器的复数名称和.js

我个人会将此创建为该特定页面的另一个清单,这样我就可以加载多个资产。 假设您有一个名为UsersController的控制器,该控制器的视图使用了各种资产。 您需要的是,为了使您在问题中写入的行能够工作,是.jsapp/assets/javascript目录中提交了users.jsusers.js.coffee

或者,为了维护命名约定,我做这样的事情:

 <%= javascript_include_tag "application-#{params[:controller]}"%> 

然后当然命名我的文件( application-users.js )。

此外,当您执行此操作时,您将需要停止为所有控制器加载特定于页面的资源。 只需删除//= require_tree . 行并根据需要用显式//= require行替换它。

这是一种在rails中执行特定于页面的javascript的方法。

  1. 安装jquery-readyselector.js插件。 (这是18行)

    一个。 复制https://raw.github.com/Verba/jquery-readyselector/master/jquery.readyselector.js的内容

    湾 将内容粘贴到assets / javascripts / jquery_readyselector.js中的新文件

    C。 需要jquery-readyselector

     // assets/javascripts/application.js //= require jquery_readyselector //= require_tree . 
  2. 创建CSS类,以便我们可以单独引用每个页面。

     <%# views/layouts/application.html.erb %>  
  3. 现在我们可以使用CSS将我们的javascript扩展到我们的页面。

     // assets/javascripts/posts.js $(".posts.index").ready(function() { });