How to make Rails 3.1 use SASS (Over SCSS) as the default?

Ruby on-RailsRubySassRuby on-Rails-3.1

Ruby on-Rails Problem Overview


Having a hard time figuring out how to make SASS, not SCSS, as the default for stylesheets.

I've tried making a sass_config.rb file with this:

Sass::Plugin.options[:syntax] = :sass
Sass::Plugin.options[:style] = :compressed

I've also tried adding that to the environment.rb file. Either way I get this error:

.../config/environment.rb:7:in `<top (required)>': 
  uninitialized constant Sass::Plugin (NameError)

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

For rails 3.1.rc4, you could set the config:

config.sass.preferred_syntax = :sass

in the application.rb file

Solution 2 - Ruby on-Rails

I added the following to config/environments/development.rb:

config.sass.preferred_syntax = :sass

That did the trick.

Solution 3 - Ruby on-Rails

Do require 'sass/plugin' and make sure it's at the bottom after your Application.initialize! call.

Solution 4 - Ruby on-Rails

I definitely prefer sass to scss too - have you considered just using the compass gem for all your CSS, and adding preferred_syntax = :sass to config/compass.rb

I haven't tested this out yet on rails 3.1 yet but it works in 3.0.7

EDIT

As a troubleshooting step, what happens when you remove just the first line of code from sass_config.rb so that it just has the second one? Do both these lines cause the error?

Solution 5 - Ruby on-Rails

As @krainboltgreene commented, adding the following line to config/application.rb

config.generators.stylesheet_engine = :sass

makes sass the default format for stylesheet generators. However, since Rails 3.1.beta1 doesn't support it, one gets the following error messages

$ rails g scaffold user name:string
...
Could not find "scaffold.css.sass" in any of your source paths. Your current source paths are:
.../gems/railties-3.1.0.beta1/lib/rails/generators/rails/scaffold/templates
...

$ rails g controller users
...
Could not find "stylesheet.css.sass" in any of your source paths. Your current source paths are: 
.../gems/railties-3.1.0.beta1/lib/rails/generators/rails/assets/templates

As you see, one cannot change the default format without breaking the generators. Instead, you can manually create extra *.css.sass files, which are working fine with or without scss ones.

Solution 6 - Ruby on-Rails

I found this answer somewhere else, can't remember exactly, but put this in config/initializers/sass.rb:

Sass::Engine::DEFAULT_OPTIONS[:load_paths].tap do |load_paths|
  load_paths << "#{Rails.root}/app/assets/stylesheets"
  load_paths << "#{Gem.loaded_specs['compass'].full_gem_path}/frameworks/compass/stylesheets"
end

I also prefer SASS syntax (to SCSS). All you have to do is name files mystylesheet.css.sass instead and it just works. You can even rename your application.css to application.css.sass, change the comments at the top to // instead of /* */ and use the require_* directives—it all works, and then you can use SASS in your application global stylesheet. It won't if you use compass in app/stylesheets.

Don't require the Sass::Plugin, it's totally separate to the new Rails asset engine which is based on Sprockets. It already knows how to compile SASS for you and manages the bundling of assets properly.

I imagine a new Compass release will do this automatically for Rails 3.1+ projects using the asset pipeline.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionkrainboltgreeneView Question on Stackoverflow
Solution 1 - Ruby on-RailsKevinView Answer on Stackoverflow
Solution 2 - Ruby on-RailsreminoView Answer on Stackoverflow
Solution 3 - Ruby on-RailsaceofspadesView Answer on Stackoverflow
Solution 4 - Ruby on-RailsstephenmurdochView Answer on Stackoverflow
Solution 5 - Ruby on-RailsAndreiView Answer on Stackoverflow
Solution 6 - Ruby on-Railssj26View Answer on Stackoverflow