Рельсы 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 104

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. предварительная компиляция активов.
  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.