Почему stylesheet_link_tag не ссылается на/активы в производстве?
Я только что сделал первое развертывание для нового приложения Rails 3.1, но активы, похоже, работают некорректно. Я предварительно компилирую все при развертывании, и он появляется в public/assets
, как ожидалось. Однако вывод, например, stylesheet_link_tag "application"
в моем макете, имеет href, указывающий на /stylesheets/application.css
. Это явно не работает.
Странно то, что в режиме разработки все кажется прекрасным, оно ссылается на /assets/application.css
, как ожидалось.
Я сравнивал файлы config/application.rb
и config/environments/production.rb
с другим приложением, которое у нас есть в конвейере ресурсов, и соответствующие настройки кажутся одинаковыми.
Где я должен смотреть?
Ответы
Ответ 1
Когда хелпер генерирует этот код:
/stylesheets/application.css
Это связано с тем, что конвейер НЕ включен в любом режиме, в котором вы находитесь. Существует несколько возможных причин.
-
У вас включен конвейер в неправильном файле конфигурации. (Конвейер должен быть включен в файле конфигурации application.rb)
-
Вы включили его в application.rb и отключили в другом месте.
-
Вы случайно прокомментировали ритуал где-то
Подробнее см. этот вопрос.
Если это обновленное приложение, проверьте все параметры конфигурации в последний раздел руководства по конвейеру, чтобы убедиться, что у вас есть их все правильно установлены.
Ответ 2
Я знаю, что это для rails 3.1, но очень похожая ошибка может случиться с пользователями рельсов 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 )
Ответ 3
Я бы предложил вам включить config.assets.compile = false (по умолчанию) в true в production.rd и увидеть, что активы обслуживаются как в developemnt. Если они правильно поданы, вы должны проверить свой application.css, чтобы убедиться, что вы включаете другие таблицы стилей в каталог правильно, как с файлами css
/*
*= require scaffold
*= require pagination
*= require_self
*= require_tree.
*/
где scaffold и pagination являются css файлами. или упомянуть их под флагом config.assets.precompile, как показано ниже.
config.assets.precompile + =% w (pagination.css scaffold.css)
Я предполагаю, что причиной являются прекомпиляционные работы (application.js, application.css и все не-JS/CSS уже добавлены), и любые добавочные активы должны быть добавлены в флаг config.assets.precompile.
Ответ 4
Я думал, что активы должны были быть app/assets
not public/assets
, но я могу ошибаться.