我喜欢albandiguer's solution。我发现 javascript/coffeescript 资产不是单独预编译的。这会导致尝试使用javascript_path 时出现各种错误。在我解决了一些人在他的 cmets 中提到的问题后,我将分享我对该问题的解决方案。主要只处理部分控制器名为 JavaScript 文件的集合。
所以我构建了一个应用程序助手来检测文件是否存在于 javascript 目录中,而不管扩展名为 .coffee/.js:
module ApplicationHelper
def javascript_asset_path(basename)
Sprockets::Rails::Helper.assets.paths.select{|i|
i =~ /javascript/ and i =~ /#{Rails.root}/
}.each do |directory|
if Dir.entries(directory).map {|i| i.split('.')[0]}.compact.
include? basename
return File.join(directory, basename)
end
end
nil
end
end
此方法将返回 javascript 文件的完整路径(如果存在)。否则返回零。因此,按照 Pencilcheck 的评论,您可以将此方法添加为条件包括:
<%= javascript_include_tag(controller_name) if javascript_asset_path(controller_name) %>
现在你有了一个合适的条件包含。现在讨论预编译资产的问题。通常用于单独优化you don't want assets precompiled。但是,如果您必须这样做,您可以这样做:
# Live Compilation
config.assets.compile = true
你可以添加这个做你的环境配置文件。首先在您的开发环境文件中对其进行测试。这又是不可取的。 Rails 资产管道使用 Sprocket 优化一切:
Sprockets 加载指定的文件,必要时处理它们,
将它们连接成一个文件,然后压缩它们(如果
Rails.application.config.assets.compress 为真)。通过提供一个文件
而不是很多,页面的加载时间可以大大减少
因为浏览器发出的请求更少。压缩也减少
文件大小,使浏览器能够更快地下载它们。
请阅读文档以了解有关 Sprockets (Asset Pipeline) http://guides.rubyonrails.org/asset_pipeline.html 机制的更多详细信息
资产不是单独预编译的。例如当我尝试时:
<%= javascript_include_tag 'event' %>
我明白了:
Sprockets::Rails::Helper::AssetFilteredError: 资产被过滤掉并且
将不提供服务:将 Rails.application.config.assets.precompile +=
%w( event.js ) 添加到 config/initializers/assets.rb 并重新启动您的
服务器
因此您可以包含要单独预编译的资产。我们只需要在我们的资产初始化程序中添加名为 javascript 文件的相关控制器。好吧,我们可以通过编程来完成。
要获取控制器名称列表,我将使用ecoologic's example:
all_controllers = Dir[
Rails.root.join('app/controllers/*_controller.rb')
].map { |path|
path.match(/(\w+)_controller.rb/); $1
}.compact
现在要获取与控制器名称的基本名称匹配的所有 javascript 文件的名称,您可以使用以下命令:
javascripts_of_controllers = Sprockets::Rails::Helper.assets.paths.select{|a_path|
a_path =~ /javascript/ and a_path =~ /#{Rails.root}/
}.map {|a_path|
Dir.entries(a_path)
}.flatten.delete_if {|the_file|
!the_file['.js']
}.collect {|the_file|
the_file if all_controllers.any? {|a_controller| the_file[a_controller]}
}
那你可以试试:
# config/initializers/assets.rb
Rails.application.config.assets.precompile += javascripts_of_controllers
这将为您提供与您的控制器名称匹配的所有 javascript 文件的列表,不包括目录路径。请注意,如果您的控制器名称是复数,则 javascript 名称也应该是复数。另请注意,如果控制器是单数且 javascript 文件是复数,这仍将包含它,因为 the_file[a_controller] 将在部分匹配时成功。
随时在您的Rails.application.config.assets.precompile 设置中尝试一下。我知道这可以正确地为您提供文件列表。但我会让你去测试它。让我知道以这种方式预编译是否有任何细微差别,因为我很好奇。
有关资产如何预编译的详细说明,请参阅此博客:http://www.sitepoint.com/asset-precompile-works-part/