Рельсы 4: активы не загружаются в производство
Я пытаюсь поместить свое приложение в производство, а пути к изображениям и css-ресурсам не работают.
вот что я сейчас делаю:
- активы изображения видео в /приложение/активов/изображения/Изображения.jpg
- таблицы стилей живут в /приложение / активы / таблицы стилей / стиль.css
- в моем макете я ссылаюсь на файл css следующим образом:
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
- перед перезапуском unicorn я запускаю
RAILS_ENV=production bundle exec rake assets:precompile
и это удается, и я вижу отпечатки пальцев файлы в
18 ответов:
в rails 4 вам нужно внести следующие изменения:
config.assets.compile = true config.assets.precompile = ['*.js', '*.css', '*.css.erb']
это работает со мной. используйте следующую команду для предварительной компиляции активов
RAILS_ENV=production bundle exec rake assets:precompile
удачи!
у меня была такая же проблема, и я нашел этот параметр в config/environments/production.РБ:
# Rails 4: config.serve_static_assets = false # Or for Rails 5: config.public_file_server.enabled = false
изменение его
true
он работает. Кажется, по умолчанию Rails ожидает, что вы настроили свой интерфейсный веб-сервер для обработки запросов на файлы из общей папки вместо их проксирования в приложение Rails. Возможно, вы сделали это для ваших файлов javascript, но не для ваших таблиц стилей CSS?( смотрите документацию Rails 5). Как уже отмечалось в комментариях, с Rails 5 Вы можете просто установить
RAILS_SERVE_STATIC_FILES
переменная окружения, так как значение по умолчаниюconfig.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
.
на
/config/environments/production.rb
Я должен был добавить это:Rails.application.config.assets.precompile += %w( *.js ^[^_]*.css *.css.erb )
The .js уже был предварительно скомпилирован, но я все равно добавил его. Этот.css и .стиль CSS.erb, по-видимому, не происходит автоматически. Элемент
^[^_]
исключает частичные выражения из компиляции -- это регулярное выражение.немного расстраивает то, что в документах четко указано, что конвейер активов включен по умолчанию, но не уточняет тот факт, что применяется только к javascripts.
я смог решить эту проблему, изменив:
config.assets.compile = false
доconfig.assets.compile = true
in/config/environments/production.rb
Обновление (24 Июня 2018 Года): этот метод создает уязвимость системы безопасности если версия используемых звездочек меньше 2.12.5, 3.7.2 или 4.0.0.beta8
для Rails 5, Вы должны включить следующий код конфигурации:
config.public_file_server.enabled = true
по умолчанию Rails 5 поставляется с этой строкой конфигурации:
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
следовательно, вам нужно будет установить переменную окружения
RAILS_SERVE_STATIC_FILES
в true.
есть 2 вещи, которые вы должны выполнить, чтобы служить активы в производстве:
- предварительная компиляция активов.
- обслуживать активы на сервере в браузере.
1) для того, чтобы предварительно скомпилировать активы, у вас есть несколько вариантов.
вы можете запустить
rake assets:precompile
на локальном компьютере зафиксируйте его в системе управления исходным кодом (git), затем запустите программу развертывания, например capistrano. Это не очень хороший способ совершить предкомпилированного активов СКМ.вы можете написать грабли задачу, которая работает
RAILS_ENV=production rake assets:precompile
на целевых серверах каждый раз, когда вы развертываете приложение Rails в производство, перед перезагрузкой сервера.код в задаче для capistrano будет выглядеть примерно так:
on roles(:app) do if DEPLOY_ENV == 'production' execute("cd #{DEPLOY_TO_DIR}/current && RAILS_ENV=production rvm #{ruby_string} do rake assets:precompile") end end
2) Теперь, у вас есть активы, на производственных серверах, Вам нужно обслуживать их в браузере.
опять же, у вас есть несколько выбор.
включить статический файл Rails, служащий в config / environments / production.РБ
config.serve_static_assets = true # old or config.serve_static_files = true # new
использование Rails для обслуживания статических файлов убьет производительность вашего приложения Rails.
настройка nginx (или Apache) для обслуживания статических файлов.
например, мой nginx, который был настроен для работы с Puma, выглядит так:
location ~ ^/(assets|images|fonts)/(.*)$ { alias /var/www/foster_care/current/public//; gzip on; expires max; add_header Cache-Control public; }
Rails 4 больше не создает непечатаемую версию ресурса: таблицы стилей/стиль.css не будет создан для вас.
Если вы используете
stylesheet_link_tag
тогда будет создана правильная ссылка на вашу таблицу стилейкроме того
styles.css
должно бытьconfig.assets.precompile
это список вещей, которые предварительно скомпилированы
измените свою продукцию.RB file line
config.assets.compile = false
на
config.assets.compile = true
, а также добавить
config.assets.precompile = ['*.js', '*.css', '*.css.erb']
Я Ubuntu Server 14.04,Руби 2.2.1 и рельсы 4.2.4 Я следил за развертыванием turorial от DigitalOcean и все прошло хорошо, но когда я иду в браузер и ввести IP-адрес моего VPS мое приложение загружается, но без стилей и javascript.
приложение работает с Единорог и Nginx. Чтобы исправить эту проблему, я ввел свой сервер с помощью SSH с моим пользователем 'deployer' и перейти к моему пути приложения, который является ' / home / deployer / apps / blog' и выполните следующую команду:
RAILS_ENV=production bin/rake assets:precompile
затем я просто перезапускаю VPS и все! Это работает для меня!
надеюсь, что это может быть полезно для кого-то еще!
Если precompile установлен вам не нужно
config.assets.compile = true
как это служить активы, жить.
наша проблема заключалась в том, что у нас была только база секретных ключей разработки, установленная в
config/secrets.yml
development: secret_key_base: '83d141eeb181032f4070ae7b1b27d9ff'
нужна запись для производственной среды
что вы не должны делать:
некоторые из моих коллег выше рекомендовали вам сделать это:
config.serve_static_assets = true ## DON”T DO THIS!! config.public_file_server.enabled = true ## DON”T DO THIS!!
трубопровод Rails asset говорит о вышеуказанном подходе:
этот режим использует больше памяти, работает хуже, чем по умолчанию и не рекомендуется. Смотрите здесь: (http://edgeguides.rubyonrails.org/asset_pipeline.html#live-compilation)
что вы должны сделать:
1. Предварительно скомпилируйте свои активы.
RAILS_ENV=production rake assets:precompile
2. Добавьте эти файлы в git.
git add –all
3. На Heroku.
git push origin master
сопоставитель по умолчанию для компиляции файлов включает приложение.js, приложение.css и все не-JS / CSS файлы (это будет включать все активы изображения автоматически) из папок приложения / активов, включая ваши драгоценные камни:
Если у вас есть другие манифесты или отдельные таблицы стилей и файлы JavaScript для включения, вы можете добавить их в массив предварительной компиляции в файл config/инициализаторы/активы.РБ:
Rails.application.config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js']
http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets
нашел это:
параметр конфигурации
config.serve_static_assets
переименован вconfig.serve_static_files
чтобы прояснить свою роль.на
config/environments/production.rb
:# Disable serving static files from the `/public` folder by default since # Apache or NGINX already handles this. config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?
Итак, установите env
RAILS_SERVE_STATIC_FILES
или черезNginx
для обслуживания статических файлов. Добавитьconfig.serve_static_assets = true
все равно будет работать, но удален в будущем.
прежде всего проверьте свои активы, возможно, есть какая-то ошибка в предварительной компиляции активов.
для предварительной компиляции активов в production ENV выполните следующую команду:
RAILS_ENV=production rake assets:precompile
если он показывает ошибку, удалите ее сначала,
в случае ошибки" неопределенная переменная " загрузите этот переменный файл перед его использованием в другом файле.
пример:
@import "variables"; @import "style";
в приложения.последовательность набора файлов rb предварительной компиляции активы
пример:
config.assets.precompile += [ 'application.js', 'admin.js', 'admin/events.js', 'admin/gallery.js', 'frontendgallery.js'] config.assets.precompile += [ 'application.css', 'admin.css','admin/events.css', 'admin/gallery.css', 'frontendgallery.css']
Я могу ошибаться, но те, кто рекомендует изменить
config.assets.compile = true
комментарий к этой строке гласит: #Не возвращайтесь к конвейеру активов, если предварительно скомпилированный актив пропущен.
это говорит о том, что, установив это значение true, вы не исправляете проблему, а скорее обходите ее и запускаете конвейер каждый раз. Это, безусловно, должно убить вашу производительность и победить цель трубопровода?
У меня была эта же ошибка, и это было связано с приложение работает в подпапке, о которой rails не знал.
Итак, мой css-файл находится в домашней / подпапке / app/public/.... но rails искал в home / app/public/...
попробуйте либо переместить приложение из подпапки, либо сообщить rails, что оно находится в подпапке.
не рекомендуется позволять capistrano делать предварительную компиляцию активов, потому что это может занять годы и часто тайм-аут. попробуйте выполнить предварительную компиляцию локальных ресурсов.
1-й, установите в config / application.рубидий
config.assets.initialize_on_precompile = false
затемRAILS_ENV=production bin/rake assets:precompile
и добавьте эти публичные / активы в git.и config / environments / development.rb, измените свой путь к активу, чтобы избежать использования предварительно скомпилированных активов:
config.assets.prefix = '/dev-assets'
если у вас есть проблема с подключением к БД, значит, у вас есть инициализатор, который использует БД. один из способов обойти это-установить новую среду путем дублирования производства.РБ как может production2.РБ, и в базе данных.yml, добавить production2 среда с развитие настройки БД. тогда сделай
RAILS_ENV=production2 bin/rake assets:precompile
если вы все еще сталкиваетесь с некоторыми проблемами с активами, например ckeditor, добавить файл JS в файл config/инициализаторы/активы.РБ
Rails.application.config.assets.precompile += %w( ckeditor.js )
location ~ ^/assets/ { expires 1y; add_header Cache-Control public; add_header ETag ""; }
это исправило проблему для меня в производстве. Поместите его в конфигурацию nginx.
даже мы столкнулись с той же проблемой, где
RAILS_ENV=production bundle exec rake assets:precompile
удалось, но все получилось не так, как ожидалось.
Мы обнаружили, что единорог был главным виновником здесь.Так же, как и в вашем случае, даже мы использовали для перезапуска unicorn после компиляции активов. Было замечено, что при перезапуске unicorn перезапускаются только его рабочие процессы, а не главный процесс.
Это основная причина, по которой правильные активы не обслуживаются.позже, после компиляции активов, мы остановились и запустил unicorn, чтобы процесс Unicorn master также был перезапущен, и правильные активы обслуживались.
Остановка и запуск unicorn приносит около 10 секунд простоя по сравнению с перезапуском unicorn. Это обходной путь, который может быть использован, где в качестве долгосрочного решения является переход к puma от unicorn.