Использование шрифтов с конвейером ресурсов Rails

295

У меня есть некоторые шрифты, настроенные в моем файле Scss, например:

@font-face {
  font-family: 'Icomoon';
  src: asset-url('icoMoon.eot?#iefix', font) format('embedded-opentype'),
       asset-url('icoMoon.woff', font) format('woff'),
       asset-url('icoMoon.ttf', font)  format('truetype'),
       asset-url('icoMoon.svg#Icomoon', font) format('svg');
}

Фактический файл шрифта хранится в /app/assets/fonts/

Я добавил config.assets.paths << Rails.root.join("app", "assets", "fonts") в файл application.rb

и исходный код компиляции CSS:

@font-face {
  font-family: 'Icomoon';
  src: url(/assets/icoMoon.eot?#iefix) format("embedded-opentype"), url(/assets/icoMoon.woff) format("woff"), url(/assets/icoMoon.ttf) format("truetype"), url(/assets/icoMoon.svg#Icomoon) format("svg");
}

Но когда я запустил приложение, файлы шрифтов не будут найдены. Журналы:

Начнется GET "/assets/icoMoon.ttf" для 127.0.0.1 в 2012-06-05 23:21:17 +0100 Сервисный актив /icoMoon.ttf - 404 Не найдено (13 мс)

Почему инфраструктура не сглаживает файлы шрифтов в просто/активы?

Любые идеи людей?

С уважением, Нил

Дополнительная информация:

При проверке консоли рельсов для путей к ресурсам и ресурсапредомкомпиля я получаю следующее:

1.9.2p320 :001 > y Rails.application.config.assets.precompile
---
- !ruby/object:Proc {}
- !ruby/regexp /(?:\/|\\|\A)application\.(css|js)$/
- .svg
- .eot
- .woff
- .ttf
=> nil



1.9.2p320 :002 > y Rails.application.config.assets.paths
---
- /Users/neiltonge/code/neiltonge/app/assets/fonts
- /Users/neiltonge/code/neiltonge/app/assets/images
- /Users/neiltonge/code/neiltonge/app/assets/javascripts
- /Users/neiltonge/code/neiltonge/app/assets/stylesheets
- /Users/neiltonge/code/neiltonge/vendor/assets/images
- /Users/neiltonge/code/neiltonge/vendor/assets/javascripts
- /Users/neiltonge/code/neiltonge/vendor/assets/stylesheets
- /Users/neiltonge/.rvm/gems/ruby-1.9.2-p320@neiltonge/gems/jquery-rails-2.0.0/vendor/assets/javascripts
- /Users/neiltonge/.rvm/gems/ruby-1.9.2-p320@neiltonge/gems/coffee-rails-3.2.1/lib/assets/javascripts
- /Users/neiltonge/.rvm/gems/ruby-1.9.2-p320@neiltonge/gems/bourbon-1.3.0/app/assets/stylesheets
- !ruby/object:Pathname
  path: /Users/neiltonge/code/neiltonge/app/assets/fonts
 => nil
  • 3
    У вас есть помощник font-url в SCSS в Rails.
  • 0
    Это не имеет никакого значения, к сожалению. Поэтому мой вопрос все еще стоит
Показать ещё 1 комментарий
Теги:
sass
font-face
assets
asset-pipeline

11 ответов

613
Лучший ответ
  • Если вы находитесь на Rails > 3.1.0 и < 4, вы можете просто разместить свои шрифты в папках app/assets/fonts, lib/assets/fonts или vendor/assets/fonts.

    Если вы находитесь в Rails 4+, вы можете разместить свои шрифты только в папке app/assets/fonts.

    Если вы хотите разместить их вне этих назначенных папок, вам необходимо добавить следующую конфигурацию:

    config.assets.precompile << /\.(?:svg|eot|woff|ttf)\z/

    Если вы используете Rails 4.2+, рекомендуется добавить эту конфигурацию в файл config/initializers/assets.rb.

    Если вы этого не сделали, добавьте его в файл application.rb или production.rb.

  • Объявите свой шрифт в своем CSS так:

    @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;
    }
    

    Убедитесь, что шрифт указан точно так же, как в URL-адресе декларации. Заглавные буквы и знаки препинания имеют значение. Поэтому в этом случае шрифт должен иметь имя icomoon.

  • Если вы используете Sass или Less with Rails 3.1.0+ (поэтому ваш файл css имеет расширение .scss или .less), измените url(...) в объявлении шрифта на font-url(...).

    Если вы этого не сделаете, тогда ваш файл css должен иметь расширение .css.erb, а объявление шрифта должно быть изменено на url('<%= asset_path(...) %>').

    Кроме того, если вы используете Rails 3.2.1+, вы можете использовать font_path(...) вместо asset_path(...). Этот помощник делает то же самое, но это немного более понятно.

  • Наконец, используйте свой шрифт в своем CSS, как вы его объявили в части font-family. Поскольку он был объявлен заглавным, вы можете использовать его следующим образом:

    font-family: 'Icomoon';
    
  • 1
    и, к сожалению, никто не сделал этого. Я действительно смущен.
  • 34
    Вы перезапустили свой сервер?
