Папка шрифтов Rails 5.2 в активах выдает ошибку 404 (не найдено)

В настоящее время я работаю над приложением Rails 5.2. Я установил пакет npm. В этом пакете есть папка fonts. В файле config/application.rb я настроил конвейер ресурсов, включив в него папку node_modules:

config.assets.paths << Rails.root.join('node_modules')

Это не сработало, и я все еще получаю следующее сообщение об ошибке на изображении ниже. Папка шрифтов Rails 5.2 в активах выдает ошибку 404 (не найдено)

Я получаю ошибку 404 (Not Found), но когда переместил папку fonts в папку assets. Папка шрифтов Rails 5.2 в активах выдает ошибку 404 (не найдено)

В прекомпиляции ассетов у меня следующая конфигурация:

Rails.application.config.assets.paths << Rails.root.join('node_modules')
Rails.application.config.assets.paths << Rails.root.join('node_modules/access-nyc-patterns/src/')
Rails.application.config.assets.precompile << /\.(?:svg|eot|woff|ttf)\z/

Когда я запускаю вывод всех имен путей в активах, отображается папка fonts. Почему не загружается папка fonts. Папка шрифтов Rails 5.2 в активах выдает ошибку 404 (не найдено)

В application.scss

// if @font-face is used it needs to be first imported first.
@import 'elements/fonts/fonts';

Почему отображается эта ошибка?

Как вы называете эти шрифты? Вы можете показать нам код?

Pavan 14.09.2018 18:21
// if @font-face is used it needs to be first imported first. @import 'elements/fonts/fonts';
Steven Aguilar 14.09.2018 18:25

Вам нужно получить к ним доступ, добавив полный путь относительно папки fonts. Ты сделал это?

Arup Rakshit 14.09.2018 20:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
1 466
2

Ответы 2

Итак, проблема началась с перехода к URL-адресу шрифтов. Эта статья в основном подтолкнула меня к добавлению веб-шрифты в конвейер ресурсов.

/**
 * Fonts
 */

// Dependencies
@import 'config/fonts';

@mixin font-face-all($name, $file, $weight: normal, $style: normal, $formats: ()) {
  @font-face {
    font-family: "#{$name}";
    src: url(asset-path('#{$file}.eot'));
    src: url(asset-path('#{$file}.eot?#iefix')) format('embedded-opentype'),
         url(asset-path('#{$file}.woff')) format('woff'),
         url(asset-path('#{$file}.woff2')) format('woff2'),
         url(asset-path('#{$file}.ttf')) format('truetype');
    font-weight: $weight;
    font-style: $style;
  }
}

@mixin font-face-otf($name, $file, $weight: normal, $style: normal, $formats: ()){
  @font-face {
    font-family: "#{$name}";
    src: url(asset-path('#{$file}.otf')) format('embedded-opentype');
    font-weight: $weight;
    font-style: $style;
  }
}

@mixin font-face-ttf($name, $file, $weight: normal, $style: normal, $formats: ()){
  @font-face {
    font-family: "#{$name}";
    src: url(asset-path('#{$file}.ttf')) format('truetype');
    font-weight: $weight;
    font-style: $style;
  }
}

При стилизации веб-страниц часто используются темы, доступные в Интернете. Часто эти темы поставляются с настраиваемыми шрифтами, для которых требуется источник шрифта. Ат-правило CSS @ font-face позволяет указывать пользовательские шрифты в CSS. Шрифт можно загрузить либо с удаленного сервера, либо с локально установленного шрифта на собственном компьютере пользователя. Чтобы предоставить шрифт с удаленного сервера, вы должны указать ресурс шрифта в функции url (), которая будет загружать и использовать шрифты. Если вы внимательно ознакомитесь с правилом @ font-face, предоставленным данной темой, оно будет выглядеть примерно так:

@font-face {
  font-family: 'Material-Design-Iconic-Font';
  src: url('../fonts/Material-Design-Iconic-Font.woff2?v=2.2.0') format('woff2'), url('../fonts/Material-Design-Iconic-Font.woff?v=2.2.0') format('woff'), url('../fonts/Material-Design-Iconic-Font.ttf?v=2.2.0') format('truetype');
  font-weight: normal;
  font-style: normal;
}

Приведенное выше правило CSS, скорее всего, вызовет код состояния 404 в браузере, поскольку клиент пытается загрузить файлы с вашего сервера, используя неправильный путь. '../font/' просто переходит на один каталог вверх от текущего и ищет каталог шрифтов. Если вы используете Rails Assets Pipeline, это не сработает. Независимо от того, работаете ли вы в производственной среде или в среде разработки, если вы используете конвейер ресурсов, Rails будет искать ресурсы в каталоге ресурсов. Теперь в рабочей среде, если вы запустите assets: precompile, то ресурсы будут предварительно скомпилированы в общедоступный каталог, и все, что находится в общедоступном каталоге, будет иметь приоритет над чем-либо в самом приложении. Вы определенно хотите, чтобы ваши активы были предварительно скомпилированы в производственной среде, чтобы ресурсы могли быстро обслуживаться вашим веб-сервером, а не попадать в стэк Rails.

В Rails ActionView есть ActionView :: Helpers :: AssetUrlHelper, который предоставляет несколько помощников, чтобы вы могли легко ссылаться на свои активы: asset_path, font_path, image_path, video_path и т. д. Теперь внутри файла CSS или файла SCSS вы, очевидно, не можете используйте вспомогательные методы Rails, поскольку они определены в сценариях ruby. Следовательно, Sprockets (центр разработки Assets Pipeline) предоставляет функции SASS, которые вы могли бы использовать в самом скрипте CSS или SCSS, например, функцию asset-path, как показано в документации:

background: url(asset-path("image.jpg"));                // background: url("/assets/image.jpg");
background: url(asset-path("image.jpg", $digest: true)); // background: url("/assets/image-27a8f1f96afd8d4c67a59eb9447f45bd.jpg");

Теперь, если вы не используете SASS или не хотите использовать функции SASS, вы можете напрямую ссылаться на путь к ресурсам:

background: url("/assets/image.jpg");
background: url("/assets/image-27a8f1f96afd8d4c67a59eb9447f45bd.jpg");

Итак, в случае @ font-family at-rule, вы бы изменили источник на что-то вроде этого:

src: url('/assets/Material-Design-Iconic-Font.woff2?v=2.2.0') format('woff2'), url('/assets/Material-Design-Iconic-Font.woff?v=2.2.0') format('woff'), url('/assets/Material-Design-Iconic-Font.ttf?v=2.2.0') format('truetype');

ИЛИ:

src: url('asset-path(Material-Design-Iconic-Font.woff2?v=2.2.0') format('woff2'), url('asset-path(Material-Design-Iconic-Font.woff?v=2.2.0') format('woff'), url('asset-path(Material-Design-Iconic-Font.ttf?v=2.2.0') format('truetype');

Другие вопросы по теме