No route matches [GET] / активы

у меня есть приложение Rails, которое я пытаюсь протестировать в производственной среде. Я побежал!--1--> который создал все мои активы в /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?

9 ответов


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

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

config.serve_static_files = false

или в Rails 5:

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

или set ENV['RAILS_SERVE_STATIC_FILES'] значение true.

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


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

group :production do
  gem 'rails_12factor'
end

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

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

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


просто решил ту же проблему. В моем случае ответ Райана не помог. Bratsche указал на рельсы руководства, к сожалению, это не работает для меня. Однако ресурс оказался полезным. Поэтому я взял конфигурацию 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, и все.


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

удалить public / assets

1.грабельные активы: clobber RAILS_ENV=производство

assets compile

2.rake assets:precompile RAILS_ENV=производство

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


рельсы 4.2 добавил/изменил эту строку в файл config/сред/ постановка.РБ и производство.файлы 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,config.serve_static_files опция изменилась, поэтому теперь вам нужно иметь

config.public_file_server.enabled = true

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


попробовать ниже код:

в config/сред/производство.rb

config.assets.compile = true

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

RAILS_ENV=production rake assets:precompile

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


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

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

проверьте файл config/сред/производство.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 уже обрабатывает это, настройте его corretcly

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;
}

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


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

rails assets:clobber assets:precompile RAILS_ENV=test

затем:

ps axu | grep your-username

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

kill <spring-server-PID>