Показать ещё 26 комментариев
33

Теперь вот поворот:

Вы должны поместить все шрифты в app/assets/fonts/, поскольку они WILL получают предварительно скомпилированные в стадии постановки и производства по умолчанию - они будут предварительно скомпилированы при нажатии на герою.

Файлы шрифтов, помещенные в vendor/assets, будут предварительно скомпилированы NOT при постановке или выпуске по умолчанию - они будут терпеть неудачу на heroku. Источник!

- @plapier, thinkbot/bourbon

Я твердо верю, что размещение шрифтов поставщика в vendor/assets/fontsдает гораздо больше смысла, чем помещать их в app/assets/fonts. С эти 2 строки дополнительной конфигурации это хорошо сработало для меня (on Rails 4):

app.config.assets.paths << Rails.root.join('vendor', 'assets', 'fonts')  
app.config.assets.precompile << /\.(?:svg|eot|woff|ttf)$/

- @jhilden, thinkbot/bourbon

Я также тестировал его на rails 4.0.0. На самом деле последней одной строки достаточно, чтобы безопасно прекомпилировать шрифты из папки vendor. Взял пару часов, чтобы понять это. Надеюсь, это помогло кому-то.

  • 2
    +1 edgeguides.rubyonrails.org/… объясняет расположение конвейера ресурсов и помогает понять, как это работает. Исправить по состоянию на 2014-07-04
  • 0
    Вам нужны оба из них? app.config.assets.paths << Rails.root.join('vendor', 'assets', 'fonts') app.config.assets.precompile << /\.(?:svg|eot|woff|ttf)$/ Комментарий к другому ответу говорит, что последний заботится об обоих.
Показать ещё 2 комментария
24

Если вы не хотите отслеживать перемещение шрифтов:

# Adding Webfonts to the Asset Pipeline
config.assets.precompile << Proc.new { |path|
  if path =~ /\.(eot|svg|ttf|woff)\z/
    true
  end
}
  • 1
    Я думаю, что это лучшее решение; если вы не создали шрифты, они, вероятно, принадлежат в / vendor / assets / fonts, а не в / app / assets / fonts. Этот подход решает для обоих, выше не
  • 5
    @Casey: это решение позволяет размещать шрифты внутри вендора / активов. @ Натан Колгейт: Это можно упростить до: config.assets.precompile << /\.(?:svg|eot|woff|ttf)$/
Показать ещё 7 комментариев
15

Вам нужно использовать font-url в блоке @font-face, а не url

