Конвейер активов Rails при постановке: правильный отпечаток пальца, но 404ing - PullRequest
9 голосов
/ 08 декабря 2011

Я использую Rails 3.1.3, которая включает Sprockets 2.0.3 в качестве зависимости.

Я настроил свою промежуточную среду так, чтобы она была настроена так, как руководство Rails предлагает для производства.

config.serve_static_assets = false
config.assets.compress = true
config.assets.compile = false
config.assets.digest = true

Я включил в свой Capfile

load 'deploy'
load 'deploy/assets'

И при развертывании ресурсы предварительно компилируются, как и ожидалось.

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

application-bd402855d34fb61e0a1690da06f79f20.js
application-bd402855d34fb61e0a1690da06f79f20.js.gz
application-ed3f9a8d23992790841c11b6692fb576.css
application-ed3f9a8d23992790841c11b6692fb576.css.gz
...and a bunch of images...

Когда я загружаю страницу, я вижу правильные ссылки, отпечатки пальцев и все.

<link href="/assets/application-ed3f9a8d23992790841c11b6692fb576.css" media="screen" rel="stylesheet" type="text/css">
<script src="/assets/application-bd402855d34fb61e0a1690da06f79f20.js" type="text/javascript"></script>

Тем не менее, все 404, CSS, JS, изображения, все.

Кто-нибудь знает, что здесь за сделка? Спасибо!

Ответы [ 5 ]

1 голос
/ 23 августа 2013

Если вы уверены, что ресурсы компилируются и существуют в публичном каталоге, это могут быть настройки вашего веб-сервера? В производственных / промежуточных средах ресурсы не должны попадать в приложение rails и обслуживаться непосредственно с веб-сервера. Вот пример фрагмента конфигурации Apache:

   <LocationMatch "^/assets/.*$">
      Header unset ETag
      FileETag None
      # RFC says only cache for 1 year
      ExpiresActive On
      ExpiresDefault "access plus 1 year"

      SetEnv no-gzip
      RewriteEngine on
      # Make sure the browser supports gzip encoding before we send it
      RewriteCond %{HTTP:Accept-Encoding} \b(x-)?gzip\b
      RewriteCond %{REQUEST_FILENAME}.gz -s
      RewriteRule ^(.+) $1.gz [L]

   </LocationMatch>

   <FilesMatch \.css\.gz$>
      ForceType text/css
      Header set Content-Encoding gzip
   </FilesMatch>

   <FilesMatch \.js\.gz$>
      ForceType text/javascript
      Header set Content-Encoding gzip
   </FilesMatch>
1 голос
/ 13 марта 2013

Несмотря на предложения в других ответах

config.assets.compile = true

... это обходной путь, а не решение. Эта опция позволяет Rails вернуться к компиляции на лету ресурсов, которые не могут быть найдены в public / assets. Это может «решить» вашу проблему при постановке, но компиляция ресурсов Rails во время выполнения не совсем оптимальна в работе.

Я помню, что в первые месяцы работы с новым конвейером ресурсов в Rails 3.1.x у меня были проблемы со сжатием и генерацией дайджестов, которые я действительно решил только в более поздних версиях. Я бы предложил попробовать

config.assets.compress = false
config.assets.digest = false

как индивидуально, так и вместе. И / или обновить до более поздних версий Rails или гемов конвейера активов.

0 голосов
/ 14 августа 2013

Я столкнулся с той же проблемой несколько месяцев назад. По нескольким причинам я решил вручную запустить компиляцию активов в производственном процессе, поэтому мой production.rb имеет

config.assets.compile = false

и при развертывании capistrano также есть задача прекомпиляции ресурсов (также с использованием rvm):

run "cd #{release_path} && RAILS_ENV=production bundle exec rake assets:precompile", shell: fetch(:rvm_shell)

Конечным шагом было убедиться, что мы создали символическую ссылку на папку ресурсов, чтобы нам не нужно было перекомпилировать активы, которые не изменились.

run "ln -nfs #{shared_path}/assets #{release_path}/public/assets"
0 голосов
/ 13 марта 2013
config.assets.compile = false

Это должно быть правдой

0 голосов
/ 20 марта 2012
config.assets.compile = false

Должно быть:

config.assets.compile = true

Кроме того, убедитесь, что очистили кэш:

bundle exec rake tmp:cache:clear

и перезапустите сервер.

...