Статические страницы и ресурсы в Rails 3.1.1 - PullRequest
3 голосов
/ 08 октября 2011

В настоящее время мы работаем над проектом, в котором нам нужно добавить различные статические html-страницы + статические ресурсы для тех, кто время от времени «просто работает». У нас не может быть кого-либо, редактирующего html напрямую, чтобы размещать пути для ресурсов. Нам нужно, чтобы он просто работал таким образом, чтобы папки html + asset размещались непосредственно в / public, а содержимое обрабатывалось так, как оно было сгенерировано.

При тестировании этого поведения в производственной среде, нет ошибок с такими ошибками, как:

ActionController::RoutingError (No route matches [GET] "/some_folder/some-image.png"):

Полагаю, это результат того, что я читаю из конвейера ресурсов 3.1.x.

Как вы изменяете маршруты так, что они будут обслуживаться напрямую? Или есть предпочтительный способ сохранить это точное поведение? (В конечном итоге это будет развернуто на героку.)

Добавление некоторых подробностей, поскольку текущие замечания еще не выдвинули мою проблему с точки зрения решения:

В моем нынешнем сценарии я запускаю его прямо на WEBrick rails s -e production, чтобы проверить его. В режиме разработки это работает правильно; единственное исключение в production.

Я также запускаю это до запуска сервера: bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile --trace

Когда я действительно пытаюсь загрузить страницу в рабочем режиме, я вижу следующий вывод:

cache: [GET /] miss
cache: [GET /test_files/index.css] miss
cache: [GET /test_files/index.js] miss
cache: [GET /test_files/logo.png] miss
cache: [GET /test_files/background.png] miss
cache: [GET /test_files/horizontal.png] miss
cache: [GET /favicon.ico] miss

Ответы [ 5 ]

3 голосов
/ 10 октября 2011

После дальнейшего изучения production.rb я вижу: "config.serve_static_assets = true", что при значении false по умолчанию вызывает проблему, возникающую в webrick.Таким образом, при установке этого значения в значение true оно обслуживает файлы должным образом.

Из некоторого дополнительного чтения выясняется, что, возможно, Heroku также нуждается в этом значении false, что является средой, в которой мы развертываем.

Спасибо за вклад, но сейчас это подход, который я бы выбрал, и я, безусловно, буду признателен за любые дальнейшие замечания, если это НЕ правильный ответ или если есть лучший подход.

2 голосов
/ 04 февраля 2012

Мне помог ответ @ ylluminate: я изменил параметр config.serve_static_assets на true в файле config / environment / production.rb и перезапустил сервер с

$rails server --environment=production

и теперь он обслуживает сжатые активы.

ПРИМЕЧАНИЕ : я также предварительно скомпилировал активы с помощью

$bundle exec rake assets:precompile

(звоните rake таким образом, убедитесь, что будет использоваться выбранная для проекта версия рейка, но я думаю, что используйте только rake assets: precompile будет работать в 99% случаев)

2 голосов
/ 08 октября 2011

Начиная с Rails 3.1.1, задача прекомпиляции создает как непереваренные, так и переваренные имена файлов, так что вы можете ссылаться на них в статических файлах (при этом сохраняя версию дайджеста в динамических файлах).

Единственная проблема заключается в том, что вы используете заголовки дальнего будущего в каталоге ресурсов; Изменения в непереваренных файлах не будут приниматься удаленными клиентами, у которых все еще есть копия, и которые считают, что кэш все еще действителен.

Возможно, вам придется взглянуть на подход, который заменяет непереваренные имена файлов правильными именами в процессе развертывания.

Если вы не используете заголовки дальнего будущего в каталоге, это не имеет значения - вы можете использовать любое имя.

1 голос
/ 08 февраля 2012

Да, посмотрите на sprockets-image-compress gem, просто добавьте его в свой Gemfile, и он также автоматически сжимает ресурсы изображений (без потерь, используя pngcrush и jpegoptim)... Я не знаю, тверд ли камень, но из того, что я видел, я люблю его!

1 голос
/ 08 октября 2011

Если у вас /public/some_folder/some-image.png физически присутствует (независимо от того, скопировали ли вы его туда вручную или он был сгенерирован прекомпиляцией ресурсов), он должен работать.Сервер (например, Apache) сначала проверит, существует ли запрошенный путь публично, если он это делает, он даже не вызовет Ruby on Rails.

Что касается перевариваемых имен файлов, есть опция, чтобы включить этофункция отключена, но я бы не рекомендовал это по причинам, уже упомянутым здесь кем-то еще.

Также вы можете поместить файлы, которые ссылаются на ресурсы, в папку app / assets и добавить расширение .erb НА КОНЦЕ.Затем вы можете использовать <% = asset_path ...%> внутри этого файла, поэтому ручное редактирование не потребуется.Это будет работать, даже если у вас уже есть какая-то другая предварительная обработка файла, например, sass - style.css.scss.erb будет работать.Сначала будет оценен код erb (введя правильные имена файлов для ресурсов), а затем будет запущен компилятор sass.

...