J'essaie de mettre mon application en production et les chemins des ressources image et css ne fonctionnent pas.
Voici ce que je fais actuellement:
- Les éléments d'image se trouvent dans /app/assets/images/image.jpg
- Les feuilles de style se trouvent dans /app/assets/stylesheets/style.css
- Dans ma mise en page, je référence le fichier css comme ceci:
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
- Avant de redémarrer unicorn, je cours
RAILS_ENV=production bundle exec rake assets:precompile
et ça réussit et je vois les fichiers d'empreintes digitales dans lepublic/assets
répertoire.
Lorsque je navigue sur mon site, j'obtiens une erreur 404 non trouvée pour mysite.com/stylesheets/styles.css
.
Qu'est-ce que je fais mal?
Mise à jour: Dans ma mise en page, cela ressemble à ceci:
<%= stylesheet_link_tag "bootstrap.min", media: "all", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
La source de génération est la suivante:
<link data-turbolinks-track="true" href="/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/stylesheets/styles.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/application-0c647c942c6eff10ad92f1f2b0c64efe.js"></script>
Il semble que Rails ne recherche pas correctement les fichiers css compilés. Mais il est très déroutant de savoir pourquoi cela fonctionne correctement pour les javascripts (notez le /assets/****.js
chemin).
ruby-on-rails
ruby
asset-pipeline
ruby-on-rails-4
emersonthis
la source
la source
stylesheet_link_tag
.<%= stylesheet_link_tag "style", media: "all", "data-turbolinks-track" => true %>
public/assets
et 2. vérifier s'il n'y a pas une autre instruction quelque part essayant de charger ce fichier css (vraisemblablement codé en dur).home {background: #FFF url(<%= image_path 'hippopotamus.jpg' %>) no-repeat; }
peut en fait être remplacé dans sprocket par.home {background: #FFF url(image-path('hippopotamus.jpg')) no-repeat; }
. Peut-être que vous pouvez essayer si cela vous aide.Réponses:
Dans les rails 4, vous devez effectuer les modifications ci-dessous:
Cela fonctionne avec moi. utiliser la commande suivante pour précompiler les ressources
Bonne chance!
la source
config.serve_static_files
et configurer l'alias dans Apache et nginx pour gérerassets
.J'ai juste eu le même problème et j'ai trouvé ce paramètre dans config / environnements / production.rb:
Changer pour le
true
faire fonctionner. Il semble que, par défaut, Rails s'attende à ce que vous ayez configuré votre serveur Web frontal pour gérer les demandes de fichiers hors du dossier public au lieu de les envoyer par proxy à l'application Rails. Peut-être avez-vous fait cela pour vos fichiers javascript mais pas vos feuilles de style CSS?( Voir la documentation Rails 5 ). Comme indiqué dans les commentaires, avec Rails 5, vous pouvez simplement définir la
RAILS_SERVE_STATIC_FILES
variable d'environnement, car le paramètre par défaut estconfig.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
.la source
config.serve_static_assets
a été renommée pourconfig.serve_static_files
clarifier son rôle (elle permet simplement de servir tout ce qui se trouve dans lepublic
dossier et n'est pas liée au pipeline d'actifs). L'serve_static_assets
alias sera supprimé dans Rails 5.0. Veuillez migrer vos fichiers de configuration en conséquence.config.serve_static_files
dans Rails 4.2 etconfig.public_file_server.enabled
dans Rails 5 . @see github.com/heroku/rails_serve_static_assets/blob/master/lib/…config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
afin que vous puissiez le définir différemment pour votre environnement sans changer le code qui est archivé dans votre SCM.Dans
/config/environments/production.rb
j'ai dû ajouter ceci:Le .js était déjà précompilé, mais je l'ai quand même ajouté. Les .css et .css.erb ne se produisent apparemment pas automatiquement. Le
^[^_]
exclut les partiels de la compilation - c'est une expression rationnelle.Il est un peu frustrant que la documentation indique clairement que le pipeline d'actifs est activé par défaut, mais ne clarifie pas le fait que cela ne s'applique qu'aux javascripts.
la source
Je suis en mesure de résoudre ce problème en changeant:
config.assets.compile = false
àconfig.assets.compile = true
en/config/environments/production.rb
Mise à jour (24 juin 2018) : Cette méthode crée une vulnérabilité de sécurité si la version de Sprockets que vous utilisez est inférieure à 2.12.5, 3.7.2 ou 4.0.0.beta8
la source
Pour Rails 5, vous devez activer le code de configuration suivant:
config.public_file_server.enabled = true
Par défaut, Rails 5 est livré avec cette ligne de configuration:
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
Par conséquent, vous devrez définir la variable d'environnement
RAILS_SERVE_STATIC_FILES
sur true.la source
passenger_env_var RAILS_SERVE_STATIC_FILES true;
le bloc d'emplacement de mon application dans mon fichier nginx.conf.Il y a 2 choses que vous devez accomplir pour servir les actifs en production:
1) Afin de précompiler les actifs, vous avez plusieurs choix.
Vous pouvez l'exécuter
rake assets:precompile
sur votre machine locale, la valider dans le contrôle du code source (git), puis exécuter le programme de déploiement, par exemple capistrano. Ce n'est pas un bon moyen de valider des actifs précompilés dans SCM.Vous pouvez écrire une tâche de râteau qui s'exécute
RAILS_ENV=production rake assets:precompile
sur les serveurs cibles chaque fois que vous déployez votre application Rails en production, avant de redémarrer le serveur.Le code d'une tâche pour capistrano ressemblera à ceci:
2) Maintenant, vous avez les actifs sur les serveurs de production, vous devez les servir au navigateur.
Encore une fois, vous avez plusieurs choix.
Activer le service de fichiers statiques Rails dans config / environnements / production.rb
L'utilisation de Rails pour servir des fichiers statiques va tuer les performances de votre application Rails.
Configurez nginx (ou Apache) pour servir les fichiers statiques.
Par exemple, mon nginx qui a été configuré pour fonctionner avec Puma ressemble à ceci:
la source
Rails 4 ne génère plus la version non empreinte digitale de l'élément: les feuilles de style / style.css ne seront pas générées pour vous.
Si vous utilisez,
stylesheet_link_tag
le lien correct vers votre feuille de style sera généréDe plus
styles.css
devrait être dansconfig.assets.precompile
laquelle se trouve la liste des choses qui sont précompiléesla source
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
Est-ce incorrect? ``<link data-turbolinks-track="true" href="https://stackoverflow.com/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
Mais les fichiers javascript sont corrects! Je ne comprends pas pourquoi les mêmes configurations fonctionnent pour les fichiers .js mais pas pour .css.serve_static_files
est obsolète et sera supprimé dans Rails 5.1. Veuillez utiliser à lapublic_file_server.enabled = true
place.404
. Avez-vous résolu ce problème?changer votre ligne de fichier Production.rb
dans
et aussi ajouter
la source
J'utilise Ubuntu Server 14.04 , Ruby 2.2.1 et Rails 4.2.4 J'ai suivi un déploiement turorial de DigitalOcean et tout s'est bien passé mais quand je vais dans le navigateur et entre l'adresse IP de mon VPS mon application est chargée mais sans styles et javascript.
L'application fonctionne avec Unicorn et Nginx . Pour résoudre ce problème, je suis entré dans mon serveur en utilisant SSH avec mon utilisateur `` deployer '' et accédez au chemin de mon application qui est `` / home / deployer / apps / blog '' et exécutez la commande suivante:
Ensuite, je viens de redémarrer le VPS et c'est tout! Ça marche pour moi!
J'espère que cela pourrait être utile pour quelqu'un d'autre!
la source
Si la précompilation est définie, vous n'avez PAS besoin
car il s'agit de servir les actifs en direct.
Notre problème était que nous n'avions qu'une base de clé secrète de développement définie dans
config/secrets.yml
Besoin d'entrée pour l'environnement de production
la source
config.assets.precompile = ['*.js', '*.css', '*.css.erb']
et à exécuterRAILS_ENV=production bundle exec rake assets:precompile
CE QUE VOUS NE DEVRIEZ PAS faire:
Certains de mes collègues ci-dessus vous ont recommandé de faire ceci:
Le pipeline d'actifs ferroviaires dit de l'approche ci-dessus:
Ce que tu devrais faire:
Précompilez vos actifs.
RAILS_ENV=production rake assets:precompile
Vous pouvez probablement le faire avec une tâche de râteau.
la source
http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets
la source
Tout d'abord, vérifiez vos actifs, il est possible qu'il y ait une erreur lors de la pré-compilation des actifs.
Pour précompiler les actifs en production ENV, exécutez cette commande:
S'il affiche une erreur, supprimez-la d'abord,
En cas d'erreur "variable non définie", chargez ce fichier de variable avant de l'utiliser dans un autre fichier.
exemple:
dans le fichier application.rb, séquence de la pré-compilation des actifs
exemple:
la source
Trouvé ceci:
L'option de configuration
config.serve_static_assets
a été renommée enconfig.serve_static_files
pour clarifier son rôle.dans
config/environments/production.rb
:Alors définissez env
RAILS_SERVE_STATIC_FILES
ou usingNginx
pour servir des fichiers statiques. L'ajoutconfig.serve_static_assets = true
fonctionnera toujours, mais supprimé à l'avenir.la source
il n'est pas recommandé de laisser capistrano effectuer la précompilation des assets, car cela peut prendre des années et souvent du temps. essayez de faire une précompilation des actifs locaux.
Tout d'abord, définissez dans config / application.rb
config.assets.initialize_on_precompile = false
puis faites localRAILS_ENV=production bin/rake assets:precompile
et ajoutez ces public / assets à git.et config / environnements / development.rb, modifiez le chemin de votre actif pour éviter d'utiliser des actifs précompilés:
config.assets.prefix = '/dev-assets'
Si vous avez un problème de connexion db, cela signifie que vous avez un initialiseur qui utilise db. une façon de contourner le problème est de définir un nouvel environnement en dupliquant production.rb comme peut-être production2 .rb, et dans database.yml, ajouter l' environnement production2 avec le paramètre de base de données de développement . alors fais
RAILS_ENV=production2 bin/rake assets:precompile
si vous rencontrez toujours un problème avec les actifs, par exemple ckeditor, ajoutez le fichier js dans config / initializers / assets.rb
Rails.application.config.assets.precompile += %w( ckeditor.js )
la source
Je me trompe peut-être mais ceux qui recommandent de changer
config.assets.compile = true
Le commentaire sur cette ligne se lit comme suit: # Ne pas revenir au pipeline d'actifs si un actif précompilé est manqué.
Cela suggère qu'en définissant ceci sur true, vous ne résolvez pas le problème, mais vous le contournez et exécutez le pipeline à chaque fois. Cela doit sûrement tuer vos performances et faire échouer l'objectif du pipeline?
J'ai eu cette même erreur et c'était dû au fait que l'application fonctionnait dans un sous-dossier que les rails ne connaissaient pas.
Donc, mon fichier css était dans home / sous-dossier / app / public / .... mais rails cherchait dans home / app / public / ...
essayez de déplacer votre application hors du sous-dossier ou d'indiquer aux rails qu'elle se trouve dans un sous-dossier.
la source
Cela a résolu le problème pour moi en production. Mettez-le dans la configuration nginx.
la source
Même nous avons été confrontés au même problème lorsque nous avons
RAILS_ENV=production bundle exec rake assets:precompile
réussi, mais les choses n'ont pas fonctionné comme prévu.Nous avons découvert que la licorne était le principal coupable ici.
Comme dans votre cas, même nous avions l'habitude de redémarrer unicorn après avoir compilé les actifs. On a remarqué que lorsque la licorne est redémarrée, seuls ses processus de travail sont redémarrés et non le processus maître.
C'est la raison principale pour laquelle les bons actifs ne sont pas servis.
Plus tard, après avoir compilé les actifs, nous avons arrêté et démarré unicorn afin que le processus maître licorne soit également redémarré et que les actifs corrects soient servis.
L'arrêt et le démarrage de la licorne impliquent environ 10 secondes de temps d'arrêt par rapport au redémarrage de la licorne. C'est la solution de contournement qui peut être utilisée lorsqu'une solution à long terme est de passer au puma de la licorne.
la source