Entonces, tengo una app/assets/stylesheets/
estructura de directorio que se parece a esto:
|-dialogs
|-mixins
|---buttons
|---gradients
|---vendor_support
|---widgets
|-pages
|-structure
|-ui_elements
En cada directorio, hay varios parciales sass (normalmente * .css.scss, pero uno o dos * .css.scss.erb).
Podría estar asumiendo mucho, pero los rieles DEBERÍAN compilar automáticamente todos los archivos en esos directorios debido a *= require_tree .
en application.css, ¿verdad?
Recientemente intenté reestructurar estos archivos eliminando todas las variables de color y colocándolas en un archivo en la app/assets/stylesheets
carpeta raíz (_colors.css.scss). Luego creé un archivo en la app/assets/stylesheets
carpeta raíz llamado master.css.scss que se ve así:
// Color Palette
@import "colors";
// Mixins
@import "mixins/buttons/standard_button";
@import "mixins/gradients/table_header_fade";
@import "mixins/vendor_support/rounded_corners";
@import "mixins/vendor_support/rounded_corners_top";
@import "mixins/vendor_support/box_shadow";
@import "mixins/vendor_support/opacity";
Realmente no entiendo cómo rieles maneja el orden de compilación de activos, pero obviamente no está a mi favor. Parece que ninguno de los archivos se da cuenta de que se están importando variables o mixins, por lo que arroja errores y no puedo compilar.
Undefined variable: "$dialog_divider_color".
(in /home/blah/app/assets/stylesheets/dialogs/dialog.css.scss.erb)
Undefined mixin 'rounded_corners'.
(in /home/blah/app/assets/stylesheets/widgets.css.scss)
La variable $dialog_divider_color
está claramente definida en _colors.css.scss, y _master.css.scss
está importando colores y todos mis mixins. Pero aparentemente Rails no recibió ese memo.
¿Hay alguna forma de corregir estos errores, o tendré que recurrir a volver a poner todas mis definiciones de variables en cada archivo individual, así como todas las importaciones de mixin?
Desafortunadamente, este tipo no parece pensar que sea posible, pero espero que esté equivocado. Cualquier idea es grandemente apreciada.
fuente
application.css
y le cambias el nombre aapplication.scss
. Porquerequire_tree
incluye todo y normalmente quieres controlar el ordenpara usar variables y similares en todos los archivos, debe usar la directiva @import. los archivos se importan en el orden especificado.
luego, use application.css para solicitar el archivo que declara las importaciones. esta es la forma de lograr el control que desea.
finalmente, en su archivo layout.erb, puede especificar qué archivo CSS "maestro" usar
El ejemplo será más útil:
digamos que tiene dos módulos en su aplicación que necesitan diferentes conjuntos de css: "aplicación" y "administrador"
Los archivos
|-app/ |-- assets/ |--- stylesheets/ | // the "master" files that will be called by the layout |---- application.css |---- application_admin.css | | // the files that contain styles |---- config.scss |---- styles.scss |---- admin_styles.scss | | // the files that define the imports |---- app_imports.scss |---- admin_imports.scss | | |-- views/ |--- layouts/ |---- admin.html.haml |---- application.html.haml
así es como se ven los archivos en el interior:
-------- THE STYLES -- config.scss // declare variables and mixins $font-size: 20px; -- app_imports.scss // using imports lets you use variables from `config` in `styles` @import 'config' @import 'styles' -- admin_imports.scss // for admin module, we import an additional stylesheet @import 'config' @import 'styles' @import 'admin_styles' -- application.css // in the master application file, we require the imports *= require app_imports *= require some_other_stylesheet_like_a_plugin *= require_self -- application_admin.css // in the master admin file, we require the admin imports *= require admin_imports *= require some_other_stylesheet_like_a_plugin *= require_self -------- THE LAYOUTS -- application.html.haml // in the application layout, we call the master css file = stylesheet_link_tag "application", media: "all" -- admin.html.haml // in the admin layout, we call the admin master css file = stylesheet_link_tag "application_admin", media: "all"
fuente
Cree la siguiente estructura de carpetas:
+ assets | --+ base | | | --+ mixins (with subfolders as noted in your question) | --+ styles | --+ ...
En la carpeta
base
cree un archivo "globals.css.scss". En este archivo, declare todas sus importaciones:@import 'base/colors'; @import 'base/mixins/...'; @import 'base/mixins/...';
En su application.css.scss, debería tener:
*= require_self *= depends_on ./base/globals.css.scss *= require_tree ./styles
Y como último paso (esto es importante), declare
@import 'base/globals'
en cada archivo de estilo dónde desea usar variables o mixins. Puede considerar esta sobrecarga, pero en realidad me gusta la idea de que debe declarar las dependencias de sus estilos en cada archivo. Por supuesto, es importante que solo importe mixins y variables en globals.css.scss ya que no agregan definiciones de estilo. De lo contrario, las definiciones de estilo se incluirían varias veces en su archivo precompilado ...fuente
De acuerdo con esta pregunta , SOLO puede usar
application.css.sass
para definir importar y compartir variables entre sus plantillas.=> Parece ser solo una cuestión de nombre.
Otra forma puede ser incluir todo y deshabilitar esta canalización .
fuente
Tuve un problema muy similar. Lo que me ayudó fue poner el guión bajo en la declaración @import al importar el parcial. Entonces
@import "_base";
en vez de
@import "base";
Podría ser un error extraño ...
fuente