Почему 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 однако я могу ошибаться.

Другие вопросы по тегам