7

Recientemente actualicé mis Rails a 3.1.Imagen que muestra como en blanco en Rails 3.1 en Producción (Heroku)

Aquí hay una parte en la que añadí:

<%= asset_path('logo_symbol.png') %> 

Esto hace /assets/logo_symbol.png que funciona perfectamente bien en el entorno de desarrollo. Sin embargo, cuando presiono el código para la producción en heroku, muestra una imagen rota, con la url: assets/logo_symbol-135ddc8db2c9b59f032bed7db520137a.png. Supongo que el nuevo nombre es por la razón de alguna optimización.

Sin embargo, es interesante observar que cuando voy a la url assets/logo_symbol-135ddc8db2c9b59f032bed7db520137a.png en producción, veo una página en blanco, pero cuando cambio esa url a algo aleatorio, como agregarle números, muestra una página no encontrada. Entonces claramente está encontrando algo en esa url. También muestra una página en blanco cuando voy al /assets/logo_symbol.png directamente en production/heroku.

Si esto es de alguna ayuda, heroku no precompila con éxito cuando presiono el código y la documentación de heroku dice que actualmente no hay ninguna solución para ese problema.

Cualquier ayuda en esto será muy apreciada.

Supongo que tiene algo que ver con algunas configuraciones relacionadas con los entornos. Te adjunto contenido de mi application.rb, development.rb y archivos production.rb

aquí son el contenido de mi archivo production.rb

# Settings specified here will take precedence over those in config/application.rb 

    # In the development environment your application's code is reloaded on 
    # every request. This slows down response time but is perfect for development 
    # since you don't have to restart the webserver when you make code changes. 
    config.cache_classes = false 

    # Log error messages when you accidentally call methods on nil. 
    config.whiny_nils = true 

    # Show full error reports and disable caching 
    config.consider_all_requests_local  = true 
    config.action_controller.perform_caching = false 

    # Don't care if the mailer can't send 

    #config.action_mailer.default_url_options = { :host => 'localhost:3000' } 
    #config.action_mailer.default_url_options = { :host => 'localhost:3000' } 
    config.action_mailer.delivery_method = :smtp 

    # Print deprecation notices to the Rails logger 
    config.active_support.deprecation = :log 

    # Only use best-standards-support built into browsers 
    config.action_dispatch.best_standards_support = :builtin 

    # Do not compress assets 
    config.assets.compress = false 

    # Expands the lines which load the assets 
    config.assets.debug = true 
end 

module ActiveAdmin 
    class Reloader 
    def attach! 
    end 
    end 
end 

y aquí están los contenidos de mi archivo development.rb

# Settings specified here will take precedence over those in config/application.rb 

    # In the development environment your application's code is reloaded on 
    # every request. This slows down response time but is perfect for development 
    # since you don't have to restart the webserver when you make code changes. 
    config.cache_classes = false 

    # Log error messages when you accidentally call methods on nil. 
    config.whiny_nils = true 

    # Show full error reports and disable caching 
    config.consider_all_requests_local  = true 
    config.action_controller.perform_caching = false 

    # Don't care if the mailer can't send 

    #config.action_mailer.default_url_options = { :host => 'localhost:3000' } 
    #config.action_mailer.default_url_options = { :host => 'localhost:3000' } 
    config.action_mailer.delivery_method = :smtp 

    # Print deprecation notices to the Rails logger 
    config.active_support.deprecation = :log 

    # Only use best-standards-support built into browsers 
    config.action_dispatch.best_standards_support = :builtin 

    # Do not compress assets 
    config.assets.compress = false 

    # Expands the lines which load the assets 
    config.assets.debug = true 
end 

module ActiveAdmin 
    class Reloader 
    def attach! 
    end 
    end 
end 

Éstos son el contenido de mi archivo production.rb

