2011-11-08 10 views
6

Ho una piccola applicazione Sinatra tra cui questo modulo:Sinatra app con pignoni non funzionante su Heroku

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 

e con seguente itinerario definito:

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

Tutto funziona solo grande, le attività vengono caricati e visualizzato correttamente sul mio computer locale utilizzando pow. Ma su Heroku non viene caricato nessun singolo asset, il server restituisce solo 404 per ogni file di asset.

+0

Hai provato: https://github.com/jeffrydegrande/sprockets_on_heroku, c'è una simile [domanda per le rotaie] (http://stackoverflow.com/questions/2530584/how- to-use-sprockets-rails-plugin-on-heroku) – topek

+0

sei sicuro che questo abbia qualcosa a che fare con le ruote dentate? un 404 indica una risorsa mancante. hai messo il tuo percorso da qualche parte potrebbe non essere riconosciuto da heroku? il tuo file config.ru è configurato correttamente? – phoet

+0

dove hai ottenuto questo '"/assets/# {Environment.instance.find_asset (source) .digest_path} "' ??, quale versione di Sprokets ?? – Synxmax

risposta

4

Semplificato il modulo e ora funziona! Strano ...

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 
+0

newby question ... come faccio a usare questo in sinatra .. dove mettere questo codice/come faccio ad aggiungere i javascript/css/images a assets.js e assets.css .. – coool

Problemi correlati