Почему stylesheet_link_tag не ссылается на /assets в производстве?
Я только что сделал первое развертывание для нового приложения на Rails 3.1, но ресурсы, похоже, не работают правильно. Я прекомпилирую все при развертывании, и это оказывается в public/assets
как и ожидалось. Тем не менее, вывод, например, stylesheet_link_tag "application"
в моем макете есть ссылка, указывающая на /stylesheets/application.css
, Это, очевидно, не работает.
Странно то, что в режиме разработки все вроде бы нормально, это ссылки на /assets/application.css
как и ожидалось.
Я сравнил мой config/application.rb
а также config/environments/production.rb
файлы с другим приложением, которые мы имеем в конвейере ресурсов, и соответствующие настройки кажутся такими же.
Куда мне смотреть?
4 ответа
Когда помощник генерирует этот код:
/stylesheets/application.css
Это потому, что конвейер НЕ включен в каком бы режиме вы ни находились. Есть несколько возможных причин.
У вас включен конвейер в неправильном файле конфигурации. (Конвейер должен быть включен в конфигурационном файле application.rb)
Вы включили его в application.rb и отключили где-то еще.
Вы случайно закомментировали где-то Railtie
Смотрите этот вопрос для деталей.
Если это обновленное приложение, проверьте все параметры конфигурации в последнем разделе руководства по конвейеру, чтобы убедиться, что все они установлены правильно.
Я знаю, что это для rails 3.1, но очень похожая ошибка может произойти с пользователями rails 4, так что для полноты картины и для помощи будущим гуглерам. Наиболее вероятная причина - вы не добавили этот ресурс в директиву precompile в production.rb, это выглядит так:
# Precompile additional assets.
# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
config.assets.precompile += %w( )
Как сказал OP, application.css не был добавлен, и симптомом является то, что URL начинается с /stylesheets или /javascripts, а не ресурсов. Таким образом, решение заключается в
config.assets.precompile += %w( your_assets.css your_assets.js )
ВНИМАНИЕ: Настройка config.assets.compile = true
в процессе работы может сделать ваше приложение уязвимым для уязвимости Rails Asset Pipeline Directory, связанной с обходом каталога (CVE-2018-3760).
Я бы посоветовал вам включить config.assets.compile = false(по умолчанию) в true в production.rd и посмотреть, что ресурсы обслуживаются как в developmnt. Если они правильно обслуживаются, вам следует проверить файл application.css, чтобы увидеть, правильно ли вы включаете в каталог другие таблицы стилей, например, наличие CSS-файлов.
/*
*= require scaffold
*= require pagination
*= require_self
*= require_tree.
*/
где эшафот и пагинация - это CSS-файлы. или упомяните их под флагом config.assets.precompile, как показано ниже.
config.assets.precompile + =% w (pagination.css scaffold.css)
Я предполагаю, что причина в том, что прекомпиляция работает (application.js, application.css и все не-JS/CSS уже добавлены), и любые дополнительные ресурсы должны быть добавлены в флаг config.assets.precompile.
Я думал, что активы должны были быть в app/assets
не public/assets
однако я могу ошибаться.