我正在阅读有关资产管道的rails指南文档。 它声明了coffeescript页面特定的生成文件 如果清单上有require_tree指令,则默认情况下准备用户。 这不适合我,我必须包括这个
<%= javascript_include_tag params[:controller] %>
在特定控制器上。 我错过了什么?
答案 0 :(得分:1)
资产管道会将您的所有JS压缩为单个文件application.js
。为了为特定页面调用JS,您需要通过控制器和操作来组织JS。有一个宝石,RailsScript自动执行此操作,它与Turbolinks兼容,可以为您提供单页应用程序的感觉。
RailsScript只需几分钟即可学习,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!')
答案 1 :(得分:0)
我认为你总体上误解了资产管道。它不会单独加载javascript文件,而是将所有.js.coffee文件编译成一个大的js文件,你必须在你的视图/布局中包含这样的文件
<%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>
如果你想要一些仅在一个视图中可用的js-code,你肯定不应该将它包含在资产管道中。
答案 2 :(得分:0)
不确定我是否误解了您的第一段,但我认为该行的含义是,如果您的application.js
清单包含以下行:
//= require_tree .
然后是的确,页面特定的javascript或coffeescript将被加载,不仅针对该特定页面,也针对所有页面。如果您想将资产限制为您所描述的某些页面,则需要一个位于app/assets/javascripts/
的文件,其中包含控制器的复数名称和.js
。
我个人会将此创建为该特定页面的另一个清单,这样我就可以加载多个资产。假设您有一个名为UsersController
的控制器,该控制器的视图使用了各种资产。您需要的是,为了使您在问题中写入的行能够正常运行,.js
users.js
users.js.coffee
或app/assets/javascript
目录中的<%= javascript_include_tag "application-#{params[:controller]}"%>
。
或者,为了维护命名约定,我做了类似的事情:
application-users.js
然后当然命名我的文件(//= require_tree .
)。
此外,当您执行此操作时,您将需要停止为所有控制器加载特定于页面的资源。只需删除//= require
行,然后根据需要将其替换为显式{{1}}行。
答案 3 :(得分:0)
这是一种在rails中执行特定于页面的javascript的方法。
安装jquery-readyselector.js插件。 (它的18行)
一个。复制https://raw.github.com/Verba/jquery-readyselector/master/jquery.readyselector.js
的内容湾将内容粘贴到assets / javascripts / jquery_readyselector.js
中的新文件℃。需要jquery-readyselector
// assets/javascripts/application.js
//= require jquery_readyselector
//= require_tree .
创建CSS类,以便我们可以单独引用每个页面。
<%# views/layouts/application.html.erb %>
<body class="<%= controller_name %> <%= action_name %>">
现在我们可以使用CSS将我们的javascript范围扩展到我们的页面。
// assets/javascripts/posts.js
$(".posts.index").ready(function() {
});