Рельсы 3.1 активов трубопровода в производстве - PullRequest
6 голосов
/ 06 января 2012

Я использую конвейер ресурсов (в 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">. Что я не понимаю, так это то, что каталог public / stylesheets / не существует в rails 3.1.

Есть идеи?

Ответы [ 4 ]

8 голосов
/ 08 января 2012

Ответы Ричарда Халса указали мне правильное направление.То, что происходит, действительно незаметно.

Ответ на мой вопрос: У ресурсов 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

Моя проблема заключалась в том, что мне не требовались звездочки!

Спасибо всем за помощь!

7 голосов
/ 08 января 2012

Причина, по которой вы можете получить доступ к 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 для внутреннего интерфейса, оба могут быть связанычерез вспомогательные методы.

1 голос
/ 06 января 2012

Вы application.css должны быть файлом манифеста, это означает, что при запуске вашей программы она должна включать ваш stylesheet.css автоматически.

убедитесь, что в нем есть эти две строки.

application.css:

/*
 *= require_self
 *= require_tree . 
*/

Если это происходит, значит что-то еще не работает должным образом, вам не нужна строка:

config.assets.precompile += ['stylesheet.css']

Если это не работает, либо сделайтеУбедитесь, что все настройки включены в этом руководстве Asset Pipeline .

0 голосов
/ 08 января 2012

Пока я смотрел вокруг actionpack, чтобы увидеть, что может быть причиной этой проблемы, я нашел этот маленький драгоценный камень в 3.1.1 changelog:

javascript_path and stylesheet_path now refer to /assets if asset pipelining is on.

soooo, если вы используете 3.1.0, обновитесь до 3.1.1 и посмотрите, исправит ли это. Если вы уже обновились, вернулись на круги своя. Но, похоже, она описывает вашу проблему, поскольку stylesheet_link_tag использует stylesheet_path в целом.

...