2

在 Ruby on Rails v4 中,我希望仅为特定控制器加载一个 js 文件(或一组 js 文件)。

执行此操作的标准方法是什么?

在 application.js 中有//= require tree .一行。我假设这需要删除,所以我并不总是加载每个文件。但是然后呢?使用 Mycontroller 时是否会始终加载名为 mycontroller.js 的文件?

4

2 回答 2

4

如果操作正确,资产管道会非常强大:

清单

的目的//= require tree .是创建一个“清单”文件,Rails 将使用该文件来呈现您调用的文件。如果您不“预编译”您的资产,这意味着每次您的浏览器加载您的应用程序时,它都会查找清单中包含的文件并加载它们

这意味着您可以定义清单中调用的内容和不调用的内容。我们更喜欢在清单中调用任何基于 gem 的资产,但也指定特定的文件夹,如下所示:

//
//= require jquery
//= require jquery_ujs
//= require jquery.ui.draggable
//= require_tree ./jquery
//= require_tree ./extra
//= require turbolinks

我们使用此设置来调用所有 JQuery 插件和任何额外的 JS,以及特定于 gem 的文件


预编译

如果您预编译资产,它基本上会构建不同的文件,这些文件在您加载浏览器时会一致加载。如果您使用 Heroku 或 CDN,您可能希望预编译您的资产,以减少延迟和依赖性


应用程序设计

要回答您的问题,您当然可以加载特定于控制器的 JS。我们这样做:

#app/views/layouts/application.html.erb
<%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag controller_name, media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag controller_name, "data-turbolinks-track" => true %>

然后,您可以使用 Phoet 描述的内容来确保您的 JS 文件被拆分:

#config/environments/production.rb
# Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
config.assets.precompile += %w(mycontroller.js)

那么对于 application.js,你只能调用你想要在整个应用程序中持久化的文件:

#app/assets/javascripts/application.js
//
//= require jquery
//= require jquery_ujs
//= require jquery.ui.draggable
//= require_tree ./jquery
//= require_tree ./extra
//= require turbolinks
于 2013-11-11T10:15:33.910 回答
1

它是这样工作的:

您定义应预编译的附加文件:

# Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
config.assets.precompile += %w(mycontroller.js)

然后在你的布局中你实现一些逻辑来包含这个文件:

= javascript_include_tag "#{controller_name}.js" if controller_name == 'mycontroller'
于 2013-11-11T09:59:44.217 回答