rails 3.1.0 ActionView :: Template :: Error (application.css no está precompilado)

281

Hice una aplicación de rieles básica con un controlador de páginas simple con una función de índice y cuando cargo la página obtengo:

ActionView::Template::Error (application.css isn't precompiled):
    2: <html>
    3: <head>
    4:   <title>Demo</title>
    5:   <%= stylesheet_link_tag    "application" %>
    6:   <%= javascript_include_tag "application" %>
    7:   <%= csrf_meta_tags %>
    8: </head>
  app/views/layouts/application.html.erb:5:in `_app_views_layouts_application_html_erb__43625033_88530400'

Gemfile

source 'http://rubygems.org'

gem 'rails', '3.1.0'

# Bundle edge Rails instead:
# gem 'rails',     :git => 'git://github.com/rails/rails.git'

gem 'sqlite3'

gem 'execjs'
gem 'therubyracer'

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails', "  ~> 3.1.0"
  gem 'coffee-rails', "~> 3.1.0"
  gem 'uglifier'
end

gem 'jquery-rails'

# Use unicorn as the web server
# gem 'unicorn'

# Deploy with Capistrano
# gem 'capistrano'

# To use debugger
# gem 'ruby-debug19', :require => 'ruby-debug'

group :test do
  # Pretty printed test output
  gem 'turn', :require => false
end
Chris Muench
fuente
77
paquete de activos de rake ejecutivo: la precompilación parece solucionarlo, pero ¿por qué no funciona?
Chris Muench
10
Tengo el mismo problema en la producción, incluso después de ejecutar activos de rake de paquete ejecutivo: precompilación
Lucas Renan

Respuestas:

313

De forma predeterminada, Rails supone que tiene sus archivos precompilados en el entorno de producción, si desea usar la compilación en vivo (compile sus activos durante el tiempo de ejecución) en producción, debe configurar config.assets.compile en verdadero .

# config/environments/production.rb
...
config.assets.compile = true
...

Puede usar esta opción para recurrir a Sprockets cuando está utilizando activos precompilados, pero faltan archivos precompilados.

Si la config.assets.compileopción está establecida en falso y faltan archivos precompilados, obtendrá un "AssetNoPrecompiledError" que indica el nombre del archivo que falta.

Chris Muench
fuente
3
Es posible que desee probar lo que dice este artículo: devcenter.heroku.com/articles/rails31_heroku_cedar (Todavía no lo he probado)
Chris Muench
77
Para que quede claro, la opción config.assets.compile está en config / entornos / production.rb (si está trabajando en producción). Y si desea poder compilar en vivo / diferido en producción, también debe habilitar la compilación diferida en application.rb.
avioing
34
La activación de la compilación en tiempo de ejecución no es la solución, debido al impacto en el rendimiento que tomamos. La solución es solucionar el problema central que impide que ocurra la precompilación de activos.
David Tuite
55
Precompilé los activos usando RAILS_ENV = activos del paquete de producción de activos de rake: precompilación. ¿Por qué recibo este error y necesito configurar este indicador también?
Tony
2
@ Tony, porque probablemente solicitaste algo más que el archivo application.css / js / image, y no lo registraste application.rb. Añadir / editar application.rb: config.assets.precompile += %w( first.css second.js ). Ahora estos archivos también se compilarán. No agregue todos los archivos si los usa solo en ruedas dentadas require, pero solo si los incluye con <link>/<script>
elado
202

Obtendrá un mejor rendimiento en producción si establece config.assets.compile en false en production.rb y precompila sus activos. Puede precompilar con esta tarea de rastrillo:

bundle exec rake assets:precompile

Si está utilizando Capistrano, la versión 2.8.0 tiene una receta para manejar esto en el momento de la implementación. Para obtener más información, consulte la sección "En producción" de la Guía de tubería de activos: http://guides.rubyonrails.org/asset_pipeline.html

richardsun
fuente
14
No puedo creer lo difícil que fue descubrir cómo hacer esto.
derekerdmann
3
Esta parece ser la opción claramente mejor: establecer la compilación en vivo en verdadero "usa más memoria, funciona peor que la predeterminada y no se recomienda". guides.rubyonrails.org/asset_pipeline.html#live-compilation
andrew.rockwell
rake -To bundle exec rake -Tes tu amigo
Ryan
2
@Underworld Bundler es una herramienta para administrar dependencias de gemas en una aplicación ruby ​​y está integrada en Rails 3. Si está utilizando bundler, la ejecución bundle exec rake ...garantizará que cargue el rastrillo correcto y las dependencias asociadas para su aplicación. Si no está utilizando bundler, simplemente correría rake ....
richardsun
3
Si va a ejecutar el comando anterior, asegúrese de que ya ha configurado su entorno en modo de producción, o prefija el comando con RAILS_ENV = production
JESii
31

OK, tuve el mismo problema. No quería usar "config.assets.compile = true". Tuve que agregar todos mis archivos .css a la lista en config / entornos / production.rb:

config.assets.precompile += %w( carts.css )

Luego tuve que crear (y luego eliminar) tmp / restart.txt

Siempre usé el ayudante stylesheet_link_tag, así que encontré todos los archivos CSS adicionales que necesitaba agregar con:

find . \( -type f -o -type l \) -exec grep stylesheet_link_tag {} /dev/null \;
Don Law
fuente
Si utiliza consultas de medios y diferentes archivos css para diferentes resoluciones, esta es la mejor manera de hacerlo.
Fa11enAngel
1
Tengo que incluir todos mis archivos CSS en la matriz? ¿Qué pasa si tengo 40 archivos css?
Yozzz
30

Una solución rápida para el usuario de capistrano es poner esta línea en Capfile

# Uncomment if you are using Rails' asset pipeline
load 'deploy/assets'
usuario673207
fuente
11

Para todos aquellos que están leyendo esto pero no tienen problemas application.csscon sus clases CSS personalizadas, por ejemplo admin.css, base.cssetc.

La solución es usar como se menciona

bundle exec rake assets:precompile

Y en referencias de hojas de estilo solo referencia application.css

<%= stylesheet_link_tag    "application", :media => "all" %>

Dado que la canalización de activos precompilará todas sus hojas de estilo en application.css. Esto también ocurre en el desarrollo, por lo que usar cualquier otra referencia es incorrecto cuando se usa la canalización de activos.

Haris Krajina
fuente
8

Estaba teniendo exactamente el mismo error en mi entorno de desarrollo. Al final, todo lo que tenía que hacer para solucionarlo era agregar:

config.assets.manifest = Rails.root.join("public/assets")

a mi archivo config / assets / development.rb y lo arregló. Mi configuración final en el desarrollo relacionada con los activos se ve así:

config.assets.compress = false  
config.assets.precompile += %w[bootstrap-alerts.js] #Lots of other space separated files
config.assets.compile = false
config.assets.digest = true
config.assets.manifest = Rails.root.join("public/assets")
config.assets.debug = true
darchitect
fuente
Esta fue la única solución que funcionó para mí. ¿Tal vez fue un problema con mi versión de Rails (3.1.3)? De todos modos, podría decir que mis activos se han precompilado con éxito a public / assets y sus nombres de archivo tenían los mismos SHA que se enumeran en manifest.yml. Por alguna razón, Rails ya no buscaba activos en el lugar correcto, a pesar de que mi configuración siempre había funcionado bien anteriormente. Este cambio solucionó eso.
antinome
Gracias por esta solución Estaba tratando de probar algunas cosas en modo de desarrollo y me sorprendió que dijera "application.css no está precompilado" a pesar de que ya había precompilado los activos y public / assets / application.css estaba presente en el directorio. Sorprendido, no configuran config.assets.manifest para usted automáticamente en el desarrollo como lo hacen en la producción ..
Tyler Rick
5

También tuve este problema, donde intentar ejecutar en producción sin precompilar aún arrojaría errores no precompilados. Tuve que cambiar qué línea se comentó application.rb:

  # 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)
mathdancer
fuente
2
Sólo quiero aclarar para cualquiera que venga a través de esta tarde, el código que necesita hacer cambios en las se encuentra enconfig/application.rb
GMA
4

Aquí está la solución rápida:

Si está utilizando capistrano, haga esto, agregue esto a su deploy.rb:

after 'deploy:update_code' do
  run "cd #{release_path}; RAILS_ENV=production rake assets:precompile"
end

despliegue de la tapa

fivetwentysix
fuente
2

Hoy me encontré con este mensaje de error y quería publicar la resolución en mi caso particular. Resulta que mi problema era que a uno de mis archivos CSS le faltaba una llave de cierre y esto causaba que el archivo no se compilara. Puede ser más difícil notar esto si tiene un proceso automatizado que configura todo (incluida la precompilación de activos) para su entorno de producción.

Instantánea
fuente
1

Después de todo lo demás falló ...

Mi solución fue cambiar el archivo de diseño de

= stylesheet_link_tag "reset-min", 'application'

a

= stylesheet_link_tag 'application'

¡Y funcionó! (Puede poner el archivo de reinicio dentro del manifiesto).

Victor Pudeyev
fuente
1

Solo otra forma de arreglar esto en Heroku: asegúrese de que su Rakefile esté comprometido y empujado.

phillbaker
fuente
0

En el servidor heroku (sistema de archivos de solo lectura), si desea la compilación en tiempo de ejecución de css (no se recomienda, pero puede hacerlo), asegúrese de haber realizado la configuración como se muestra a continuación:

# inside config/application.rb
config.assets.enabled = true
config.assets.prefix = Rails.root.join('tmp/assets').to_s

# If you are using sass then keep gem outside of asset group
 gem 'sass-rails',   '3.1.4'

# inside config/environments/production.rb
config.assets.compile = true
Sandip Ransing
fuente
0

si crees que seguiste todo bien pero aún desafortunado, solo asegúrate de ejecutar / capistrano touch tmp / restart.txt o equivalente al final. Estaba en la lista desafortunada pero ahora :)

Muntasim
fuente
0

Probablemente tenga un syntax errorcss en el que está utilizando.

Ejecute este comando

$ bundle exec rake assets:precompile RAILS_ENV=development --trace

Dará la excepción, arreglará eso y ya está todo listo.

Gracias

Shoaib Malik
fuente