@font-face {
font-family: 'Inconsolata';
src:font-url('Inconsolata-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}

а также эту строку в application.rb, как вы упомянули (для шрифтов в app/assets/fonts

config.assets.paths << Rails.root.join("app", "assets", "fonts")
  • 0
    вам также нужно включить прекомпиляцию для производства
  • 0
    В новом приложении rails 4.2 и src: url(someFont.ttf) и src: font-url(someFont.ttf) работали при наличии файлов в app/assets/fonts . У меня есть расширения .scss по умолчанию. Мне не нужно было добавлять в config.assets.paths.
6

Здесь мой подход к использованию шрифтов в конвейере активов:

1) Поместите весь файл шрифта под app/assets/fonts/, на самом деле вы не можете помечать его под именем fonts. Вы можете поместить любое имя вложенной папки, которое вам нравится. Например. app/assets/abc или app/assets/anotherfonts. Но я настоятельно рекомендую вам поставить его под app/assets/fonts/ для лучшей структуры папок.

2) Из вашего sass файла, используя sass helper font-path, чтобы запросить ваши свойства шрифта, подобные этому

@font-face {
    font-family: 'FontAwesome';
    src: url(font-path('fontawesome-webfont.eot') + '?v=4.4.0');
    src: url(font-path('fontawesome-webfont.eot') + '?#iefix&v=4.4.0') format('embedded-opentype'),
         url(font-path('fontawesome-webfont.woff2') + '?v=4.4.0') format('woff2'),
         url(font-path('fontawesome-webfont.woff') + '?v=4.4.0') format('woff'),
         url(font-path('fontawesome-webfont.ttf') + '?v=4.4.0') format('truetype'),
         url(font-path('fontawesome-webfont.svg') + '?v=4.4.0#fontawesomeregular') format('svg');
    font-weight: normal;
    font-style: normal;
}

3) Запустите bundle exec rake assets:precompile с вашего локального компьютера и посмотрите ваш результат application.css. Вы должны увидеть что-то вроде этого:

@font-face {
    font-family: 'FontAwesome';
    src: url("/assets/fontawesome-webfont-d4f5a99224154f2a808e42a441ddc9248ffe78b7a4083684ce159270b30b912a.eot" "?v=4.4.0");
    src: url("/assets/fontawesome-webfont-d4f5a99224154f2a808e42a441ddc9248ffe78b7a4083684ce159270b30b912a.eot" "?#iefix&v=4.4.0") format("embedded-opentype"), url("/assets/fontawesome-webfont-3c4a1bb7ce3234407184f0d80cc4dec075e4ad616b44dcc5778e1cfb1bc24019.woff2" "?v=4.4.0") format("woff2"), url("/assets/fontawesome-webfont-a7c7e4930090e038a280fd61d88f0dc03dad4aeaedbd8c9be3dd9aa4c3b6f8d1.woff" "?v=4.4.0") format("woff"), url("/assets/fontawesome-webfont-1b7f3de49d68b01f415574ebb82e6110a1d09cda2071ad8451bdb5124131a292.ttf" "?v=4.4.0") format("truetype"), url("/assets/fontawesome-webfont-7414288c272f6cc10304aa18e89bf24fb30f40afd644623f425c2c3d71fbe06a.svg" "?v=4.4.0#fontawesomeregular") format("svg");
    font-weight: normal;
    font-style: normal;
}

Если вы хотите узнать больше о том, как работает конвейер активов, вы можете посетить следующее простое руководство: https://designcode.commandrun.com/rails-asset-pipeline-simple-guide-830e2e666f6c#.6lejlayk2

4

У меня была проблема с Rails 4.2 (с ruby ​​2.2.3), и мне пришлось отредактировать частичное удаление шрифта _paths.scss, чтобы удалить ссылки на $fa-font-path и удалить ведущую косую черту. Было нарушено следующее:

@font-face {
  font-family: 'FontAwesome';
  src: font-url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
  src: font-url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
    font-url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),
    font-url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
    font-url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
    font-url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
  font-weight: normal;
  font-style: normal;
}

