Атрибуты шрифтов Heroku не работают
Размещенные шрифты в app/assets/fonts
Добавлен
Add the fonts path
config.assets.paths << Rails.root.join('app', 'assets', 'fonts')
Precompile additional assets
config.assets.precompile += %w( .svg .eot .woff .ttf )
в production.rb и development.rb
Шрифты, связанные в css как:
@font-face {
font-family: 'Icomoon';
src:url('/assets/icomoon.eot');
src:url('/assets/icomoon.eot?#iefix') format('embedded-opentype'),
url('/assets/icomoon.svg#icomoon') format('svg'),
url('/assets/icomoon.woff') format('woff'),
url('/assets/icomoon.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
Кажется, нужно работать в разработке. Но в HEROKU, похоже, не работает. Он не может найти /assets/icomoon.eot.
Решение в этой ссылке, похоже, не работает
Использование шрифтов с конвейером Rails
Ответы
Ответ 1
Активы, подобные шрифтам, будут работать на разработку, но не на производство, если вы используете обычный старый CSS для поиска ваших активов, а не для помощников по конвейеру активов. Rails 4 добавила изменения в конвейер активов, чтобы побудить людей использовать его должным образом, а не использовать старый метод привязки ресурсов css.
Чтобы решить эту проблему, вам нужно использовать помощники конвейеров нового ресурса, чтобы указать на кешированные версии ваших шрифтов с отпечатками пальцев. Вместо url
(который не использует конвейер активов) вам нужно использовать font-url
(который его использует). Для этого вам может понадобиться использовать Sass или встроить ERB в таблицу стилей.
Пример (с использованием SCSS):
@font-face {
font-family: 'Icomoon';
src: font-url("/assets/icomoon.eot");
src: font-url("/assets/icomoon.eot?#iefix") format("embedded-opentype"), font-url("/assets/icomoon.svg#icomoon") format("svg"), font-url("/assets/icomoon.woff") format("woff"), font-url("/assets/icomoon.ttf") format("truetype");
font-weight: normal;
font-style: normal;
}
Смотрите здесь: http://guides.rubyonrails.org/asset_pipeline.html#coding-links-to-assets
Ответ 2
В свете комментариев, полученных по этому ответу (и ненужных downvotes), я внесла поправки в свой ответ следующим образом:
Кажется, Rails теперь создал способ обработки шрифтов в папке с ресурсами. Он называется font-path
и работает следующим образом:
Если вы добавите специальный шрифт в папку /assets/fonts, вы можете использовать font-path
для доступа к файлам внутри. Затем это можно использовать в ваших таблицах стилей и других активах с помощью помощника font-path
:
|-app/
|---assets/
|-----fonts/
|-----images/
|-----javascripts/
|-----stylesheets/
@font-face {
font-family:'icofonts';
src:font-url('icofonts.eot');
src:font-url('icofonts.eot?#iefix') format('embedded-opentype'),
...
}
Это работает для предварительно скомпилированных активов (что в любом случае Heroku) и статических активов. Если вы хотите, чтобы пре-Rails 4 мог достичь этого, обратитесь к моему ответу ниже:
У нас есть шрифты, работающие на Heroku здесь: http://firststop.herokuapp.com (он еще в демо)
Вот наш CSS для него:
#assets/application.css
/*-- Akagi Font --*/
@font-face {
font-family: 'akagi';
src: url('fonts/akagi-th-webfont.eot'),
src: url('fonts/akagi-th-webfont.eot?#iefix') format('embedded-opentype'),
url('fonts/akagi-th-webfont.woff') format('woff'),
url('fonts/akagi-th-webfont.ttf') format('truetype'),
url('fonts/akagi-th-webfont.svg#akagithin') format('svg');
font-weight: 300;
font-style: normal;
}
@font-face {
font-family: 'akagi';
src: url('fonts/akagi-bk-webfont.eot');
src: url('fonts/akagi-bk-webfont.eot?#iefix') format('embedded-opentype'),
url('fonts/akagi-bk-webfont.woff') format('woff'),
url('fonts/akagi-bk-webfont.ttf') format('truetype'),
url('fonts/akagi-bk-webfont.svg#akagibook') format('svg');
font-weight: 400;
font-style: normal;
}
@font-face {
font-family: 'akagi';
src: url('fonts/akagi-sb-webfont.eot');
src: url('fonts/akagi-sb-webfont.eot?#iefix') format('embedded-opentype'),
url('fonts/akagi-sb-webfont.woff') format('woff'),
url('fonts/akagi-sb-webfont.ttf') format('truetype'),
url('fonts/akagi-sb-webfont.svg#akagisemibold') format('svg');
font-weight: 500;
font-style: normal;
}
Мы помещаем наши шрифты в /stylesheets/fonts folder
Мы просто делаем стандартный материал precompile fonts, чтобы заставить CSS работать на Heroku, и он работает. Я подозреваю, что ваши пути неверны. Возможно, попробуйте переместить свой каталог шрифтов в папку/assets/stylesheets:)
Ответ 3
Собственно, я просто попробовал решение, предложенное в этом comment, и оно отлично работало. Кажется, вам нужно только изменить регулярное выражение для команды precompile, чтобы Heroku правильно нашел этот актив.
то есть. измените config.assets.precompile += %w( .svg .eot .woff .ttf )
на config.assets.precompile << /\.(?:svg|eot|woff|ttf)$/
.
Изменить. Также может потребоваться добавить RAILS_ENV=production
при выполнении задачи rake assets:precompile
, согласно документам Heroku.
Ответ 4
Попробуйте удалить /assets/
со всех ваших путей к шрифтам.
@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;
}
Также попробуйте удалить scaffolds.css
, если он находится в assets/stylesheets
.
Ответ 5
Я решил проблему, используя комбинацию всех ответов и комментариев. В моем примере используются значки шрифтов Foundation.
В вашем файле application.rb
добавьте следующее:
config.assets.precompile << /\.(?:svg|eot|woff|ttf)$/
Переименуйте файл application.css
в application.css.scss
и используйте директивы font-url
и asset-path
:
@font-face {
font-family: "foundation-icons";
src: font-url( asset-path("foundation-icons.eot") );
src: font-url( asset-path("foundation-icons.eot?#iefix") ) format("embedded-opentype"),
font-url( asset-path("foundation-icons.woff") ) format("woff"),
font-url( asset-path("foundation-icons.ttf") ) format("truetype"),
font-url( asset-path("foundation-icons.svg#fontcustom") ) format("svg");
font-weight: normal;
font-style: normal;
}
Ответ 6
Рельсы 4
# config/application.rb
config.assets.paths << Rails.root.join("app", "assets", "fonts")
config.assets.precompile += %w(.svg .eot .woff .ttf)
# app/assets/stylesheets/foundation-icons.css.scss
@font-face {
font-family: "foundation-icons";
src: asset-url("foundation-icons.eot");
src: asset-url("foundation-icons.eot?#iefix") format("embedded-opentype"),
asset-url("foundation-icons.woff") format("woff"),
asset-url("foundation-icons.ttf") format("truetype"),
asset-url("foundation-icons.svg#fontcustom") format("svg");
font-weight: normal;
font-style: normal;
}
Ответ 7
- Переименуйте файл .css в .css.erb
- Замените все
url('/assets/icomoon.eot')
на url(<%= asset_path 'icomoon.eot' %>)
и т.д.
Вы можете добиться того же результата, преобразовывая свой файл css в SASS/SCSS и используя font-url()
помощник вместо url()
.
Я пробовал это с Rails 4, и он работает даже без битов, которые вы добавили в production.rb/application.rb.
Ответ 8
Вам не нужно включать каталог /assets/fonts/
в config.assets.paths
. Согласно документации все каталоги, включенные в app/assets
, lib/assets
или vendor/assets
, автоматически загружаются.
http://guides.rubyonrails.org/asset_pipeline.html#asset-organization
Активы трубопровода могут быть размещены внутри приложения в одном из трех местоположений: app/assets
, lib/assets
или vendor/assets
.
[...]
Помимо стандартных путей assets/*
в конвейер можно добавить дополнительные (полностью квалифицированные) пути в config/application.rb
.
config.assets.paths << Rails.root.join("lib", "videoplayer", "flash")
Попробуйте запустить Rails.application.class.config.assets.paths
в консоли, и вы увидите массив всех каталогов внутри /assets
. если вы добавите другой каталог и перезапустите консоль, он будет автоматически включен внутри массива, и контент будет использоваться как активы.
Вам даже не нужно config.assets.precompile += %w( .svg .eot .woff .ttf )
, потому что все файлы, отличные от js-css, уже включены через стандартный соединитель Proc.
http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets
Соединитель по умолчанию для компиляции файлов включает файлы application.js, application.css и все файлы, отличные от JS/CSS (это будет автоматически включать все изображения):
[ Proc.new { |path| !%w(.js .css).include?(File.extname(path)) }, /application.(css|js)$/ ]
Попробуйте добавить только каталог шрифтов в app/assets/
, оставив всю конфигурацию по умолчанию и развернув приложение на heroku.
Ответ 9
На самом деле вам не нужно менять прекомпилировать регулярное выражение или путь к ресурсу.
Попробуйте запустить рейк-активы: предварительно скомпилируйте их в режиме производства, прежде чем отправиться в Хероку.
rake assets:precompile RAILS_ENV=production
и обязательно ссылайтесь на свои ресурсы в файлах css с помощью asset_path
вспомогательного метода.
как:
src: font-url('<%= asset_path("foundation-icons.eot")%>');