Нет совпадений маршрута [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
?
Ответы
Ответ 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
затем нажмите все файлы компиляции и файл манифеста на сервер.