我正在构建一个小型rails应用程序,我想使用jquery而不是coffeescript,所以我已经将所有生成的javascript文件重命名为.js。
现在,我在这些js文件中添加的javascript似乎可供所有我的控制器访问。例如,在我的document.ready
中添加employees.js
中的内容,这会在我的所有视图中触发,而不仅仅是针对Employee-controller?
为什么这样,并且无论如何要配置它?
答案 0 :(得分:3)
一个简单的解决方案是将controller
名称添加为布局的id
body
的{{1}}:
tag
在你的javascript中
##layouts/application.html.erb
<body id="<%= params[:controller] %>">
<%= yield %>
</body>
答案 1 :(得分:3)
我想使用jquery而不是coffeescript
JQuery !== Coffeescript
Jquery是一个框架,coffeescript is a preprocessor。他们完全不同。
你可以在Coffeescript中使用JQuery with inpunity:
#test.coffee
$(".element").on "click", ->
alert "test"
这些js文件似乎可以被我的所有控制器访问
归功于Sprockets Manifest Directives:
#app/assets/javascripts/application.js
//= require_tree .
//= require_self
以上是Rails应用的默认功能。
这意味着将所有你的JS / CSS资产放入一个application.css
/ application.js
文件中(单个文件=效率更高):
#app/views/layouts/application.html.erb
<%= javascript_include_tag :application %>
-
您想要的是排除此过程中的某些文件。
这样做非常简单:
#app/assets/javascripts/application.js
//= require_tree .
//= require_self
//= stub employees
#app/views/layouts/application.html.erb
<%= javascript_include_tag :application, (:employees if controller_name == "employees" ) %>
#config/initializers/assets.rb
Rails.application.config.assets.precompile += %w( employees.js employees.css )
您必须在资产管道中单独包含“已排除”文件(如上所述)。
答案 2 :(得分:2)
默认情况下,app/assets/javascripts
文件夹中的所有javascript文件都会被application.js
语句导入require_tree .
文件
//= require turbolinks
//= require_tree .
这意味着只要在主应用程序布局中引用application.js
,您的所有文件都将被执行并可用
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
要解决此问题,请删除//= require_tree .
语句,然后在要使用的视图的布局上分别要求每个javascript文件。
<%= javascript_include_tag 'employees', 'data-turbolinks-track' => true %>
你可能遇到的第二个罪魁祸首是turbolinks
。通过使用Rails资产管道缓存资产,Turbolinks可以更快地在您的Web应用程序中建立以下链接。替换有变化的区域。
不幸的是,这意味着默认情况下,一旦为页面加载了javascript文件,即使加载了另一个页面,它也会保持缓存(可用)。
即使Turbolinks有一些event hooks你可以用来进一步指导你的javascript文件什么时候被解雇,什么时候不要,但不幸的是,这些不允许我们指定我们想要脚本的确切页面被解雇了。
如果您非常关心这一事实,可以设置'data-turbolinks-track' => false
答案 3 :(得分:0)
您可以通过在app/views/layouts
中创建不同的布局来包含不同的资产集。
通过更改布局中的行<%= javascript_include_tag "main" %>
,您可以包含不同的javascript文件。所有js文件通常由Rails Asset Pipeline组合成一个名为application.js
的文件,但您也可以单独包含它们,并为每个控制器甚至操作使用不同的布局。
您可以将layout :name_of_layout
添加到控制器,以便为控制器中的所有操作设置默认布局。如果您希望每个操作具有不同的布局,则可以将其作为选项传递给渲染函数:render layout: :name_of_layout
。请查看Layouts and Rendering上的边缘指南以获取更多选项。