Using fonts with Rails asset pipeline
If your Rails version is between
> 3.1.0
and< 4
, place your fonts in any of the these folders:app/assets/fonts
lib/assets/fonts
vendor/assets/fonts
For Rails versions
> 4
, you must place your fonts in theapp/assets/fonts
folder.Note: To place fonts outside of these designated folders, use the following configuration:
config.assets.precompile << /\.(?:svg|eot|woff|ttf)\z/
For Rails versions
> 4.2
, it is recommended to add this configuration toconfig/initializers/assets.rb
.However, you can also add it to either
config/application.rb
, or toconfig/production.rb
Declare your font in your CSS file:
@font-face { font-family: 'Icomoon'; src:url('icomoon.eot'); src:url('icomoon.eot?#iefix') format('embedded-opentype'), url('icomoon.svg#icomoon') format('svg'), url('icomoon.woff') format('woff'), url('icomoon.ttf') format('truetype'); font-weight: normal; font-style: normal; }
Make sure your font is named exactly the same as in the URL portion of the declaration. Capital letters and punctuation marks matter. In this case, the font should have the name
icomoon
.If you are using Sass or Less with Rails
> 3.1.0
(your CSS file has.scss
or.less
extension), then change theurl(...)
in the font declaration tofont-url(...)
.Otherwise, your CSS file should have the extension
.css.erb
, and the font declaration should beurl('<%= asset_path(...) %>')
.If you are using Rails
> 3.2.1
, you can usefont_path(...)
instead ofasset_path(...)
. This helper does exactly the same thing but it's more clear.Finally, use your font in your CSS like you declared it in the
font-family
part. If it was declared capitalized, you can use it like this:font-family: 'Icomoon';
Now here's a twist:
You should place all fonts in
app/assets/fonts/
as they WILL get precompiled in staging and production by default—they will get precompiled when pushed to heroku.Font files placed in
vendor/assets
will NOT be precompiled on staging or production by default — they will fail on heroku. Source!
— @plapier, thoughtbot/bourbon
I strongly believe that putting vendor fonts into
vendor/assets/fonts
makes a lot more sense than putting them intoapp/assets/fonts
. With these 2 lines of extra configuration this has worked well for me (on Rails 4):
app.config.assets.paths << Rails.root.join('vendor', 'assets', 'fonts')
app.config.assets.precompile << /\.(?:svg|eot|woff|ttf)$/
— @jhilden, thoughtbot/bourbon
I've also tested it on rails 4.0.0
. Actually the last one line is enough to safely precompile fonts from vendor
folder. Took a couple of hours to figure it out. Hope it helped someone.
If you don't want to keep track of moving your fonts around:
# Adding Webfonts to the Asset Pipeline
config.assets.precompile << Proc.new { |path|
if path =~ /\.(eot|svg|ttf|woff)\z/
true
end
}