سؤال

ولدي التطبيق القضبان التي أحاول أن الاختبار في بيئة الإنتاج. ركضت RAILS_ENV=production rake assets:precompile التي ولدت كل من الأصول في بلدي العامة / / الأصول. المشكلة هي أنه عندما أبدأ بلدي التطبيق ث / RAILS_ENV=production rails s thin أحصل على:

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

وموجود هذا الملف على الرغم من أن في /public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css.

وأي أفكار لماذا أنا الحصول على هذا RoutingError؟

هل كانت مفيدة؟

المحلول

في وضع الإنتاج، والقضبان لن تكون مسؤولة عن خدمة أصول ثابتة. لذلك، كنت تحصل على هذا الخطأ. ورقيقة لا تفعل ذلك إما لأنها مجرد التفاف حول القضبان.

ويتم التحكم بذلك عن طريق هذا الإعداد في config/environments/production.rb في التطبيق الخاص بك:

config.serve_static_files = false

وأو في القضبان 5:

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

وأو ENV['RAILS_SERVE_STATIC_FILES'] مجموعة إلى true.

ويمكنك إما تعيين إلى أن true أو استخدام الخادم الحقيقي مثل أباتشي أو إنجن إكس الذي سيخدم أصول ثابتة. وأظن أسير الحرب قد تفعل ذلك أيضا.


إذا كنت على Heroku، فإنها تنصح باستخدام جوهرة rails_12factor التي تمكن هذا الإعداد الافتراضي. وضع الأحجار الكريمة في مجموعة production في Gemfile الخاص بك، مثل هذا:

group :production do
  gem 'rails_12factor'
end

نصائح أخرى

Adding to what Ryan said above, the Rails asset pipeline guide describes how to setup Apache or nginx to serve the static assets for you.

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

You really should setup nginx or Apache to serve static assets, as they're much better optimized for this task than mongrel/thin/unicorn.

Just solved the same problem. In my case Ryan's answer was not helpful. Bratsche pointed to the Rails Guides, unfortunately this didn't work for me too. However the resource was helpful. So I took Nginx configuration from there and added the root directive, pointing to the public directory. Without this it doesn't work.

   # serve static assets
   location ~ ^/assets/ {
     expires 1y;
     root  /path/to/my/cool_project/public;
     add_header Cache-Control public;

     add_header ETag "";
     break;
   }

Restart nginx, and that's it.

Indeed you didn't need to modify any default configs. You just recompile assets file again.

remove public/assets

1.rake assets:clobber RAILS_ENV=production

assets compile

2.rake assets:precompile RAILS_ENV=production

3.restart server,eg(nginx)

Rails 4.2 has added/changed this line in your config/environments/ staging.rb and production.rb files:

config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?

If RAILS_SERVE_STATIC_FILES is not set, and you are service assets from your Rails server (like with Unicorn), then it will default to "false", and the RoutingError will occur.

This is an easy fix:

config.serve_static_files = true

In rails 5, the config.serve_static_files option has changed, so now you need to have

config.public_file_server.enabled = true

to serve assets locally.

try below code:

config/environments/production.rb

config.assets.compile = true

then run command:

RAILS_ENV=production rake assets:precompile

then push all compiles files and manifest file to server.

I use mina+puma+nginx to deploy my Rails 5 application, I got

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

check config/environments/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 already handles this, config it 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;
}

things will work fine.

If somebody get here with the same error in the test environment as I do, here's what helped me:

rails assets:clobber assets:precompile RAILS_ENV=test

then:

ps axu | grep your-username

to find spring server process and his PID then kill it via:

kill <spring-server-PID>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top