Нет подходящих маршрутов [GET] / активы

143

У меня есть приложение Rails, которое я пытаюсь протестировать в производственной среде. Я запустил, RAILS_ENV=production rake assets:precompileкоторый сгенерировал все мои активы в / public / assets. Проблема в том, что когда я запускаю свое приложение, RAILS_ENV=production rails s thinя получаю:

ActionController::RoutingError (No route matches [GET] "/assets/application-eff78fd67423795a7be3aa21512f0bd2.css"):

Этот файл существует, хотя в /public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css.

Есть мысли, почему я это получаю RoutingError?

Кайл Деко
источник

Ответы:

230

В производственном режиме Rails не будет отвечать за обслуживание статических ресурсов. Таким образом, вы получаете эту ошибку. Тонкий не будет делать это, так как это просто оболочка вокруг Rails.

Это контролируется этим параметром config/environments/production.rbв вашем приложении:

config.serve_static_files = false

Или в Rails 5:

# config/environments/production.rb
config.public_file_server.enabled = true

Или установите ENV['RAILS_SERVE_STATIC_FILES']в true.

Вы можете установить этот параметр trueили использовать реальный сервер, такой как Apache или Nginx, который будет обслуживать статические ресурсы. Я подозреваю, что Пау также может сделать это.


Если вы используете Heroku, они рекомендуют использовать rails_12factorгем, который по умолчанию включает этот параметр. Поместите драгоценный камень в productionгруппу в вашем Gemfile, как это:

group :production do
  gem 'rails_12factor'
end
Райан Бигг
источник
5
Кто-нибудь знает, является ли это решением указанной проблемы при развертывании на героку?
Кайл Клегг
Четкий ответ, большое спасибо. Я попал на эту страницу, когда тестировал производственную среду thinна своей машине для разработки. Я компилировал ресурсы, но application.cssбыл пуст, и журнал сервера выдал ошибку OP.
veritas1
2
В Rails 4 это будет config.serve_static_files. config.serve_static_assetsустарела и будет удалена в Rails 5.
sampi
При развертывании в дистрибутиве RHEL я не затрагивал конфигурацию среды по умолчанию, просто добавил гем rails_12factor в Rails v4.2.4, теперь все в порядке. Большое спасибо
Онур Кучуккесе
1
@Onur: Это означает, что ваше Rails-приложение будет обслуживать ресурсы, а не ваш веб-сервер. Я не рекомендую эту конфигурацию вообще, потому что она может замедлить работу вашего сервера Rails.
Райан Бигг
12

В дополнение к сказанному Райаном руководство по конвейеру ресурсов Rails описывает, как настроить Apache или nginx для обслуживания статических ресурсов.

http://guides.rubyonrails.org/asset_pipeline.html

Вы действительно должны настроить nginx или Apache для обслуживания статических ресурсов, поскольку они гораздо лучше оптимизированы для этой задачи, чем mongrel / thin / unicorn.

bratsche
источник
7

Просто решил ту же проблему. В моем случае ответ Райана не помог. Братше указал на Rails Guides, к сожалению, это не сработало и для меня. Однако ресурс был полезен. Поэтому я взял оттуда конфигурацию Nginx и добавил корневую директиву, указывающую на публичный каталог. Без этого это не работает.

   # serve static assets
   location ~ ^/assets/ {
     expires 1y;
     root  /path/to/my/cool_project/public;
     add_header Cache-Control public;

     add_header ETag "";
     break;
   }

Перезапустите nginx, и все.

Валк
источник
3

На самом деле вам не нужно изменять какие-либо конфигурации по умолчанию. Вы просто перекомпилируете файл ресурсов снова .

удалить общедоступные / активы

1. Рейк активы: клоббер RAILS_ENV = производство

составление активов

2.Райк активов: прекомпиляция RAILS_ENV = производство

3.рестарт сервер, например (nginx)

Albert.Qing
источник
@ SteveO7, очевидно, по умолчанию рельсы используют пиплэйн ресурсов в режиме разработки.
Albert.Qing
2

Rails 4.2 добавил / изменил эту строку в ваших файлах config / environment / staging.rb и production.rb:

config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?

Если RAILS_SERVE_STATIC_FILES не установлен, и вы являетесь активами службы с вашего сервера Rails (как с Unicorn), тогда по умолчанию будет установлено значение «false», и произойдет ошибка RoutingError.

Это легко исправить:

config.serve_static_files = true
Мартин Зоммер
источник
Спасибо, это самый простой вариант. Конфигурация обычно зависит от среды сервера, и сделать ее настраиваемой с помощью env-variable - это хорошо.
Акостадинов
2

В рельсах 5 config.serve_static_filesопция изменилась, так что теперь вам нужно иметь

config.public_file_server.enabled = true

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

Obromios
источник
2

попробуйте код ниже:

конфигурации / среда / production.rb

config.assets.compile = true

затем выполните команду:

RAILS_ENV=production rake assets:precompile

затем отправьте все файлы компиляции и файл манифеста на сервер.

puneet18
источник
1

Я использую Mina + Puma + Nginx для развертывания моего приложения Rails 5, я получил

ActionController::RoutingError (No route matches [GET] "/assets/application-658cf2ab3ac93aa5cb41a762b52cf49d7184509c307922cd3fbb61b237a59c1a.css")

проверьте config / environment / production.rb

# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

NGINX уже справляется с этим , настройте его корректно

upstream puma {
  server unix:///home/deploy/apps/appname/shared/tmp/sockets/appname-puma.sock;
}

server {
  listen 80 default_server deferred;
  # server_name example.com;

  root /home/deploy/apps/appname/current/public;
  access_log /home/deploy/apps/appname/current/log/nginx.access.log;
  error_log /home/deploy/apps/appname/current/log/nginx.error.log info;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @puma;
  location @puma {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    proxy_pass http://puma;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 10M;
  keepalive_timeout 10;
}

все будет работать нормально.

Feuda
источник
1

Если кто-то попал сюда с той же ошибкой в ​​тестовой среде, что и я, вот что мне помогло:

rails assets:clobber assets:precompile RAILS_ENV=test

затем:

ps axu | grep your-username

найти spring serverпроцесс и его PID, а затем убить его с помощью:

kill <spring-server-PID>
ToTenMilan
источник