Rails加载所有JS文件,而不仅仅是控制器特定的文件

时间:2016-08-19 17:46:35

标签: javascript ruby-on-rails asset-pipeline

我的应用程序有很多控制器,Rails为每个控制器创建一个css和一个js(coffee)文件。

根据我的理解,Rails仅加载特定于控制器的JS文件(http://guides.rubyonrails.org/v3.2.8/asset_pipeline.html#how-to-use-the-asset-pipeline)。

我有一个反馈控制器,在视图中我使用javascript_include_tag加载和外部JS库。在feedback.js中我使用这个库。工作很棒。

但是现在如果我导航到另一个控制器,我得到一个JS错误,说找不到feedback.js中使用的函数。

如果我不在反馈控制器中,为什么Rails会尝试加载我的feedback.js?

1 个答案:

答案 0 :(得分:1)

Rails资产管道不会为每个控制器加载控制器特定的JS文件。它在每个页面上加载application.js中所需的所有JS文件。按照惯例,它会在您创建新资源时创建一个以资源命名的JS文件,以帮助您组织与每个控制器视图相关的JS代码。但同样,默认情况下,每个使用application.js的页面都会加载JS代码。

您可以创建特定于控制器的JS文件,但您必须在application.rb的预编译部分中定义它们,并确保它们不包含在application.js中。

示例:

application.rb中:

module YourApp
  class Application < Rails::Application
    # ...
      config.assets.precompile += %w(feedback.js)
    end
  end
end

然后在您的application.js中删除//= require feedback,默认情况下会feedback.js加载feedback.js。最后,您必须使用javascript_include_tag手动将$xml->n->n[0]包含在需要它的视图中,就像您使用额外的库一样。