Жоден маршрут не відповідає [GET] / актив


143

У мене є додаток Rails, яке я намагаюся перевірити у виробничих умовах. Я побіг, RAILS_ENV=production rake assets:precompileякий генерував усі мої активи в / public / активи. Проблема полягає в тому, що коли я запускаю свою програму w / 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, який обслуговуватиме статичні активи. Я підозрюю, що Pow може це зробити.


Якщо ви перебуваєте на Heroku, вони рекомендують використовувати rails_12factorдорогоцінний камінь, який дозволяє встановити це налаштування за замовчуванням. Розмістіть дорогоцінний камінь у productionгрупі у своєму Gemfile:

group :production do
  gem 'rails_12factor'
end

5
Хтось знає, чи це рішення зазначеної проблеми при розгортанні в героку?
Кайл Клегг

Ясна відповідь, велике спасибі. Я потрапив на цю сторінку, коли я тестував виробниче середовище, використовуючи thinна своїй машині розробки. Я збирав активи, але application.cssбув порожній і журнал сервера дав помилку ОП.
veritas1

2
У Rails 4 це буде config.serve_static_files. config.serve_static_assetsзастаріла і буде видалена в Rails 5.
sampi

Розгортаючись до розподілу RHEL, я не торкнувся конфігурації середовища за замовчуванням, просто додав дорогоцінний камінь rails_12factor в Rails v4.2.4, тепер все в порядку. Велике спасибі
Onur Kucukkece

1
@Onur: Це означає, що ваша програма Rails буде обслуговувати активи, а не ваш веб-сервер. Я взагалі не рекомендую цю конфігурацію, оскільки вона може зробити ваш сервер Rails повільніше.
Райан Бігг

12

Додаючи до сказаного вище Райана, посібник із конвеєра активів Rails описує, як налаштувати Apache або nginx для обслуговування статичних активів для вас.

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

Ви дійсно повинні налаштувати nginx або Apache для обслуговування статичних активів, оскільки вони набагато краще оптимізовані для цього завдання, ніж дворняга / тонка / єдиноріг.


7

Просто вирішили ту саму проблему. У моєму випадку відповідь Райана не була корисною. Братше вказав на напрямні рейлів, але, на жаль, це не спрацювало і для мене. Однак ресурс був корисним. Тому я взяв звідти конфігурацію 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)


@ SteveO7, очевидно, рейки використовують за замовчуванням активи pipleline в режимі dev.
Albert.Qing

2

Rails 4.2 додав / змінив цей рядок у файлах config / середовища / 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-змінною.
акостадінов

2

У рейках 5 config.serve_static_filesпараметр змінився, тому тепер це потрібно мати

config.public_file_server.enabled = true

обслуговувати активи на місцях.


2

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

config / середовища / production.rb

config.assets.compile = true

потім запустіть команду:

RAILS_ENV=production rake assets:precompile

потім натисніть всі файли компіляції та файл маніфесту на сервер.


1

Я використовую 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;
}

все буде добре працювати.


1

Якщо хтось потрапляє сюди з тією ж помилкою в тестовому середовищі, що і я, ось що мені допомогло:

rails assets:clobber assets:precompile RAILS_ENV=test

тоді:

ps axu | grep your-username

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

kill <spring-server-PID>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.