Нет подходящих маршрутов [GET] / активы - PullRequest
135 голосов
/ 20 октября 2011

У меня есть приложение 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?

Ответы [ 9 ]

220 голосов
/ 20 октября 2011

В производственном режиме 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
12 голосов
/ 24 октября 2011

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

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

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

6 голосов
/ 13 февраля 2013

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

   # 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 голосов
/ 24 марта 2016

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

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

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

активы скомпилированы

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

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

2 голосов
/ 21 июля 2017

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

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

config.assets.compile = true

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

RAILS_ENV=production rake assets:precompile

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

2 голосов
/ 27 декабря 2016

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

config.public_file_server.enabled = true

для локального обслуживания активов.

2 голосов
/ 25 января 2016

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
0 голосов
/ 21 февраля 2018

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

rails assets:clobber assets:precompile RAILS_ENV=test

тогда:

ps axu | grep your-username

для поиска spring server процессаи его PID затем убить его через:

kill <spring-server-PID>
0 голосов
/ 21 июля 2017

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

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

Проверка конфигурации / сред/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;
}

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

...