2011-11-08 14 views
6

tengo una pequeña aplicación Sinatra incluyendo este módulo:Sinatra aplicación con ruedas dentadas que no trabaja en 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 

y con el siguiente recorrido definido:

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

Todo funciona simplemente genial, los activos se cargan y se se muestra correctamente en mi máquina local usando pow. Pero en Heroku no se carga ningún activo, el servidor simplemente devuelve 404 para cada archivo de activos.

+0

Ha intentado: https://github.com/jeffrydegrande/sprockets_on_heroku, hay una [pregunta para raíles] similar (http://stackoverflow.com/questions/2530584/how- to-use-sprockets-rails-plugin-on-heroku) – topek

+0

¿Estás seguro de que esto tiene algo que ver con los piñones? un 404 indica que falta un recurso. ¿Pusiste tu ruta en algún lugar que podría no ser reconocido por heroku? ¿Está configurado correctamente tu archivo config.ru? – phoet

+0

donde obtuviste este '"/assets/# {Environment.instance.find_asset (source) .digest_path} "' ??, ¿qué versión de Sprokets? – Synxmax

Respuesta

4

¡Simplificado el módulo y ahora funciona! Extraño ...

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 pregunta ... ¿cómo puedo utilizar esto en sinatra ... dónde poner este código/cómo puedo agregar los javascripts/css/images a assets.js y assets.css .. – coool

Cuestiones relacionadas