La aplicación Rails no sirve a los activos en el entorno de producción

Mi aplicación funciona bien cuando se ejecuta en un entorno de desarrollo. En producción ( rails server -e production ), el navegador no puede acceder a los archivos css y js y en la consola hay mensajes como:

 I, [2013-07-27T21:00:59.105459 #11449] INFO -- : Started GET "/javascripts/application.js" for 99.102.22.124 at 2013-07-27 21:00:59 +0000 F, [2013-07-27T21:00:59.108302 #11449] FATAL -- : ActionController::RoutingError (No route matches [GET] "/javascripts/application.js"): 

La sección de cabecera de la fuente html en el entorno de producción:

  a Social Server       

En desarrollo env por otro lado, la sección de la cabeza se ve así:

  a Social Server                                                                                  

La aplicación no usa una base de datos, por lo que he desactivado ActiveRecord. Fragmentos de los archivos de configuración:

application.rb

 require File.expand_path('../boot', __FILE__) #require 'rails/all' require "action_controller/railtie" require "action_mailer/railtie" require "rails/test_unit/railtie" require "sprockets/railtie" Bundler.require(:default, Rails.env) module Socialserver class Application < Rails::Application end end 

production.rb

 Socialserver::Application.configure do config.cache_classes = true config.eager_load = true config.consider_all_requests_local = false config.action_controller.perform_caching = true config.serve_static_assets = false config.assets.js_compressor = :uglifier config.assets.compile = false config.assets.digest = true config.assets.version = '1.0' config.log_level = :info config.i18n.fallbacks = true config.active_support.deprecation = :notify config.log_formatter = ::Logger::Formatter.new config.assets.paths << Rails.root.join('app', 'assets', 'fonts') config.assets.precompile += %w( .svg .eot .woff .ttf ) end 

development.rb:

 Socialserver::Application.configure do config.cache_classes = false config.eager_load = false config.consider_all_requests_local = true config.action_controller.perform_caching = false config.action_mailer.raise_delivery_errors = false config.active_support.deprecation = :log config.assets.debug = true end 

Gemfile:

 source 'https://rubygems.org' gem 'rails', '4.0.0' gem 'sass-rails', '~> 4.0.0' gem 'uglifier', '>= 1.3.0' gem 'coffee-rails', '~> 4.0.0' gem 'jquery-rails' gem 'jquery-ui-rails' gem 'turbolinks' gem 'jbuilder', '~> 1.2' group :doc do gem 'sdoc', require: false end group :twitter do gem 'twitter', '4.8.1' end group :instagram do gem 'instagram', '0.10.0' end group :tumblr do gem 'tumblr_client' end gem 'twitter-bootstrap-rails' gem 'therubyracer' #needed for runtime js on amazon ec2. 

Me disculpo por publicar tanta información. Sentí que la información podría ser relevante.

ps. Solo tengo medio conocimiento de los Rails, así que tengan paciencia conmigo. Gracias ~

Al probar localmente su entorno de producción, debe comstackr los activos localmente. Simplemente ejecute el siguiente comando:

 RAILS_ENV=production bundle exec rake assets:precompile 

Generará todos los activos en public/assets .

Luego, debe decirle a Rails que preste servicios a los activos. El software del servidor (por ejemplo, Nginx o Apache) lo hace por usted en entornos como Heroku, pero localmente debe dejar que Rails lo haga. Cambie esto en su production.rb :

 config.serve_static_assets = true 

¡Pero asegúrate de volver a establecerlo en false antes de empujar tu código a producción!

Esto suena como el problema que estaba teniendo .

Encontré un blog que sugiere que esto es un error en la cartera de activos de Rails 4.0.0, y se mitiga inexplicablemente al establecer …

 config.assets.compile = true 

… en config/environments/production.rb

Además de activar de algún modo el flujo de activos para que realmente funcione, esa configuración activará la comstackción en vivo de los activos. Eso normalmente es malo para el rendimiento en la producción, pero si todavía precomstack los activos manualmente cuando implementa, con

 rake assets:precompile 

… la comstackción en vivo nunca debería ocurrir (porque los activos necesarios ya han sido precomstackdos).

Espero que esto ayude 🙂

Como se indicó anteriormente config.serve_static_assets está en desuso y reemplazado por config.serve_static_files . Si uno examina config/environments/production.rb para Rails-4.2 entonces uno encuentra esto:

  # Disable serving static files from the `/public` folder by default since # Apache or NGINX already handles this. config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present? 

La implicación es que establecer y exportar (en BASH) la variable de entorno export RAILS_SERVE_STATIC_FILES="to any value whatsoever" en una sesión anterior a la ejecución de rails s -e production el resultado deseado cuando se prueba localmente y también evitará tener que recordar recode production.rb antes de enviar al host de producción.

En production.rb cambie la configuración:

carriles 3.x

 config.serve_static_assets = true 

Rails 4.x

 config.serve_static_files = true 

Busque un archivo como este:

 public/assets/.sprockets-manifest-3f7771d777ceb581d754e4fad88aa69c.json 

Si está enviando activos precomstackdos a un servidor de producción, existe la posibilidad de que esté impidiendo que se oculten archivos ‘dot’ ocultos, y este archivo esencial no lo hará en producción.

En mi entorno, necesito precomstackr los activos en un entorno de integración y llevarlos a producción para que no haya necesidad de comstackr los activos en la máquina de producción. Estaba bloqueando erróneamente que todos los archivos ocultos se envíen a la máquina de producción.

Para ver si esta respuesta le funciona, verifique su fuente HTML generada en un navegador del servidor de producción para ver si se ha generado la ruta de los activos. Si ve la etiqueta de su script de esta manera:

  

verifique el atributo src. Debería comenzar con /assets/javascript . En este caso, comienza con /javascript que indica que Rails no cree que ninguno de los activos haya sido precomstackdo.

Corregí esto actualizando mi inserción a la producción (actualmente rsync), asegurándome de presionar el .sprockets-manifest* después de precomstackr en mi servidor de integración.

Además, utilizo Passenger independiente como mi servidor de prueba de integración, en lugar de Webrick, ya que maneja una porción más realista de archivos estáticos.

Creo que para Rails 4.x tienes que precomstackr los activos para producción o usar config.assets.compile incluso ambos si es necesario.

El comportamiento predeterminado de Rails para el entorno de producción es “No recurrir a la canalización de activos si se pierde un activo precomstackdo”. Entonces, no lo hagas Úselo para no compi

 config.assets.compile = false 

Si usa esta opción, no necesita usar:

 config.serve_static_files = true 

Porque si el activo no fue precomstackdo, Rails comstackrá antes de la solicitud de servicio.

Pero si precomstack los activos antes de la producción, no necesita config.assets.compile = true , pero necesita config.serve_static_files = true para las solicitudes de servicio de Rails si no tiene http_server para servir los recursos precomstackdos.

La configuración config.serve_static_assets está en desuso.

 DEPRECATION WARNING: The configuration option `config.serve_static_assets` has been renamed to `config.serve_static_files` to clarify its role (it merely enables serving everything in the `public` folder and is unrelated to the asset pipeline). The `serve_static_assets` alias will be removed in Rails 5.0. Please migrate your configuration files accordingly. 

Espero que esta respuesta te ayude (lector) a entender lo que realmente sucede

El siguiente comando funciona para mí localmente.

 rails server -e production 

Obtuve el mismo error “ActionController :: RoutingError (Ninguna ruta coincide con [GET]” /assets/application.css “” mientras ejecutaba “rails s”. Incluso después de haber precomstackdo la fuente, cambie config precompile true. Todavía no se pudo cargar correctamente.

La opción “-e production” hizo desaparecer esos RoutingError.