【问题标题】:Rails loads all JS files and not only controller specific onesRails 加载所有 JS 文件,而不仅仅是特定于控制器的文件
【发布时间】:2016-08-19 17:46:35
【问题描述】:

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

据我了解,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?

【问题讨论】:

  • 您使用的是什么版本的 Rails?您已经链接了 Rails 指南的半古老版本。尽管如此,您的版本包括以下内容:“从 3.1 版开始,Rails 默认将所有 JavaScript 文件连接到一个 master.js 文件中,并将所有 CSS 文件连接到一个主 .css 文件中。”如果您真的想要为每个控制器提供单独的 JS 资产,请参阅 related question

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


【解决方案1】:

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

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

例子:

应用程序.rb:

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

然后在您的application.js 中,您应该删除//= require feedback,这将使feedback.js 默认无法加载。最后,您必须使用 javascript_include_tag 手动将 feedback.js 包含在需要它的视图中,就像您使用额外的库一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多