Нет совпадений маршрута [GET]/активы - программирование

Нет совпадений маршрута [GET]/активы

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

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

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

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

4b9b3361

Ответ 1

В режиме производства 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 gem, который разрешает этот параметр по умолчанию. Поместите драгоценный камень в группу production в Gemfile, например:

group :production do
  gem 'rails_12factor'
end

Ответ 2

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

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

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

Ответ 3

Просто решил ту же проблему. В моем случае ответ Райана не помог. Братше указал на 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 и запустите его.

Ответ 4

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

Ответ 5

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

удалить public/assets

1.rake assets: clobber RAILS_ENV = production

компиляция ресурсов

2.rake assets: precompile RAILS_ENV = production

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

Ответ 6

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

config.public_file_server.enabled = true

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

Ответ 7

Я использую mina + puma + 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;
}

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

Ответ 8

попробуйте под кодом:

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

config.assets.compile = true

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

RAILS_ENV=production rake assets:precompile

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