И следующие работы:

@font-face {
  font-family: 'FontAwesome';
  src: font-url('fontawesome-webfont.eot?v=#{$fa-version}');
  src: font-url('fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
    font-url('fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),
    font-url('fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
    font-url('fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
    font-url('fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
  font-weight: normal;
  font-style: normal;
}

Альтернативой может быть просто удалить косую черту после интерполированного $fa-font-path, а затем определить $fa-font-path как пустую строку или подкаталог с завершающей косой чертой (при необходимости).

Не забудьте перекомпилировать активы и перезагрузить сервер по мере необходимости. Например, при настройке пассажира:

prompt> rake assets:clean; rake assets:clobber
prompt> RAILS_ENV=production RAILS_GROUPS=assets rake assets:precompile
prompt> service passenger restart

Затем перезагрузите браузер.

4

Я использую Rails 4.2 и не могу получить значки, которые можно найти. Маленькие ящики показывали вместо (+) на свернутых строках и маленьких сортировочных стрелках, которые я ожидал. Изучив здесь информацию, я сделал одно простое изменение в моем коде: удалите каталог шрифтов в css. То есть, измените все записи css следующим образом:

src:url('fonts/footable.eot');

выглядеть следующим образом:

src:url('footable.eot');

Это сработало. Я думаю, что Rails 4.2 уже предполагает каталог шрифтов, поэтому его повторение в коде css делает файлы шрифтов не найдены. Надеюсь это поможет.

2

У меня была аналогичная проблема, когда я недавно обновил приложение Rails 3 до Rails 4. Мои шрифты не работали должным образом, как в Rails 4+, нам разрешено хранить шрифты в каталоге app/assets/fonts. Но у моего приложения Rails 3 была другая организация шрифтов. Поэтому мне пришлось настроить приложение так, чтобы оно все еще работало с Rails 4+ с моими шрифтами в другом месте, кроме app/assets/fonts. Я попробовал несколько решений, но после того, как нашел non-stupid-digest-assets gem, он просто сделал это очень легко.

Добавьте этот камень, добавив следующую строку в свой Gemfile:

gem 'non-stupid-digest-assets'

Затем запустите:

bundle install

И, наконец, добавьте следующую строку в файл config/initializers/non_digest_assets.rb:

NonStupidDigestAssets.whitelist = [ /\.(?:svg|eot|woff|ttf)$/ ]

Что это. Это решило мою проблему. Надеюсь, это поможет кому-то, кто столкнулся с подобной проблемой, такой как я.

1

В моем случае исходный вопрос использовал asset-url без результатов вместо обычного свойства url css. Использование asset-url закончилось для меня в Heroku. Плюс установка шрифтов в папку /assets/fonts и вызов asset-url('font.eot') без добавления в нее какой-либо вложенной папки или любой другой конфигурации.

1

Если у вас есть файл scaffolds.css.scss, тогда есть шанс, что переопределение всех пользовательских вещей, которые вы делаете в других файлах. Я прокомментировал этот файл и вдруг все сработало. Если в этом файле нет ничего важного, вы можете просто удалить его!

  • 0
    Спасибо!!! Чертовы леса
-5

просто разместите свои шрифты внутри папки app/assets/fonts и установите путь автозагрузки, когда приложение начнет использовать код в приложении .rb

config.assets.paths < Rails.root.join( "приложение", "активы", "шрифты" ) и

затем используйте следующий код в css.

@font-face {

 font-family: 'icomoon';
 src: asset-url('icomoon.eot');
 src: asset-url('icomoon.eot') format('embedded-opentype'),
      asset-url('icomoon.woff') format('woff'),
      asset-url('icomoon.ttf') format('truetype'),
      asset-url('icomoon.svg') format('svg');
 font-weight: normal;
 font-style: normal;

}

Попробуйте.

Спасибо

  • 0
    Как это добавляет что-то поверх существующих ответов?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню