rails 3.1资产管道:忽略来自宝石的资产

问题描述:

我不太确定实际行为是什么,所以我的第一个问题是:
来自gem(在我的情况下是Spree)的资产(例如javascripts)总是被编译?我不使用Spree的JavaScript,因此不希望它们被编译。我不要求他们在我application.js或任何其他JavaScript文件,但rails 3.1资产管道:忽略来自宝石的资产

rake assets:precompile 

编译他们仍然。我只是不想让他们躺在我的public/assets文件夹中。

所以我想我的问题是,有没有办法禁用从宝石编译JavaScript的?

我想有一个聪明的方法来实现你的目标使用sprockets。也许一些require_directory而不是require_tree

但最直接的是从资产路径中删除这些资产。为了实现这一目标,在最后您application.rb文件添加此(不以初始化工作):

class Engine < Rails::Engine 
    initializer "remove assets directories from pipeline" do |app| 
    app.config.assets.paths = app.config.assets.paths - app.config.assets.paths.grep(/nice_regexp_here_to_match_the_dir_where_the_unwanted_files_live/) 
    end 
end 

刚试过一个黑客:把代码中的initializer但要求它在你application.rb结束:

require "config/initializers/your_file' 

我喜欢非常具体的代码是可见的这种方式。

+0

日Thnx了很多,我会尽力的! –

+0

在Rails 4.0.0中,它看起来像初始化器被忽略。尝试: class Engine mmell

它没有on Rails的4.X工作,一个可能的(肮脏)的解决方法是:

require 'sprockets/railtie' 

Bundler.require(:default, Rails.env) 

module Sprockets 
    module Paths 
    SKIP_GEMS = ["rails-assets-jquery", "rails-assets-bootstrap"] 

    def append_path_with_rails_assets(path) 
     append_path_without_rails_assets(path) unless SKIP_GEMS.any? { |gem| path.to_s.start_with?(Gem.loaded_specs[gem].full_gem_path) } 
    end 

    alias_method_chain :append_path, :rails_assets 
    end 
end 
+0

把这个放到config/initializers/duplicate_assets.rb中对我也很好。可以用rails runner测试“puts Rails.application.assets.find_asset('jquery.js').to_a.map(&:pathname)” – grosser