Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails 4 - Custom Fonts

Currently I trying to add custom fonts into my Rails 4 application.

  1. I added all of my fonts into assets/fonts
  2. I added config.assets.paths << Rails.root.join("app", "assets", "fonts") into config/application.rb
  3. I added script into my style.css
  @font-face {
      font-family: 'oxygenregular';
      src: url(font-path('oxygen-regular-webfont.eot') + "?#iefix") format('embedded-opentype'),
           url(font-path('oxygen-regular-webfont.woff')) format('woff'), 
           url(font-path('oxygen-regular-webfont.ttf'))  format('truetype'),
           url(font-path('oxygen-regular-webfont.svg') + "#MyFont") format('svg');
  }

  body {
    font-family: 'oxygenregular', arial;
    background: #f4f5f9;
    background-image: url(../images/bg-pattern.png);
    background-position: 0 bottom;
    background-repeat: no-repeat;
  }

I don't get any error like 404 (Not Found), since I got the error before modified config/application.rb

But the application doesn't load the font that I already put. I tried on native HTML and the fonts are working well, but when I trying to put them into Rails application, it doesn't load.a

like image 678
Irwan Avatar asked Dec 09 '25 07:12

Irwan


1 Answers

Fonts

The problem you have is you're calling the font files without referencing their paths correctly.

The issue here is the same as when you reference images or other files from the asset pipeline - if you use a file path which doesn't exist, it's just not going to load (because of the asset fingerprinting):

Fingerprinting is a technique that makes the name of a file dependent on the contents of the file. When the file contents change, the filename is also changed. For content that is static or infrequently changed, this provides an easy way to tell whether two versions of a file are identical, even across different servers or deployment dates.

What you get with many Rails assets is an inability to reference the correct file, as the filepath has had its name changed when you precompiled them, preventing them from loading in most cases.


Paths

To add to @praszyk's answer is that you'll need to use one of the asset_paths to pull the correct font path, which can be done using one of the CSS preprocessors that come with Rails (typically SCSS or SASS)

The problem you have is using .css is not going to do this - you have to use either .scss or .sass:

#app/assets/stylesheets/style.css.scss
@font-face { font-family: 'oxygenregular'; 
             src: asset_url('/fonts/oxygen-regular-webfont.eot' + "?#iefix") 
             format('embedded-opentype'), 
               asset_url('/fonts/oxygen-regular-webfont.woff') format('woff'),
               asset_url('/fonts/oxygen-regular-webfont.ttf') format('truetype'), 
               asset_url(font-path('/fonts/oxygen-regular-webfont.svg') + "#MyFont") format('svg'); }

Using asset_url with scss will automatically call the correct version of the file - fingerprinted or not.

If you use this with @praszyk's answer, it should hopefully work

like image 164
Richard Peck Avatar answered Dec 11 '25 00:12

Richard Peck