Рельсы 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.

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