Reputation: 8588
For my newly started Rails 6 application I want to have a set of customs fonts. My setup looks like this:
# app/assets/stylesheets/my-font.sass
@font-face
font-family: 'my-font'
src: url('fonts/my-font.eot') format('embedded-opentype'), url('fonts/my-font.woff') format('woff'), url('fonts/my-font.ttf') format('truetype'), url('fonts/my-font.svg#my-font') format('svg')
font-weight: 400
font-style: normal
And then under app/assets/stylesheets/fonts
I have all 4 files referenced in the sass file.
My application.sass
has the following import: @import 'my-font'
.
When I run rails assets:precompile
it also puts all 4 files with suffixed version (e.g. my-font-7384658374658237465837246587263458.eot
) in the public
directory.
BUT, when I run the application the browser is looking for a file in the root directory called my-font.eot
, which of course isn't there and 404s. This looks definitely like a configuration problem to me, but where I have no idea. Any help would be much appreciated.
Upvotes: 11
Views: 9372
Reputation: 526
Add your fonts into app/assets/fonts
folder.
Now you need to tell Sprockets to load fonts in the first place. To do that, just add
//= link_tree ../fonts
to app/assets/config/manifest.js
Side note: you may come across advice to update initializers/assets.rb
, but that is outdated, and Sprockets 4 wants you to add directive to load fonts to manifest.js
.
font-face
for use in your application, and your intention was right, but you need to use font-url
instead of url
for it to work, sosrc: font-url('my-font.eot') format('embedded-opentype') ...
And notice that you don't need to specify fonts
directory, because font-url
already implies it.
Bonus: you can use this sass mixin that simplifies specifying alternative formats for your fonts.
Upvotes: 17
Reputation: 15838
If you have the fonts inside /assets/
then use the asset-url
helper.
src: asset-url('fonts/my-font.eot') format('embedded-opentype'),
asset-url('fonts/my-font.woff') format('woff'),
asset-url('fonts/my-font.ttf') format('truetype'),
asset-url('fonts/my-font.svg#my-font') format('svg')
That way Sprockets will change "fonts/my-font.xxx" to the filename with the digest.
Personally I don't like to put fonts on the assets pipeline since they are probably not changing and only slows down your precompilation time, so I put them in public:
/public/fonts/my-font.eot
/public/fonts/my-font.woff
...ect...
And just use your original css code.
(This has nothing to do with webpack or webpacker)
Upvotes: 20