[RUBY] Comment séparer .scss par contrôleur dans Rails

Au fur et à mesure que l'échelle de l'application devenait plus grande, la description du fichier application.scss devenait plus longue, j'ai donc décidé de séparer le fichier pour chaque contrôleur cette fois. J'ai eu beaucoup de mal et j'ai beaucoup appris, alors j'ai décidé d'écrire un article pour ne pas l'oublier.

environnement

Ruby 2.5.7 Rails 5.2.4

répondre

Je n'écrirai d'abord que la réponse.

application.scss


// require_tree .
// require_self

erb:application.html.erb


<head>
  ...
  <%= stylesheet_link_tag 'application' %>
  ...
</head>

Tout ce que vous avez à faire est de créer un fichier .scss avec cette description et chaque nom de contrôleur dans app / assets / stylesheet /!

J'expliquerai un peu le contenu d'ici.

Contexte

// require_tree. Est-ce nécessaire?

Au début, j'ai fait de application.scss un fichier de style commun et j'ai essayé de correspondre à toutes les pages avec deux fichiers de contrôleur name.scss de chaque page. La description à ce moment-là est la suivante.

application.scss


// require_self

erb:application.html.erb


<head>
  ...
  <%# application.Chargement de scss%>
  <%= stylesheet_link_tag 'application' %>

  <%#Nom du contrôleur.Chargement de scss%>
  <%= stylesheet_link_tag params[:controller] %>
  ...
</head>

Le // require_tree . dans le fichier application.scss est une description qui lit tous les fichiers .scss dans app / assets / stylesheet, supprimez-le donc une fois. Au lieu de cela, si vous écrivez les paramètres [: controller] dans le stylesheet_link_tag de application.html.erb, vous pouvez obtenir le chemin du contrôleur comprenant le répertoire, donc même si le contrôleur est divisé en répertoires, cette méthode d'écriture peut être utilisée.

Cependant, cette méthode convient aux fichiers .css, mais elle provoque une erreur pour .scss.

La précompilation échoue

.scss ne peut être pris en charge par les navigateurs qu'en le compilant au format .css. En d'autres termes, il ne peut normalement pas être affiché au format .scss.

Et le fichier .scss précompilé (fichier .css) est stocké sous app / public / assets dans l'environnement de production, et le nom du fichier est changé au format de hachage. En d'autres termes, le fichier css ne peut pas être récupéré par <% = stylesheet_link_tag params [: controller]%> décrit dans application.html.erb. Même si le nom du fichier est changé au format de hachage, si vous spécifiez le hachage tel qu'il est dans stylesheet_link_tag, cela fonctionnera, mais ce hachage n'est pas réaliste car il change à chaque fois que le fichier est mis à jour.

Je ne pouvais pas vraiment comprendre comment le fichier .scss que je voulais faire était divisé par contrôleur, alors je suis passé à la description au début.

// À propos de la différence entre la présence et l'absence de require_tree.

Si application.scss a // require_tree ., cela signifie que tous les fichiers .scss sous assets / stylesheet seront lus.

Cela ne devrait pas arriver trop souvent, mais si vous spécifiez le style alors que le nom de classe du sélecteur css est couvert, celui décrit plus loin sera prioritaire, vous ne pouvez donc pas le changer comme vous le souhaitez. Au fait, il existe un risque de créer des dépendances.

Ordre de lecture des fichiers .css (.scss)

application.scss


// require_tree .
// require_self

Si vous écrivez comme au début, application.scss sera chargé une fois que tous les fichiers .scss auront été chargés. De plus, l'ordre du contenu de // require_tree . est dans l'ordre du dictionnaire, et ils sont lus dans l'ordre du nom de fichier a → z. Inévitablement, plus l'initiale du nom de fichier est proche de z dans l'arborescence., Plus il sera lu tard, donc il a tendance à avoir une priorité plus élevée.

Gestion des fichiers .scss préparés pour les variables

Avant cela, jetons un coup d'œil aux variables .scss.

Dans scss, les propriétés et les valeurs peuvent être utilisées comme variables. Pour l'instant dans mon cas

_variables.scss


  //Animation de hamburgers
  $hamburger-transition: 0.3s;

  //Couleur du thème
  $thema-color1: #fff9f9;
  $thema-color2: #ffefef;
  $thema-color-font: #555;

  //Requête média
  $media-sp-max: 450px;
  $media-pc-min: 1024px;
  $media-tb-min: $media-sp-max + 1px;
  $media-tb-max: $media-pc-min - 1px;

  //Exemple
Nom du sélecteur{
    background: $thema-color1;
  }

Avec cela, vous pouvez changer la couleur du thème, la largeur de la requête multimédia, la transition du menu hamburger, etc. pour chaque fichier à la fois.

Vous pouvez définir une variable en commençant par $ puis en entrant la valeur. Lors de l'appel, écrivez simplement le nom de la variable à la place de la valeur.

Cependant, en l'état, la variable n'est pas définie dans chaque fichier, il est donc nécessaire d'importer le fichier contenant uniquement cette variable dans le fichier .scss de chaque nom de contrôleur.

Nom du contrôleur.scss


@import "variables";
...

