Không có tuyến nào khớp với [GET] / tài sản


143

Tôi có một ứng dụng Rails mà tôi đang thử nghiệm trong môi trường sản xuất. Tôi đã chạy RAILS_ENV=production rake assets:precompilemà tạo ra tất cả tài sản của tôi trong / công / tài sản. Vấn đề là khi tôi khởi động ứng dụng của mình, RAILS_ENV=production rails s thintôi sẽ nhận được:

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

Tập tin này không tồn tại mặc dù tại /public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css.

Bất kỳ suy nghĩ về lý do tại sao tôi nhận được điều này RoutingError?

Câu trả lời:


230

Trong chế độ sản xuất, Rails sẽ không chịu trách nhiệm phục vụ các tài sản tĩnh. Do đó, bạn đang nhận được lỗi này. Thin cũng sẽ không làm điều đó, vì nó chỉ là một vỏ bọc xung quanh Rails.

Điều này được kiểm soát bởi cài đặt này config/environments/production.rbtrong ứng dụng của bạn:

config.serve_static_files = false

Hoặc trong Rails 5:

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

Hoặc đặt ENV['RAILS_SERVE_STATIC_FILES']thành đúng.

Bạn có thể đặt thành đó truehoặc sử dụng một máy chủ thực như Apache hoặc Nginx sẽ phục vụ các tài sản tĩnh. Tôi nghi ngờ Pow cũng có thể làm điều đó.


Nếu bạn đang ở Heroku, họ khuyên bạn nên sử dụng rails_12factorđá quý cho phép cài đặt này theo mặc định. Đặt đá quý vào một productionnhóm trong của bạn Gemfile, như thế này:

group :production do
  gem 'rails_12factor'
end

5
Bất cứ ai cũng biết nếu đây là một giải pháp cho vấn đề đã nói khi triển khai lên heroku?
Kyle Clegg

Câu trả lời rõ ràng, cảm ơn nhiều. Tôi đã vào trang này khi tôi đang thử nghiệm môi trường sản xuất bằng cách sử dụng thinmáy phát triển của mình. Tôi đã biên dịch tài sản nhưng application.csstrống và nhật ký máy chủ đã báo lỗi của OP.
veritas1

2
Trong Rails 4 nó sẽ được config.serve_static_files. config.serve_static_assetskhông được chấp nhận và sẽ bị xóa trong Rails 5.
sampi

Triển khai bản phân phối RHEL, tôi chưa chạm vào cấu hình môi trường mặc định, chỉ cần thêm đá quý rails_12factor trong Rails v4.2.4, bây giờ mọi thứ đều ổn. Cảm ơn rất nhiều
Onur Kucukkece

1
@Onur: Điều này có nghĩa là ứng dụng Rails của bạn sẽ phục vụ các tài sản, thay vì máy chủ web của bạn. Tôi hoàn toàn không khuyến nghị cấu hình này vì nó có thể làm cho máy chủ Rails của bạn chậm hơn.
Ryan Bigg

12

Thêm vào những gì Ryan đã nói ở trên, hướng dẫn đường dẫn tài sản Rails mô tả cách thiết lập Apache hoặc nginx để phục vụ các tài sản tĩnh cho bạn.

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

Bạn thực sự nên thiết lập nginx hoặc Apache để phục vụ các tài sản tĩnh, vì chúng được tối ưu hóa tốt hơn cho nhiệm vụ này so với mongrel / thin / unicorn.


7

Chỉ cần giải quyết vấn đề tương tự. Trong trường hợp của tôi, câu trả lời của Ryan không hữu ích. Bratsche chỉ vào Hướng dẫn Rails, tiếc là điều này cũng không hiệu quả với tôi. Tuy nhiên, tài nguyên là hữu ích. Vì vậy, tôi lấy cấu hình Nginx từ đó và thêm chỉ thị gốc , chỉ vào thư mục công cộng. Không có cái này thì nó không hoạt động.

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

     add_header ETag "";
     break;
   }

Khởi động lại nginx, và đó là nó.


3

Thật vậy, bạn không cần phải sửa đổi bất kỳ cấu hình mặc định. Bạn chỉ cần biên dịch lại tập tin tài sản một lần nữa .

xóa công khai / tài sản

Tài sản 1.rake: clobber RAILS_ENV = sản xuất

biên dịch tài sản

2.rake tài sản: tiền biên dịch RAILS_ENV = sản xuất

3. máy chủ khởi động, ví dụ (nginx)


@ SteveO7, rõ ràng, đường ray sử dụng pipleline tài sản ở chế độ dev theo mặc định.
Albert.Qing

2

Rails 4.2 đã thêm / thay đổi dòng này trong các tệp cấu hình / môi trường / staging.rb và Production.rb của bạn:

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

Nếu RAILS_SERVE_STATIC_FILES không được đặt và bạn là tài sản dịch vụ từ máy chủ Rails của bạn (như với Unicorn), thì nó sẽ mặc định là "false" và RoutingError sẽ xảy ra.

Đây là một cách sửa chữa dễ dàng:

config.serve_static_files = true

Cảm ơn, đây là lựa chọn đơn giản nhất. Cấu hình thường phụ thuộc vào môi trường máy chủ và làm cho nó có thể cấu hình với biến env là tốt.
akostadinov

2

Trong rails 5, config.serve_static_filestùy chọn đã thay đổi, vì vậy bây giờ bạn cần phải có

config.public_file_server.enabled = true

để phục vụ tài sản tại địa phương.


2

thử mã dưới đây:

cấu hình / môi trường / sản xuất.rb

config.assets.compile = true

sau đó chạy lệnh:

RAILS_ENV=production rake assets:precompile

sau đó đẩy tất cả các tệp biên dịch và tệp kê khai lên máy chủ.


1

Tôi sử dụng mina + puma + nginx để triển khai ứng dụng Rails 5 của mình, tôi đã nhận

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

kiểm tra cấu hình / môi trường / sản xuất.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 đã xử lý việc này , cấu hình nó đúng

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

mọi thứ sẽ hoạt động tốt.


1

Nếu ai đó đến đây với cùng một lỗi trong môi trường thử nghiệm như tôi, thì đây là điều đã giúp tôi:

rails assets:clobber assets:precompile RAILS_ENV=test

sau đó:

ps axu | grep your-username

để tìm spring servertiến trình và PID của anh ta sau đó giết nó thông qua:

kill <spring-server-PID>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.