rails 3.1.0 ActionView :: Template :: Error (application.css n'est pas précompilé)

281

J'ai fait une application de rails de base avec un simple contrôleur de pages avec une fonction d'index et quand je charge la page, j'obtiens:

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
la source
7
bundle exec rake assets: la précompilation semble y remédier, mais pourquoi ne fonctionne-t-elle pas simplement?
Chris Muench
10
J'ai le même problème dans la production, même après avoir exécuté les actifs de rake du bundle exécutable: précompilation
Lucas Renan

Réponses:

313

Par défaut, Rails suppose que vos fichiers sont précompilés dans l'environnement de production.Si vous souhaitez utiliser la compilation en direct (compilez vos ressources pendant l'exécution) en production, vous devez définir config.assets.compile sur true .

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

Vous pouvez utiliser cette option pour revenir à Sprockets lorsque vous utilisez des ressources précompilées mais qu'il manque des fichiers précompilés.

Si l' config.assets.compileoption est définie sur false et qu'il manque des fichiers précompilés, vous obtiendrez un "AssetNoPrecompiledError" indiquant le nom du fichier manquant.

Chris Muench
la source
3
Vous voudrez peut-être essayer ce que dit cet article: devcenter.heroku.com/articles/rails31_heroku_cedar (je ne l'ai pas encore essayé moi-même)
Chris Muench
7
Juste pour être clair, l'option config.assets.compile se trouve dans config / environnements / production.rb (si vous travaillez en production). Et si vous voulez pouvoir effectuer une compilation en direct / paresseux en production, vous devez également activer la compilation paresseuse dans application.rb.
avioing
34
L'activation de la compilation d'exécution n'est pas la solution, en raison de la perte de performances que nous prenons. La solution consiste à résoudre le problème principal qui empêche la précompilation des actifs de se produire.
David Tuite
5
J'ai précompilé les actifs à l'aide de RAILS_ENV = actifs de rake du bundle de production: précompiler. Pourquoi est-ce que j'obtiens cette erreur et je devais également définir ce drapeau?
Tony
2
@Tony, car vous demandez probablement autre chose que le fichier application.css / js / image, et vous ne l'avez pas enregistré sur application.rb. Ajouter / modifier application.rb: config.assets.precompile += %w( first.css second.js ). Maintenant, ces fichiers seront également compilés. N'ajoutez pas tous les fichiers si vous les utilisez uniquement dans les pignons require, mais uniquement si vous les incluez avec <link>/<script>
elado
202

Vous obtiendrez de meilleures performances en production si vous définissez config.assets.compile sur false dans production.rb et précompilez vos ressources. Vous pouvez précompiler avec cette tâche de râteau:

bundle exec rake assets:precompile

Si vous utilisez Capistrano, la version 2.8.0 a une recette pour gérer cela au moment du déploiement. Pour plus d'informations, consultez la section "En production" du Guide du pipeline d'actifs: http://guides.rubyonrails.org/asset_pipeline.html

richardsun
la source
14
Je ne peux pas croire à quel point il a été difficile de savoir comment faire cela.
derekerdmann
3
Cela semble être la meilleure option: définir la compilation en direct sur true "utilise plus de mémoire, fonctionne moins bien que la valeur par défaut et n'est pas recommandé". guides.rubyonrails.org/asset_pipeline.html#live-compilation
andrew.rockwell
rake -Tou bundle exec rake -Test votre ami.
Ryan
2
@Underworld Bundler est un outil de gestion des dépendances de gemmes dans une application ruby ​​et il est intégré à Rails 3. Si vous utilisez bundler, l'exécution bundle exec rake ...vous assurera de charger le râteau approprié et les dépendances associées pour votre application. Si vous n'utilisez pas bundler, vous devez simplement exécuter rake ....
richardsun
3
Si vous allez exécuter la commande ci-dessus, assurez-vous que vous avez déjà défini votre environnement en mode production, ou préfixez la commande avec RAILS_ENV = production
JESii
31

OK - j'ai eu le même problème. Je ne voulais pas utiliser "config.assets.compile = true" - je devais ajouter tous mes fichiers .css à la liste dans config / environnements / production.rb:

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

Ensuite, j'ai dû créer (et supprimer plus tard) tmp / restart.txt

J'ai toujours utilisé l'assistant stylesheet_link_tag, j'ai donc trouvé tous les fichiers CSS supplémentaires que je devais ajouter avec:

find . \( -type f -o -type l \) -exec grep stylesheet_link_tag {} /dev/null \;
Don Law
la source
Si vous utilisez des requêtes multimédias et différents fichiers CSS pour différentes résolutions, c'est la meilleure façon de procéder.
Fa11enAngel
1
Je dois inclure tous mes fichiers CSS dans le tableau? Et si j'ai 40 fichiers CSS?
yozzz
30

Une solution rapide pour les utilisateurs de capistrano est de mettre cette ligne sur Capfile

# Uncomment if you are using Rails' asset pipeline
load 'deploy/assets'
user673207
la source
11

Pour tous ceux qui lisent ceci mais qui n'ont pas de problème avec application.csset à la place avec leurs classes CSS personnalisées, par exemple admin.css, base.cssetc.

La solution consiste à utiliser comme mentionné

bundle exec rake assets:precompile

Et dans les références des feuilles de style, faites référence application.css

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

Étant donné que le pipeline d'actifs précompilera toutes vos feuilles de style dans application.css. Cela se produit également en développement, donc l'utilisation d'autres références est incorrecte lors de l'utilisation du pipeline d'actifs.

Haris Krajina
la source
8

J'avais exactement la même erreur dans mon environnement de développement. En fin de compte, tout ce que je devais faire pour y remédier était d'ajouter:

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

à mon fichier config / environnements / development.rb et il l'a corrigé. Ma dernière configuration en développement lié aux actifs ressemble à:

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
architecte
la source
C'était la seule solution qui fonctionnait pour moi. C'était peut-être un problème avec ma version de Rails (3.1.3)? Quoi qu'il en soit, je pouvais dire que mes actifs avaient été précompilés avec succès en public / actifs et que leurs noms de fichiers avaient les mêmes SHA que ceux répertoriés dans manifest.yml. Pour une raison quelconque, Rails ne cherchait plus d'actifs au bon endroit, même si ma configuration avait toujours fonctionné correctement auparavant. Ce changement a corrigé cela.
antinome
Merci pour cette solution. J'essayais de tester certaines choses en mode développement et j'ai été surpris qu'il dise "application.css n'est pas précompilé" même si j'avais déjà précompilé des actifs et public / assets / application.css était présent dans le répertoire. Surpris, ils ne définissent pas automatiquement config.assets.manifest pour vous en développement comme ils le font en production ..
Tyler Rick
5

J'ai également eu ce problème, où essayer de s'exécuter en production sans précompilation, cela générerait toujours des erreurs non précompilées. J'ai dû changer la ligne commentée 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
la source
2
Je veux juste clarifier pour quiconque rencontrera cela plus tard, le code que vous devez modifier ci-dessus se trouve dansconfig/application.rb
GMA
4

Voici la solution rapide:

Si vous utilisez capistrano, ajoutez ceci à votre deploy.rb:

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

casquette déployer

fivetwentysix
la source
2

J'ai rencontré ce message d'erreur aujourd'hui et je voulais publier la résolution dans mon cas. Il s'avère que mon problème était que l'un de mes fichiers css manquait d'une accolade fermante et cela empêchait la compilation du fichier. Il peut être plus difficile de le remarquer si vous disposez d'un processus automatisé qui configure tout (y compris la précompilation des ressources) pour votre environnement de production.

Instantané
la source
1

Après tout le reste a échoué ...

Ma solution a été de changer le fichier de mise en page de

= stylesheet_link_tag "reset-min", 'application'

à

= stylesheet_link_tag 'application'

Et ça a marché! (Vous pouvez placer le fichier de réinitialisation dans le manifeste.)

Victor Pudeyev
la source
1

Juste une autre façon de résoudre ce problème sur Heroku: assurez-vous que votre rakefile est validé et poussé.

phillbaker
la source
0

Sur le serveur Heroku (système de fichiers en lecture seule), si vous voulez une compilation d'exécution de CSS (ce n'est pas recommandé mais vous pouvez le faire), assurez-vous que vous avez fait les réglages comme ci-dessous -

# 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
la source
0

si vous pensez que vous avez tout bien suivi mais que vous n'avez toujours pas de chance, assurez-vous simplement que vous / capistrano exécutez touch tmp / restart.txt ou équivalent à la fin. J'étais dans la liste malchanceuse mais maintenant :)

Muntasim
la source
0

Vous en avez probablement un syntax errordans le CSS que vous utilisez.

Exécutez cette commande

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

Cela donnera l'exception, corrigera cela et vous avez terminé.

Merci

Shoaib Malik
la source