Pull to refresh

Рецепт использования Asset Pipeline

Reading time 2 min
Views 16K
Пост навеян долгим апробированием различных гипотез правильной работы с изображениями через Asset Pipeline после перехода на Ruby on Rails 3.1 с предыдущих версий.

Итак, Задача


В CSS файле указать изображение, находящееся в папке assets. Изображение в production-среде должно быть предварительно скомпилировано.
Казалось бы, ну что тут такого ведь есть официальный гайд, адаптированный перевод гайда, скринкаст, в конце-то концов. Здесь правило «It just works» работает только, если вы не допускали своих (или чужих) рук до чувствительных точек. Каких именно?

Решение


В ходе экспериментов подтвердилась только одна гипотеза, которую для удобства изложения удобно разбить на несколько частей.
Дерево файлов будет выглядеть так (.erb — прихоть, работа через движок sass-rails также возможна):

app/
… assets/
…… images/
……… rails.png
…… stylesheets/
……… application.css.erb

1. Для прекомпилирования используем не rake assets:precompile, а немного переделанный rake task
Периодически у меня возникала ошибка
rake assets:precompile
rake aborted! rails.png isn't precompiled

Причина её появляения мне непонятна, но точно знаю, что не я один такой: решение этой проблемы было найдено на гитхабе.

2. Для указания пути в css используем хелпер asset_path erb-шаблонизатора.
Есть куча хелперов для SASS, но ни один из них не сработал в своём проекте я его пока не использую.
Содержимое application.css.erb:
#header { background-image: url(<%= asset_path("rails.png") %>)

В случае использования sass (application.css.scss):
#header { background-image: image_url('rails.png') }

3. Настройки production.rb, которые также играют роль:
config.assets.compile = false # ведь мы будем компилировать заранее
config.assets.digest = true # в названия файлов будут вставляться их подписи (для облегчения кеширования)
config.action_dispatch.x_sendfile_header = "X-Sendfile" # 'X-Accel-Redirect' для nginx, или совсем комментируем, если http-server не поддерживает эту директиву

Последняя строка немало меня напрягла при запуске на локальной машине:
Изображение «localhost:3000/assets/rails-s43o54m765t656ed76i8gest.png» не может быть показано, так как содержит ошибки.
Проблема заключалась в том, что http-сервер Webrick'a не поддерживает директиву x_sendfile_header (возможно ошибаюсь, но что-то там точно не сработало).

Заключение


Кончено, в теме до конца я ещё не разобрался, но, как выразился Александр Сергеевич,
О, сколько нам открытий чудных
Готовят просвещенья дух


UPD: создал проект на github, демонстрирующий работу с использованием sass-rails
Tags:
Hubs:
+30
Comments 22
Comments Comments 22

Articles