您不应该在资产管道之外加载JS或CSS文件,因为您会失去使Rails如此出色的重要功能。而且您不需要其他宝石。我相信使用尽可能少的宝石,这里没有必要使用宝石。
您想要的就是所谓的“控制器特定的Javascript”(“操作特定的Javascript包含在底部”)。这使您可以为特定的CONTROLLER加载特定的JavaScript文件。尝试将Javascript连接到View是一种。向后,并且不遵循MVC设计模式,您希望将其与Controller或Controller内部的动作相关联。
不幸的是,无论出于何种原因,Rails开发人员都决定默认情况下,每个页面都将加载资产目录中的每个JS文件。为什么他们决定这样做而不是默认情况下启用“特定于控制器的Javascript”,我永远不会知道。这是通过application.js文件完成的,该文件默认包含以下代码行:
//= require_tree .
这称为指令。这就是链轮用来加载asset / javascripts目录中的每个JS文件的方式。默认情况下,链轮会自动加载application.js和application.css,而require_tree指令将加载其各自目录中的每个JS和Coffee文件。
注意:当使用脚手架时(如果您不是脚手架,现在是开始的好时机),Rails会自动为您生成该脚手架控制器的咖啡文件。如果您希望它生成标准的JS文件而不是咖啡文件,请删除Gemfile中默认启用的咖啡宝石,然后脚手架将创建JS文件。
好的,启用“特定于控制器的Javascript”的第一步是从application.js文件中删除require_tree代码,或者如果仍然需要全局JS文件,则将其更改为asset / javascripts目录中的文件夹。IE浏览器:
//= require_tree ./global
步骤2:进入config / initializers / assets.rb文件,并添加以下内容:
%w( controllerone controllertwo controllerthree ).each do |controller|
Rails.application.config.assets.precompile += ["#{controller}.js", "#{controller}.css"]
end
插入所需的控制器名称。
第3步:用此替换您的application.html.erb文件中的javascript_include_tag(注意params [:controller]部分:
<%= javascript_include_tag 'application', params[:controller], 'data-turbolinks-track': 'reload' %>
重新启动服务器和中提琴!用脚手架生成的JS文件现在仅在调用该控制器时加载。
是否需要在控制器 IE / articles / new中的特定ACTION上加载特定的JS文件?而是这样做:
application.html.erb:
<%= javascript_include_tag "#{controller_name}/#{action_name}" if AppName::Application.assets.find_asset("#{controller_name}/#{action_name}") %>
config / initializers / assets.rb:
config.assets.precompile += %w(*/*)
然后在资产/ javascripts文件夹中添加一个与您的控制器同名的新文件夹,并将与您的动作同名的js文件放入其中。然后将其加载到该特定操作上。