Я нахожусь в процессе обновления приложения на Rails 3 для использования Rails 3.1 и как часть этого, использую новый конвейер ресурсов.Пока у меня все работает, кроме одной довольно раздражающей проблемы, которую я не могу решить.
Приложение и все его активы прекрасно работают в разработке, но в производственной среде оно развертывается в подчиненном URI с помощьюПассажир (http://the-host/sub-uri/
).Проблема заключается в том, что ресурсы предварительно компилируются во время развертывания, и один из моих файлов CSS (ну, это .css.scss
файл) использует хелпер image-url
из гема sass-rails
.Поскольку во время процесса предварительной компиляции пути жестко запрограммированы в предварительно скомпилированном файле CSS, в подпапке не учитывается:
В моем файле .css.scss
:
body { background-image: image-url("bg.png"); }
Результат в скомпилированном application-<md5-hash-here>.css
файле:
body { background-image: url(/assets/bg.png); }
Что должно быть для правильной работы:
body { background-image: url(/sub-uri/assets/bg.png); }
Этот сценарий просто требует слишком много?Если это так, мне придется вернуться к старому конвейерному способу без использования ресурсов и просто обслуживать мои изображения и CSS с public
.Однако это похоже на то, о чем нужно было подумать и решить ...?Я пропускаю решение?
Edit 1: Следует отметить, что использование erb solution вместо этого дает тот же результат, что и следовало ожидать.
Редактировать 2: в ответ на комментарий Бенуа Гаррета
Нет, проблема не связана с config.assets.prefix
.Я попытался установить это (/sub-uri/assets
вместо значения по умолчанию /assets
), но оказалось, что это было неправильно, похоже, этот параметр уже относится к корню приложения Rails, а не к серверу.,Удаление этого (и, следовательно, возвращение к дефолту) исправило все странные проблемы, которые вызывали (а их было много, все активы оказались в /sub-uri/sub-uri/assets
- все это было очень странно).Единственная проблема заключается в том, что помощник и друзья image-url
не получают вспомогательный URI при предварительной компиляции.Излишне говорить, что это логично, поскольку, когда он предварительно скомпилирован, он не может знать, что, когда он работает под управлением Passenger, он будет настроен таким образом.Мой вопрос состоит в том, как сообщить ему об этом и таким образом получить правильные пути в предварительно скомпилированном результате.Если это действительно возможно.
Мой текущий обходной путь - сослаться на iamge в CSS следующим образом: url(../images/bg.png)
и поместить его в нетрубопроводное местоположение public/images
.Едва ли это идеал, поскольку он не извлекает выгоду из отпечатков пальцев и всего, что обеспечивает конвейер.