En écrivant `@import" nom de fichier ", dans ce cas, les variables écrites dans _variables peuvent être utilisées.

La question s'est posée ici. "Application.scss décrit // require_tree .. Chaque fichier .scss décrit l'importation de fichiers de variables, donc chaque fois que chaque fichier est lu au moment de la compilation, le fichier de variables est également décrit. Est-il lu comme un fichier .css? " Je peux dire qu'il n'y a pas de problème même s'il est lu, mais je pensais qu'il y avait beaucoup de gaspillage, alors j'ai enquêté plus loin.

Le résultat était que je l'évitais sans le savoir. Lol

"Partiel" pour exclure les fichiers communs de la compilation

J'ai fait un nom de fichier en me référant à la façon de créer un fichier variable en regardant un article, mais il semble qu'il ne sera pas compilé en ajoutant un trait de soulignement "_" au début du nom de fichier lol En d'autres termes, _variables.scss utilisé cette fois est exclu de la précompilation car il s'agit d'un nom de fichier commençant par un trait de soulignement. Si vous y réfléchissez bien, il est vrai qu'un fichier qui n'écrit que des variables ne stylise pas directement, il est donc inutile de le convertir en .css, et lors de la conversion d'autres fichiers en .css, remplacez la partie variable par le contenu. J'étais étrangement convaincu que si je pouvais faire cela, le fichier de variables suffirait.

Résumé

Je reviendrai sur la méthode de mise en œuvre au début, mais pour le moment, je pense la faire fonctionner de cette manière.

application.scss


// require_tree .
// require_self
...

_variables.scss


$Nom de variable:valeur;
...

Chaque nom de contrôleur.scss


@import "variables";
...

erb:application.html.erb


<head>
  ...
  <%= stylesheet_link_tag 'application' %>
  ...
</head>

Jusqu'à présent, j'ai écrit le style uniquement dans application.scss et j'ai fait un bloc en écrivant le nom du contrôleur en utilisant pleinement les commentaires, mais je me demande s'il sera plus facile à maintenir même si le fichier est séparé pour chaque contrôleur. Je pense. Dans le cas peu probable où le nom de la classe serait couvert, nous le décrirons visuellement de manière facile à comprendre en utilisant l'imbrication de sélecteurs, qui est également une fonctionnalité de .scss. (Le nom de la classe à réutiliser (flex, grid, btn, etc.) est décrit séparément dans le fichier application.scss.)

Je vous serais reconnaissant si vous pouviez m'apprendre comment précompiler le fichier .scss pour chaque contrôleur sans utiliser // require_tree .! De plus, si vous avez des questions, des différences d'interprétation ou un inconfort dans la méthode de description, nous vous serions reconnaissants de bien vouloir le signaler dans les commentaires.

Merci d'avoir lu jusqu'au bout!

Site de référence

Rails Guide-Asset Pipeline Web Design Leaves - SASS [CSS HappyLife - Apprenons Sass! Vol.7] Diviser les fichiers pour une gestion plus facile (partielle)](http://css-happylife.com/archives/2012/0124_1850.php) HACK NOTE --Sass: gérons les variables dans un fichier séparé

Recommended Posts

Comment séparer .scss par contrôleur dans Rails
Comment installer jQuery dans Rails 6
Comment installer Swiper in Rails
Comment implémenter la fonctionnalité de recherche dans Rails
Comment changer le nom de l'application dans les rails
Comment insérer une vidéo dans Rails
Comment utiliser MySQL dans le didacticiel Rails
[rails] Comment configurer le routage dans les ressources
Comment implémenter la fonctionnalité de classement dans Rails
Comment utiliser credentials.yml.enc introduit à partir de Rails 5.2
[Rails] Comment décider de la destination par "voies ferrées"
Comment écrire des rails
Comment mettre en œuvre un diaporama en utilisant Slick in Rails (un par un et plusieurs par un)
[Rails] Comment utiliser les boîtes de sélection dans Ransack
Comment sortir le CSV créé par Rails vers S3
Comment traduire Rails en japonais en général
Comment désinstaller Rails
Comment ajouter conditionnellement une classe html.erb dans Rails
Comment implémenter une fonctionnalité similaire dans Rails
Comment créer facilement un pull-down avec des rails
Comment utiliser JQuery dans Rails 6 js.erb
[Rails] Comment utiliser PostgreSQL dans l'environnement Vagrant
Comment vérifier les commandes Rails dans le terminal
Comment régler l'heure d'affichage sur l'heure japonaise dans les rails
Comment implémenter la connexion invité en 5 minutes sur le portefeuille de rails
[Ruby On Rails] Comment réinitialiser DB dans Heroku
[Comment insérer une vidéo dans un hameau avec Rails]
Comment écrire une recherche de comparaison de dates dans Rails
Comment interroger Array dans jsonb avec Rails + postgres
[Rails 6] Comment définir une image d'arrière-plan dans Rails [CSS]
[Rails] Comment modifier et personnaliser les vues et les contrôleurs de conception
[Rails] Comment charger JavaScript dans une vue spécifique
[Rails] Comment afficher les images dans la vue
[rails] Comment publier des images
[Rails] Comment utiliser enum
[Rails] Comment utiliser enum
Comment lire les itinéraires des rails
Comment utiliser la jonction de rails
Comment terminer le serveur de rails
Comment écrire des graines de Rails
[Rails] Comment utiliser la validation
[Rails] Comment désactiver les turbolinks
[Rails] Comment utiliser authenticate_user!
[Rails] Comment mettre en œuvre le scraping
[Rails] Comment faire des graines
Comment écrire le routage Rails
[Rails] Comment installer simple_calendar
[Rails] Comment installer reCAPTCHA
[Rails] Comment utiliser Scope
Comment séparer les mots dans les noms dans les classes, les méthodes et les variables