Search code examples
ruby-on-rails-3.1asset-pipelinesass

Persisting SCSS variables in rails asset pipeline?


I'm upgrading a rails app with lots of SCSS stylesheets to use the asset pipeline, and need to include some global variables and mixins for each file.

Adding several @import directives at the top of every file isn't very DRY, so I'd like to do something like this:

# application.css
/*
*= require variables
*= require mixins
*= require_tree .
*/

This doesn't work of course, because the variables are not persisted across files. Anyone know how to achieve this?


Solution

  • The default manifest syntax isn't powerful enough to give you useful Sass features like shared variables, mixins, etc. Instead, you should:

    1. Rename application.css to application.scss (or application.css.scss in Rails 4 or earlier)
    2. Instead of using the

      /*
       *= require variables
       *= require mixins
       *= require_tree .
       */
      

      nonsense, you should now use

      @import "variables";
      @import "mixins";
      @import "blah"; // import each SCSS file in your project like this.
      

      This will ensure you have full benefit of your variables and mixins throughout your project, and you are kept as DRY as Sass allows.