tipos para paginas lista hojas etiquetas estilos estilo enlazar ejemplos codigos css ruby-on-rails ruby-on-rails-3 asset-pipeline

para - Rieles: el activo de application.css no se encuentra en el modo de producción



lista de codigos css (4)

Estoy actualizando una aplicación para usar el flujo de activos.

Tengo la compilación de activos css en un archivo css de la aplicación, pero no se encuentran cuando ejecuto la aplicación en modo de producción con

RAILS_ENV=production bundle exec rails s

y visito cualquier página, obtengo el resultado correcto de la base de datos, pero no hay estilo y el registro muestra:

ActionController::RoutingError (No route matches [GET] "/assets/default.scss-1a27c...f07c.css"):

A pesar de que ese archivo existe en público / activos

$ ls public/assets/def* public/assets/default.scss-1a27c...f07c.css public/assets/default.scss.css public/assets/default.scss-1a27c...f07c.css.gz public/assets/default.scss.css.gz

¿Qué necesito cambiar para que el servidor encuentre el archivo de activos?

Lo mismo está sucediendo con mis otros archivos .css. Se compilan en público / activos con huellas digitales pero luego no se encuentran.

La fuente de la página se muestra:

<link href="/assets/default.scss-1a27c...f07c.css" media="screen" rel="stylesheet" type="text/css" />

La fuente de los rieles (haml) es = stylesheet_link_tag ''default.scss.css''

public.assets incluye public.assets los siguientes archivos.

$ ls public/assets/def* public/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css public/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css.gz public/assets/default.scss.css public/assets/default.scss.css.gz

application.rb tiene

$ cat config/application.rb require File.expand_path(''../boot'', __FILE__) # Pick the frameworks you want: require "active_record/railtie" require "action_controller/railtie" require "action_mailer/railtie" require "active_resource/railtie" require "sprockets/railtie" # require "rails/test_unit/railtie" if defined?(Bundler) # If you precompile assets before deploying to production, use this line Bundler.require(*Rails.groups(:assets => %w(development test))) # If you want your assets lazily compiled in production, use this line # Bundler.require(:default, :assets, Rails.env) end module Linker class Application < Rails::Application config.encoding = "utf-8" config.filter_parameters += [:password] config.assets.enabled = true config.assets.initialize_on_precompile = false # For Heroku config.assets.version = ''1.0'' end end

config/environments/production tiene:

$ cat config/environments/production.rb Linker::Application.configure do config.consider_all_requests_local = false config.action_controller.perform_caching = true config.assets.precompile += [''default.scss.css'',''main.css'', ''jquery-ui-1.8.22.custom.css''] config.serve_static_assets = false config.assets.compress = true config.assets.compile = false config.assets.digest = true config.log_level = :debug config.i18n.fallbacks = true config.active_support.deprecation = :notify end

Esto parece estar sucediendo para todos los activos, por ejemplo,

Started GET "/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500 ActionController::RoutingError (No route matches [GET] "/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css"): Started GET "/assets/main-6864687b4114a1c316e444bd90f233ff.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500 ActionController::RoutingError (No route matches [GET] "/assets/main-6864687b4114a1c316e444bd90f233ff.css"): Started GET "/assets/jquery-ui-1.8.22.custom-24319b4b1218846a3fe22a0479ae98b4.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500 ActionController::RoutingError (No route matches [GET] "/assets/jquery-ui-1.8.22.custom-24319b4b1218846a3fe22a0479ae98b4.css"): Started GET "/assets/application-fc1d492d730f2a45581a40eac4607db8.js" for 127.0.0.1 at 2014-02-23 10:24:47 -0500 ActionController::RoutingError (No route matches [GET] "/assets/application-fc1d492d730f2a45581a40eac4607db8.js"): Started GET "/images/link.ico" for 127.0.0.1 at 2014-02-23 10:24:48 -0500 ActionController::RoutingError (No route matches [GET] "/images/link.ico"):


Cuando realiza un rake assets:precompile , sus activos entran en el directorio público. Vea si puede encontrar esos archivos en public/assets/

Debería ver algo como esto:

I, [2014-02-23T20:06:21.853314 #26915] INFO -- : Writing app_root/public/assets/application-ecd8636fc80ea2b712039c4abc365da9.css


En Rails 4, puede hacer que se muestren en producción (ejecutándose localmente) al pasar una variable de entorno:

RAILS_SERVE_STATIC_FILES=true rails server -e production

Esto debería funcionar siempre que tenga esta línea en /config/environments/production.rb :

config.serve_static_files = ENV [''RAILS_SERVE_STATIC_FILES'']. present?


La solución Rails 5 es similar a la share dada por Jules Copeland arriba.

En su archivo config/environments/production.rb pre-generado, debería haber una entrada que se parece a esto:

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

Encontré una explicación decente para esta configuración en la guía de configuración de aplicaciones de Rails en http://guides.rubyonrails.org :

config.public_file_server.enabled configura Rails para servir archivos estáticos desde el directorio público. El valor predeterminado de esta opción es verdadero, pero en el entorno de producción está configurado en falso porque el software del servidor (por ejemplo, NGINX o Apache) utilizado para ejecutar la aplicación debería servir archivos estáticos. Si está ejecutando o probando su aplicación en modo de producción usando WEBrick (no se recomienda usar WEBrick en producción), establezca la opción en verdadero. De lo contrario, no podrá utilizar el almacenamiento en caché de páginas y solicitar archivos que existan en el directorio público.

Conclusión : en producción, iniciar el servidor de Rails con RAILS_SERVE_STATIC_FILES=1 permitirá a Rails servir cualquier archivo en el directorio público / de activos tal como lo haría un servidor web. Tenga en cuenta que Rails es un servidor de aplicaciones y no lo hará tan eficientemente como un servidor web (por ejemplo, NGINX, Apache, etc.). Para las aplicaciones del mundo real, debe tener un servidor web dedicado frente a Rails que servirá los activos estáticos por sí mismo y solo molestará a Rails por el contenido dinámico según sea necesario. Para obtener más detalles, consulte este artículo de Justin Weiss sobre las diferencias entre los servidores web y los servidores de aplicaciones.


Los rieles por defecto no sirven a los activos public . Vea su production.rb :

config.serve_static_assets = true

Cambia eso a verdadero y ya estás listo. (Nota: no desea que eso sea true en la producción, ¡recuerde volver a cambiarlo antes de implementarlo!)

Consulte Configuración de aplicaciones de Rails para más detalles.