web-dev-qa-db-fra.com

Après la mise à jour de la gemme: le test a échoué avec "L'élément n'a pas été déclaré comme étant précompilé en production"

Depuis que j'ai mis à jour plusieurs gemmes, tous les tests échouent avec l'erreur:

ActionView :: Template :: Error: L'élément n'a pas été déclaré comme étant précompilé en production.

Ajoutez Rails.application.config.assets.precompile += %w( favicons/manifest.json.erb ) à config/initializers/assets.rb Et redémarrez votre serveur

app/views/layouts/_faviconsheader.html.erb: 14: dans _app_views_layouts__faviconsheader_html_erb__1320

app/views/layouts/application.html.erb: 21: in _app_views_layouts_application_html_erb__4340

L'erreur semble se référer au partiel _faviconsheader.html.erb Qui inclut la ligne:

<%= content_tag :link, nil, rel: :manifest, href: image_path("favicons/manifest.json.erb") %>

Ce partiel est chargé dans application.html.erb: <%= render partial: 'layouts/faviconsheader' %>.

Une idée de ce qui cause cette erreur et que faire? Avant la mise à jour de la gemme, tous les tests ont réussi.

J'utilise Rails 4.2.5. L'un des joyaux mis à jour était sprockets (pignons mis à jour vers la version 3.5.2). J'ai lu quelque chose sur github sur les pignons 4 ayant un problème, mais je n'utilise pas la version 4.


P.S. Même si j'ajoute Rails.application.config.assets.precompile += %w( favicons/manifest.json.erb ) à config/initializers/assets.rb L'erreur persiste. Mais même si cela avait fonctionné, j'aurais voulu comprendre pourquoi ce problème est survenu, sans aucun changement, sauf la mise à jour de quelques gemmes.

42
Marty

Réponse longue + explication

Je pense que la bonne solution consiste à ajouter le fichier aux actifs précompilés, comme recommandé par le message d'erreur. Peut-être que cela ne résout pas le problème pour vous car vous avez un fichier erb qui doit être rendu au moment de l'exécution. J'imagine que si le fichier était un fichier json statique, vous ne rencontreriez toujours pas le problème après l'avoir ajouté aux actifs précompilés.

Lorsque vous utilisez le image_path helper, Sprockets suppose que vous avez un élément statique. Le fait que votre application n'ait pas généré d'erreurs avant sprockets-Rails 3.0 est quelque peu surprenant. Cette nouvelle version fait apparemment un meilleur travail dans l'application des normes. (il semble également qu'il existe d'autres problèmes avec 3.0 qui pourraient être mis à jour prochainement)

Si vous devez avoir erb à l'intérieur du manifeste, il serait préférable d'utiliser un assistant de chemin d'accès plutôt que image_path ou asset_path pour obtenir l'url. Cela vous obligerait à ajouter une route manifeste à votre config/routes.rb fichier et rendre le fichier json via une action de contrôleur. Le fichier de vue serait votre .erb manifeste.


Réponse courte

Cela a commencé à m'arriver après avoir fait un bundler update qui a changé mon sprockets-Rails version de 2.3.3 à 3.0.0. Une solution simple consiste à rétablir sprockets-Rails retour à la version 2.3.3 dans votre Gemfile et exécution de bundle install encore:

gem 'sprockets-Rails', '2.3.3'

En passant: je rencontrais ce problème dans l'environnement de développement et j'ai pu le résoudre en exécutant rake assets:precompile. Malheureusement, mes tests n'ont pas réussi.

55
Nathan

J'ai eu une erreur similaire. Je n'ai pas modifié assets.rb ou quoi que ce soit, il suffit de redémarrer mon serveur et plus d'erreur.


ActionView :: Template :: Error (L'élément n'a pas été déclaré comme étant précompilé en production. Ajoutez Rails.application.config.assets.precompile += %w( Rails.png ) à config/initializers/assets.rb et redémarrez votre serveur): 10: <% = link_to "Inscrivez-vous maintenant!", '#', classe: "btn btn-lg btn-primary"%> 11: 12: 13: <% = link_to image_tag ( "Rails.png", alt: "Logo Rails"), 14: ' http://rubyonrails.org/ '%> app/views/static_pages/home.html.erb: 13: in `_app_views_static_pages_home_html_erb ___ 1806898863626708249_70312070486240 '

6
Multivac

Bien que les gens aient donné de longues réponses, je suggère une réponse très simple et concise.

config/initializers/assets.rb et

Ajoutez la ligne suivante

Rails.application.config.assets.precompile + =% w ( style.css )

où style.css peut être remplacé par n'importe quel nom de fichier pour css

4
Yash Agrawal