# Settings specified here will take precedence over those in config/application.rb 

    # The production environment is meant for finished, "live" apps. 
    # Code is not reloaded between requests 
    config.cache_classes = true 

    # Full error reports are disabled and caching is turned on 
    config.consider_all_requests_local  = false 
    config.action_controller.perform_caching = true 

    # Specifies the header that your server uses for sending files 
    config.action_dispatch.x_sendfile_header = "X-Sendfile" 

    # For nginx: 
    # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' 

    # If you have no front-end server that supports something like X-Sendfile, 
    # just comment this out and Rails will serve the files 

    # See everything in the log (default is :info) 
    # config.log_level = :debug 

    # Use a different logger for distributed setups 
    # config.logger = SyslogLogger.new 

    # Use a different cache store in production 
    # config.cache_store = :mem_cache_store 

    # Disable Rails's static asset server 
    # In production, Apache or nginx will already do this 
    config.serve_static_assets = false 

    # Enable serving of images, stylesheets, and javascripts from an asset server 
    # config.action_controller.asset_host = "http://assets.example.com" 

    # Disable delivery errors, bad email addresses will be ignored 
    # config.action_mailer.raise_delivery_errors = false 

    #config.action_mailer.default_url_options = { :host => 'ha1.heroku.com' } 
    config.action_mailer.delivery_method = :smtp 

    # Enable threaded mode 
    # config.threadsafe! 

    # Enable locale fallbacks for I18n (makes lookups for any locale fall back to 
    # the I18n.default_locale when a translation can not be found) 
    config.i18n.fallbacks = true 

    # Send deprecation notices to registered listeners 
    config.active_support.deprecation = :notify 

    # Compress JavaScripts and CSS 
    #config.assets.compress = true 

    # Don't fallback to assets pipeline if a precompiled asset is missed 
    config.assets.compile = false 

    # Generate digests for assets URLs 
    config.assets.digest = true 

    # Defaults to Rails.root.join("public/assets") 
    # config.assets.manifest = YOUR_PATH 

    config.assets.js_compressor = :uglifier 
    config.assets.css_compressor = :scss 

He comparado mis archivos de configuración con la documentación de los rieles para 3.1 y parece que tengo todos los valores predeterminados necesarios. Sin embargo, todavía no veo ninguna imagen. Cualquier ayuda será apreciada mucho

Respuesta

13

Eliminar esta línea de production.rb:

 
config.action_dispatch.x_sendfile_header = "X-Sendfile" 

También debe alinear los ajustes en los archivos de configuración con los de section 9 of the pipeline guides.

Los encabezados Sendfile contienen información para el servidor web ascendente de dónde encontrar el archivo (en el sistema de archivos) para servirlo. Esto elimina la carga del backend (Rails/Sprockets). Cuando sendfile está activado, la respuesta HTTP no contiene ningún cuerpo (es de longitud cero) y por eso no se ve nada.

En heroku los servidores nginx no tienen acceso al sistema de archivos de la aplicación, por lo que esto no funcionará.

Ver this note en el sitio dev de Heroku re sendfile.

Si está utilizando heroku, this document describe las mejores opciones para utilizar la canalización de manera efectiva.

+0

Quité esa línea y también me aseguré de que las líneas mencionadas en la página vinculada estuvieran presentes en mis archivos. Todavía tengo el mismo problema en el sitio en vivo heroku donde no muestra la imagen. ¿Alguna idea de por qué? – alik

+1

hmm en realidad, rayar eso, simplemente funcionó. Creo que fue la caché anterior – alik

+0

Tienes razón, mi problema fue el almacenamiento en caché. Después de borrar mi caché del navegador, funcionó bien. – Ryan

0

Tienes que hacer dos cosas para resolverlo. Primero, cambie estas dos líneas de falso a verdadero en el archivo production.rb.

 config.assets.compile = true 
     config.assets.digest = true 

segundo lugar, si usted tiene una sintaxis como esta para sus imágenes

background: url("imgo.jpg") 

cambiarlo a

 background: image-url("image.jpg") 

espero que hace su trabajo.

Cuestiones relacionadas