Я пытаюсь запустить свое приложение в производство, а пути к изображениям и CSS не работают.
Вот что я сейчас делаю:
- Ресурсы изображений находятся в /app/assets/images/image.jpg
- Таблицы стилей находятся в /app/assets/stylesheets/style.css
- В моем макете я ссылаюсь на файл css следующим образом:
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
- Перед перезапуском единорога я запускаю,
RAILS_ENV=production bundle exec rake assets:precompile
он успешно работает, и я вижу файлы с отпечатками пальцев вpublic/assets
каталоге.
Когда я захожу на свой сайт, я получаю сообщение об ошибке 404: не найдено mysite.com/stylesheets/styles.css
.
Что я делаю не так?
Обновление: в моем макете это выглядит так:
<%= stylesheet_link_tag "bootstrap.min", media: "all", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
Источник генерации следующий:
<link data-turbolinks-track="true" href="/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/stylesheets/styles.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/application-0c647c942c6eff10ad92f1f2b0c64efe.js"></script>
Похоже, что Rails неправильно ищет скомпилированные файлы css. Но очень сбивает с толку, почему он правильно работает для javascripts (обратите внимание на /assets/****.js
путь).
ruby-on-rails
ruby
asset-pipeline
ruby-on-rails-4
emersonthis
источник
источник
stylesheet_link_tag
.<%= stylesheet_link_tag "style", media: "all", "data-turbolinks-track" => true %>
public/assets
и 2. дважды проверить, нет ли где-нибудь другой инструкции, пытающейся загрузить этот файл css (предположительно жестко запрограммированный).home {background: #FFF url(<%= image_path 'hippopotamus.jpg' %>) no-repeat; }
самом деле можно заменить в звездочке на.home {background: #FFF url(image-path('hippopotamus.jpg')) no-repeat; }
. Может быть, вы можете попробовать, если это поможет.Ответы:
В рельсах 4 вам необходимо внести следующие изменения:
Это работает со мной. используйте следующую команду для предварительной компиляции активов
Удачи!
источник
config.serve_static_files
и настроить псевдоним в Apache и nginx для работыassets
.У меня была такая же проблема, и я нашел этот параметр в config / environment / production.rb:
Меняем его, чтобы
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.serve_static_assets
был переименован в,config.serve_static_files
чтобы уточнить его роль (он просто позволяет обслуживать все вpublic
папке и не имеет отношения к конвейеру ресурсов).serve_static_assets
Псевдоним будет удален в Rails 5.0. Пожалуйста, перенесите ваши файлы конфигурации соответствующим образом.config.serve_static_files
в Rails 4.2, иconfig.public_file_server.enabled
в Rails 5 . @see github.com/heroku/rails_serve_static_assets/blob/master/lib/…config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
поэтому вы можете установить это по-другому для своей среды, не изменяя код, который зарегистрирован в вашем SCM.В
/config/environments/production.rb
я должен был добавить следующее:.Js уже был предварительно скомпилирован, но я все равно добавил его. Очевидно, что .css и .css.erb не происходят автоматически. В
^[^_]
исключает обертоны из компилируются - это регулярное выражение.Немного расстраивает то, что в документации четко указано, что конвейер ресурсов включен по умолчанию, но не разъясняется тот факт, что это относится только к javascripts.
источник
Мне удалось решить эту проблему, изменив:
config.assets.compile = false
наconfig.assets.compile = true
в/config/environments/production.rb
Обновление (24 июня 2018 г.) : этот метод создает уязвимость системы безопасности, если используемая вами версия Sprockets меньше 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.источник
passenger_env_var RAILS_SERVE_STATIC_FILES true;
блок местоположения моего приложения в моем файле nginx.conf.Чтобы задействовать ресурсы в производстве, необходимо выполнить 2 вещи:
1) Для предварительной компиляции ресурсов у вас есть несколько вариантов.
Вы можете запустить его
rake assets:precompile
на своем локальном компьютере, передать его в систему управления исходным кодом (git), а затем запустить программу развертывания, например capistrano. Это не лучший способ фиксировать предварительно скомпилированные ресурсы в SCM.Вы можете написать задачу rake, которая будет запускаться
RAILS_ENV=production rake assets:precompile
на целевых серверах каждый раз, когда вы развертываете приложение Rails в производственной среде , перед перезапуском сервера.Код в задаче для capistrano будет выглядеть примерно так:
2) Теперь у вас есть ресурсы на производственных серверах, и вам нужно передать их браузеру.
Опять же, у вас есть несколько вариантов.
Включите обслуживание статических файлов Rails в config / environment / production.rb
Использование Rails для обслуживания статических файлов убьет производительность вашего приложения Rails.
Настройте nginx (или Apache) для обслуживания статических файлов.
Например, мой nginx, настроенный для работы с Puma, выглядит так:
источник
Rails 4 больше не генерирует версию ресурса без отпечатков пальцев: таблицы стилей / style.css не будут созданы для вас.
Если вы используете,
stylesheet_link_tag
то будет сгенерирована правильная ссылка на вашу таблицу стилей.Кроме того,
styles.css
должен бытьconfig.assets.precompile
список вещей, которые предварительно скомпилированыисточник
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
Это неправильно? `<link data-turbolinks-track="true" href="https://stackoverflow.com/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
Но файлы javascript верны! Я не понимаю, почему одни и те же конфигурации работают для файлов .js, но не для .css.serve_static_files
устарело и будет удалено в Rails 5.1. Пожалуйста, используйтеpublic_file_server.enabled = true
вместо этого.404
. Вы разрешили это?измените строку файла Production.rb
в
а также добавить
источник
Я использую Ubuntu Server 14.04 , Ruby 2.2.1 и Rails 4.2.4. Я следил за инструкцией по развертыванию от DigitalOcean. и все прошло хорошо, но когда я в браузер и ввожу IP-адрес своего VPS, мое приложение загружается, но без стили и javascript.
Приложение работает с Unicorn и Nginx . Чтобы решить эту проблему, я вошел на свой сервер с помощью SSH с моим пользовательским «развертывателем» и перешел по пути к моему приложению «/ home / deployer / apps / blog» и запустил следующую команду:
Затем я просто перезапускаю VPS и все! Меня устраивает!
Надеюсь, это может быть полезно для кого-то еще!
источник
Если установлена предварительная компиляция, вам НЕ нужно
поскольку это для обслуживания активов вживую.
Наша проблема заключалась в том, что у нас была только база секретных ключей разработки, установленная в
config/secrets.yml
Требуется вход в производственную среду
источник
config.assets.precompile = ['*.js', '*.css', '*.css.erb']
и для запускаRAILS_ENV=production bundle exec rake assets:precompile
Чего НЕ СЛЕДУЕТ делать:
Некоторые из моих коллег выше рекомендовали вам это сделать:
Конвейер активов рельсов говорит о вышеупомянутом подходе:
Что ты должен делать:
Предварительно скомпилируйте свои активы.
RAILS_ENV=production rake assets:precompile
Вероятно, вы сможете сделать это с помощью задачи с граблями.
источник
http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets
источник
Прежде всего проверьте свои активы, возможно, есть какая-то ошибка при предварительной компиляции активов.
Чтобы предварительно скомпилировать активы в производственной среде ENV, выполните эту команду:
Если отображается ошибка, сначала удалите ее,
В случае ошибки «неопределенная переменная» загрузите этот файл переменных перед использованием его в другом файле.
пример:
в файле application.rb задайте последовательность предварительной компиляции активов
пример:
источник
Нашел это:
Параметр конфигурации
config.serve_static_assets
был переименован в,config.serve_static_files
чтобы уточнить его роль.в
config/environments/production.rb
:Поэтому установите env
RAILS_SERVE_STATIC_FILES
или usingNginx
для обслуживания статических файлов. Добавлениеconfig.serve_static_assets = true
будет по-прежнему работать, но будет удалено в будущем.источник
не рекомендуется позволять capistrano выполнять предварительную компиляцию ресурсов, потому что это может занять много времени и часто превышает время ожидания. попробуйте выполнить предварительную компиляцию локальных ресурсов.
1-й, установите в config / application.rb,
config.assets.initialize_on_precompile = false
затем выполните localRAILS_ENV=production bin/rake assets:precompile
и добавьте эти общедоступные / активы в git.и config / environment / development.rb, измените путь к вашему активу, чтобы избежать использования предварительно скомпилированных ресурсов:
config.assets.prefix = '/dev-assets'
Если у вас проблема с подключением к базе данных, это означает, что у вас есть инициализатор, который использует базу данных. один из способов - установить новую среду, дублируя production.rb как, возможно, production2 .rb, а в database.yml добавить production2 среду с настройкой разработки . тогда делай
RAILS_ENV=production2 bin/rake assets:precompile
если вы все еще сталкиваетесь с некоторыми проблемами с активами, например ckeditor, добавьте файл js в config / initializers / assets.rb
Rails.application.config.assets.precompile += %w( ckeditor.js )
источник
Возможно я ошибаюсь но тем кто рекомендует менять
config.assets.compile = true
Комментарий к этой строке гласит: # Не возвращаться к конвейеру ресурсов, если предварительно скомпилированный актив пропущен.
Это говорит о том, что, задав для него значение true, вы не устраняете проблему, а, скорее, обойдете ее и каждый раз запускаете конвейер. Это обязательно должно убить вашу производительность и уничтожить цель конвейера?
У меня была такая же ошибка, и это было из-за того, что приложение работало в подпапке, о которой рельсы не знали.
Итак, мой файл css находится в home / subfolder / app / public / .... но rails искал в home / app / public / ...
попробуйте переместить приложение из подпапки или сообщить rails, что оно находится во вложенной папке.
источник
Это устранило у меня проблему в продакшене. Поместите его в конфиг nginx.
источник
Даже мы столкнулись с той же проблемой, когда это
RAILS_ENV=production bundle exec rake assets:precompile
удалось, но все пошло не так, как ожидалось.Мы обнаружили, что главным виновником здесь был единорог.
То же, что и в вашем случае, даже мы использовали для перезапуска единорога после компиляции ресурсов. Было замечено, что при перезапуске единорога перезапускаются только его рабочие процессы, а не главный процесс.
Это основная причина, по которой не обслуживаются нужные активы.
Позже, после компиляции ассетов, мы остановили и запустили единорога, так что мастер-процесс единорога также перезапустился и были обслужены правильные ассеты.
Остановка и запуск единорога дает около 10 секунд простоя по сравнению с перезапуском единорога. Это обходной путь, который можно использовать, когда долгосрочным решением является переход на puma от unicorn.
источник