Я не могу загружать шрифты в свое приложение Rails 4 в процессе производства, он работает нормально в разработке.
Активы предварительно скомпилированы на сервере при развертывании.
У меня есть мои шрифты в
app/assets/fonts
My app.css:
@font-face {
font-family: 'WalkwayBoldRegular';
src: url('Walkway_Bold-webfont.eot');
src: url('Walkway_Bold-webfont.eot?#iefix') format('embedded-opentype'),
url('Walkway_Bold-webfont.woff') format('woff'),
url('Walkway_Bold-webfont.ttf') format('truetype'),
url('Walkway_Bold-webfont.svg#WalkwayBoldRegular') format('svg');
font-weight: normal;
font-style: normal;
}
В моем production.rb у меня есть:
config.assets.precompile << Proc.new { |path|
if path =~ /\.(eot|svg|ttf|woff)\z/
true
end
}
Ответ 1
У нас была эта проблема на прошлой неделе - проблема в том, что ваши активы будут скомпилированы, чтобы на них были хэши MD5, в то время как ваш стандартный CSS все равно будет искать свои "стандартные" имена. Это проблема с изображениями и шрифтами.
@font-face {
font-family: 'akagi';
src: asset_url('fonts/akagi-th-webfont.eot');
src: asset_url('fonts/akagi-th-webfont.eot?#iefix') format('embedded-opentype'),
asset_url('fonts/akagi-th-webfont.woff') format('woff'),
asset_url('fonts/akagi-th-webfont.ttf') format('truetype'),
asset_url('fonts/akagi-th-webfont.svg#akagithin') format('svg');
font-weight: 300;
font-style: normal;
}
Это пример того, как вы должны использовать scss файлы для динамического загрузки активов. Эти файлы скомпилированы (либо до нажатия, либо во время инициализации) в ваши .css файлы, все из которых правильно синхронизированы.
У нас была схожая проблема с Heroku, и мне удалось заставить ее работать, помещая наши файлы в /stylesheets/layout/fonts.css.scss, а затем вызывая
@import '/layout/fonts';
Мы также вызвали наш application.css → application.css.scss для поддержки функции @import
Ответ 2
Вот общий способ устранения этой проблемы для любой библиотеки.
Воспроизводить ошибку на локальном
Переопределить семейство шрифтов
-
application.css
необходимо переименовать в application.scss
, так как asset-url
будет использоваться
-
Добавьте шрифты, чтобы предварительно скомпилировать файл config/initializers/assets.rb
:
Rails.application.config.assets.precompile << /\.(?:svg|eot|woff|ttf)$/
-
Посмотрите определение лица шрифта внутри вашей библиотеки CSS и скопируйте его на application.scss
. Это должно быть что-то вроде:
@font-face {
font-family: 'my-library';
src: url('../fonts/my-library.eot');
src:
url('../fonts/my-library.eot?#iefix') format('embedded-opentype'),
url('../fonts/my-library.woff2') format('woff2'),
url('../fonts/my-library.ttf') format('truetype'),
url('../fonts/my-library.woff') format('woff'),
url('../fonts/my-library.svg?#my-library') format('svg');
font-weight: normal;
font-style: normal;
}
-
Изменить на:
@font-face {
font-family: 'my-library';
src: asset-url('my-library/fonts/my-library.eot');
src:
asset-url('my-library/fonts/my-library.eot?#iefix') format('embedded-opentype'),
asset-url('my-library/fonts/my-library.woff2') format('woff2'),
asset-url('my-library/fonts/my-library.ttf') format('truetype'),
asset-url('my-library/fonts/my-library.woff') format('woff'),
asset-url('my-library/fonts/my-library.svg?#my-library') format('svg');
font-weight: normal;
font-style: normal;
}
Какие изменения были внесены
- Используйте
asset-url
вместо url
- Измените
../fonts
или похожи на путь, который понимает asset-url
.
Какой путь использовать атрибут-ресурс
Чтобы узнать, какой путь asset-url
понимает, перейдите к консоли rails и введите Rails.application.assets.paths
. Вы получите что-то вроде:
[
'/path/1',
'/path/2',
'/path/3',
]
Если ваши шрифты находятся на /path/2/my-library/fonts/
, то используйте
asset-url('my-library/fonts/my-library.eot')
.
то есть. Вы удаляете путь, найденный на Rails.application.assets.paths
.
Проверьте, что вы написали правильный путь
В консоли Rails при разработке:
helper.asset_url('my-library/fonts/my-library.eot')
Должен вернуться:
"/assets/my-library/fonts/my-library-2517b97e2c0e1e6c8ceb9dd007015f897926bc504154137281eec4c1a9f9bdc9.eot"
Обратите внимание на завершающий /assets/
и дайджест в последней части.
Ответ 3
1: - Храните все ваши шрифты в папке приложений/активов/шрифтов.
2: - После использования rake: precompile RAILS_ENV = production все ваши шрифты будут предварительно скомпилированы в папку public/assets с дайджестом.
3: - Вместо использования src: url ('fontname.eot') используйте src: font_url ('fontname.eot') в scss файлах.