6

このモジュールを含む小さな Sinatra アプリがあります。

module Sprockets
  module Helpers
    def asset_path(source)
      "/assets/#{Environment.instance.find_asset(source).digest_path}"
    end

    def sprockets
      Environment.instance.call(env)
    end
  end

  class << self
    def precompile
      dir = 'public/assets'

      FileUtils.rm_rf(dir, secure: true)
      ::Sprockets::StaticCompiler.new(Environment.instance, 'public/assets', [/\.(png|jpg)$/, /^(application|ie)\.(css|js)$/]).compile
    end
  end

  class Environment < ::Sprockets::Environment
    include Singleton

    def initialize
      super
      %w[app lib vendor].each do |dir|
        %w[images javascripts stylesheets].each do |type|
          path = File.join(root, dir, 'assets', type)
          append_path(path) if File.exist?(path)
        end
      end

      js_compressor = Uglifier.new
      css_compressor = YUI::CssCompressor.new

      context_class.instance_eval do
        include Helpers
      end
    end
  end
end

次のルートが定義されています。

get('/assets/*') do
  sprockets # Defined in the module above
end

すべてがうまく機能し、アセットが読み込まれ、ローカル マシンに適切に表示されますpow。しかし、Heroku では単一のアセットが読み込まれることはなく、サーバーはすべてのアセット ファイルに対して 404 を返すだけです。

4

1 に答える 1

4

モジュールを簡素化して、動作するようになりました! 変...

class Assets < Sprockets::Environment
  class << self
    def instance(root = nil)
      @instance ||= new(root)
    end
  end

  def initialize(root)
    super

    %w[app lib vendor].each do |dir|
      %w[images javascripts stylesheets].each do |type|
        path = File.join(root, dir, 'assets', type)
        self.append_path(path) if File.exist?(path)
      end
    end

    self.css_compressor = YUI::CssCompressor.new
    self.js_compressor = Uglifier.new

    context_class.instance_eval do
      include Helpers
    end
  end

  def precompile
    dir = 'public/assets'

    FileUtils.rm_rf(dir, secure: true)
    Sprockets::StaticCompiler.new(self, 'public/assets', ['*']).compile
  end

  module Helpers
    def asset_path(source)
      "/assets/#{Assets.instance.find_asset(source).digest_path}"
    end
  end
end
于 2011-11-22T10:02:16.067 に答える