ไม่มีเส้นทางที่ตรงกับ [GET] / เนื้อหา


143

ฉันมีแอพ Rails ที่ฉันพยายามทดสอบในสภาพแวดล้อมการผลิต ฉันวิ่ง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?

คำตอบ:


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หรือใช้เซิร์ฟเวอร์จริงเช่น Apache หรือ Nginx ซึ่งจะให้บริการสินทรัพย์คงที่ ฉันสงสัยว่า Pow อาจทำได้เช่นกัน


หากคุณใช้ Heroku พวกเขาแนะนำให้ใช้rails_12factorอัญมณีซึ่งเปิดใช้งานการตั้งค่านี้เป็นค่าเริ่มต้น วางอัญมณีลงในproductionกลุ่มของคุณGemfileเช่นนี้

group :production do
  gem 'rails_12factor'
end

5
ใครรู้ว่านี่เป็นวิธีแก้ปัญหาดังกล่าวเมื่อปรับใช้กับ heroku?
Kyle Clegg

คำตอบที่ชัดเจนขอบคุณมาก ฉันมาที่หน้านี้ขณะที่ฉันกำลังทดสอบสภาพแวดล้อมการผลิตโดยใช้thinบนเครื่องพัฒนาของฉัน ฉันกำลังรวบรวมสินทรัพย์ แต่application.cssว่างเปล่าและบันทึกเซิร์ฟเวอร์ให้ข้อผิดพลาดของ OP
veritas1

2
ในทางรถไฟ 4 config.serve_static_filesมันจะเป็น config.serve_static_assetsเลิกใช้แล้วและจะถูกลบใน Rails 5
sampi

การปรับใช้กับการกระจาย RHEL ฉันไม่ได้สัมผัสกับการกำหนดค่าสภาพแวดล้อมเริ่มต้นเพิ่งเพิ่ม rails_12factor gem ใน Rails v4.2.4 ตอนนี้ทุกอย่างก็โอเค ขอบคุณมาก
Onur Kucukkece

1
@Onur: ซึ่งหมายความว่าแอปพลิเคชัน Rails ของคุณจะให้บริการเนื้อหามากกว่าเว็บเซิร์ฟเวอร์ของคุณ ฉันไม่แนะนำการกำหนดค่านี้เลยเพราะจะทำให้เซิร์ฟเวอร์ Rails ของคุณช้าลง
Ryan Bigg

12

เพิ่มสิ่งที่ Ryan กล่าวไว้ข้างต้นคู่มือการวางท่อของ Rails อธิบายวิธีตั้งค่า Apache หรือ nginx เพื่อให้บริการสินทรัพย์คงที่สำหรับคุณ

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

คุณควรตั้งค่า nginx หรือ Apache ให้บริการสินทรัพย์แบบคงที่เนื่องจากมันเหมาะสำหรับภารกิจนี้มากกว่า mongrel / thin / unicorn


7

เพิ่งแก้ไขปัญหาเดียวกัน ในกรณีของฉันคำตอบของไรอันไม่เป็นประโยชน์ Bratsche ชี้ไปที่ Rails Guide แต่น่าเสียดายที่นี่ไม่ได้ผลสำหรับฉันเช่นกัน อย่างไรก็ตามทรัพยากรมีประโยชน์ ดังนั้นฉันจึงใช้การกำหนดค่า 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

แน่นอนคุณไม่จำเป็นต้องแก้ไขการกำหนดค่าเริ่มต้นใด ๆ คุณเพียงแค่สินทรัพย์ recompile ยื่นอีกครั้ง

ลบสาธารณะ / สินทรัพย์

1. สินทรัพย์ rke: clobber RAILS_ENV = ผลิต

รวบรวมสินทรัพย์

2. สินทรัพย์keke: precompile RAILS_ENV = การผลิต

3. เซิร์ฟเวอร์เริ่มต้นใหม่เช่น (nginx)


@ SteveO7 เห็นได้ชัดว่า Rails ใช้ pipleline สินทรัพย์ในโหมด dev โดยค่าเริ่มต้น
Albert.Qing

2

Rails 4.2 ได้เพิ่ม / เปลี่ยนแปลงบรรทัดนี้ในไฟล์ config / environment / staging.rb และ production.rb ของคุณ:

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

หาก RAILS_SERVE_STATIC_FILES ไม่ได้ถูกตั้งค่าและคุณเป็นสินทรัพย์บริการจากเซิร์ฟเวอร์ Rails ของคุณ (เช่นเดียวกับยูนิคอร์น) มันจะเริ่มต้นที่ "false" และ RoutingError จะเกิดขึ้น

นี่เป็นการแก้ไขที่ง่าย:

config.serve_static_files = true

ขอบคุณนี่เป็นตัวเลือกที่ง่ายที่สุด การกำหนดค่ามักจะขึ้นอยู่กับสภาพแวดล้อมของเซิร์ฟเวอร์และทำให้สามารถกำหนดค่าด้วยตัวแปร env ได้ดี
akostadinov

2

ใน Rails 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")

ตรวจสอบ config / environment / 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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.