为什么rails会加载所有控制器中的所有javascript文件?

时间:2016-01-24 09:30:44

标签: jquery ruby-on-rails

我正在构建一个小型rails应用程序,我想使用jquery而不是coffeescript,所以我已经将所有生成的javascript文件重命名为.js。

现在,我在这些js文件中添加的javascript似乎可供所有我的控制器访问。例如,在我的document.ready中添加employees.js中的内容,这会在我的所有视图中触发,而不仅仅是针对Employee-controller?

为什么这样,并且无论如何要配置它?

4 个答案:

答案 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上的边缘指南以获取更多选项。