Приложение Синатра со звездочками не работает на Heroku - PullRequest
6 голосов
/ 08 ноября 2011

У меня есть небольшое приложение 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 для каждого файла актива.

1 Ответ

4 голосов
/ 22 ноября 2011

Упрощен модуль и теперь он работает! Weird ...

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
...