Рельсы 3.1 активов трубопровода в производстве
Я использую конвейер ресурсов (в Rails 3.1.3) и пытаюсь заставить его работать в производстве.
ситуация
В моем /app/assets/stylesheets
В каталоге у меня есть следующие файлы:
application.css --> this is the default rails one
stylesheet.css --> This is my custom stylesheet
Я потратил много времени на получение stylesheet.css
включены в /public/assets/
каталог в производстве (запустив rake assets:precompile
) и я наконец сделал это, добавив следующую строку в мой application.rb
файл:
config.assets.precompile += ['stylesheet.css']
Я знаю, имеют право предварительно скомпилированы stylesheet.css
файл в производстве.
Моя проблема
Проблема у меня при использовании stylesheet_link_tag
со мной stylesheet.css
файл. Оказывается:
<%= stylesheet_link_tag "stylesheet" %>
разрешается в <link href="/stylesheets/stylesheet.css" media="screen" rel="stylesheet" type="text/css">
в производстве я бы ожидал, что путь будет решен в /assets/stylesheet.css
так же, как это происходит в разработке.
Что еще более удивительно, так это то, что application.css
ведет себя отлично, хотя <%= stylesheet_link_tag "application"%>
разрешается в <link href="/stylesheets/stylesheet.css" media="screen" rel="stylesheet" type="text/css">
, Чего я не понимаю, так это того, что публичный каталог /stylesheets/ не существует в rails 3.1.
Любая идея?
4 ответа
Ответы Ричарда Халса указали мне правильное направление. То, что происходит, действительно неуловимо..
Ответ на мой вопрос: у активов Rails 3.1 нет отпечатков пальцев в производстве.
В основном, мой проект использует mongoid вместо ActiveRecord. Согласно документации Mongoid о конфигурации, application.rb
файл может быть изменен, чтобы не включать ActiveRecord
что означает удаление:
require railties/all
И заменить его на:
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "rails/test_unit/railtie"
# require "sprockets/railtie" # Uncomment this line for Rails 3.1+
Я настолько привык к этой манипуляции с rails 3.0.x, что не обратил внимания на комментарий, связанный с Rails 3.1
Моя проблема была в том, что мне не нужны звездочки!
Спасибо за вашу помощь!
Причина, по которой вы можете получить доступ stylesheet.css
в разработке из-за того, как работает Sprockets.
В режиме разработки ВСЕ запросы к чему-либо в / assets отправляются в Sprockets для обработки. Звездочки напрямую сопоставляют запросы с путями, один к одному, поэтому вы можете получить доступ к любым ресурсам, хранящимся в app/assets/etc
,
Все запросы проходят через звездочки; он подает файлы в ваш браузер.
В производстве все по-другому. К именам файлов добавляется отпечаток пальца, и ожидается, что вы прекомпилируете свои активы в статические файлы. Это из соображений производительности - Sprockets недостаточно быстр для обслуживания большого количества запросов.
Только те файлы CSS и JS, на которые ссылаются манифесты по умолчанию, компилируются в application.css и application.js. Другие файлы, на которые вы ссылаетесь, не прекомпилируются, если они не добавлены в config.assets.precompile
массив в вашем конфигурационном файле.
Вы говорите, что файлы разрешаются в /stylesheets/stylesheet.css
, Конвейер должен генерировать такой путь в процессе разработки: /assets/applicaton.css
, На производстве должен быть отпечаток в имени файла. То, что вы опубликовали, говорит о том, что конвейер не включен (это старые, до 3.1, места для файлов).
Если это обновленное приложение, скорее всего, вы пропустили какой-то важный параметр конфигурации. Это основная причина проблем с разработкой. Убедитесь, что параметры конвейера установлены точно так же, как и в последнем разделе руководства по конвейеру. (Я думаю, что вы пропали без вести config.assets.enabled = true
в application.rb)
И для ясности я бы предложил изменить имя stylesheet.css
в admin.css
при включении этого в массив прекомпиляции (как вы уже сделали).
Если параметры конфигурации установлены правильно, а манифест администратора включен в прекомпиляцию, у вас должен быть файл application.css для внешнего интерфейса и admin.css для бэкэнда, которые можно связать с помощью вспомогательных методов.
Вы application.css
должен быть файл манифеста, это означает, что при запуске вашей программы он должен включать ваш stylesheet.css
автоматически.
убедитесь, что он имеет эти две строки.
application.css:
/*
*= require_self
*= require_tree .
*/
Если это так, то что-то еще не работает должным образом, вам не нужна строка:
config.assets.precompile += ['stylesheet.css']
Если это не работает, либо убедитесь, что у вас включены все настройки из этого руководства Asset Pipeline.
Пока я осматривался actionpack
чтобы увидеть, что может быть причиной этой проблемы, я нашел этот маленький драгоценный камень в 3.1.1
Список изменений:
javascript_path and stylesheet_path now refer to /assets if asset pipelining is on.
Тааак, если вы используете 3.1.0
обновитесь до 3.1.1
и посмотрим, исправит ли это. Если вы уже обновились, вернулись на круги своя. Но это, кажется, описывает вашу проблему, так как stylesheet_link_tag
использования stylesheet_path
interally.