edge
เพิ่มเติมที่ rubyonrails.org: เพิ่มเติมเกี่ยวกับ Ruby on Rails

เรลส์บนแร็ก

เอกสารนี้เป็นคู่มือการรวมเรลส์กับแร็กและการติดต่อกับคอมโพเนนต์แร็กอื่น ๆ

หลังจากอ่านเอกสารนี้คุณจะรู้:

คำเตือน: เอกสารนี้ถือว่าคุณมีความรู้พื้นฐานเกี่ยวกับโปรโตคอลแร็กและแนวคิดเกี่ยวกับแร็ก เช่น middlewares, URL maps, และ Rack::Builder.

1 แนะนำเกี่ยวกับแร็ก

แร็กให้ส่วนติดต่อที่เล็กที่สุด แบบโมดูลและสามารถปรับเปลี่ยนได้สำหรับการพัฒนาแอปพลิเคชันเว็บใน Ruby โดยการห่อหุ้มคำขอและการตอบกลับ HTTP ในวิธีที่ง่ายที่สุด มันรวมและสกัด API สำหรับเว็บเซิร์ฟเวอร์ เฟรมเวิร์กเว็บ และซอฟต์แวร์ต่าง ๆ ระหว่าง (ที่เรียกว่า middleware)

การอธิบายวิธีการทำงานของแร็กไม่ได้อยู่ในขอบเขตของเอกสารนี้ ในกรณีที่คุณไม่คุ้นเคยกับพื้นฐานของแร็กคุณควรตรวจสอบส่วน ทรัพยากร ด้านล่าง

2 เรลส์บนแร็ก

2.1 วัตถุแร็กของแอปพลิเคชันเรลส์

Rails.application เป็นวัตถุแอปพลิเคชันแร็กหลักของแอปพลิเคชันเรลส์ แม่แบบเว็บเซิร์ฟเวอร์แร็กใด ๆ ควรใช้วัตถุ Rails.application เพื่อให้บริการแอปพลิเคชันเรลส์

2.2 bin/rails server

bin/rails server ทำงานเบื้องต้นของการสร้างวัตถุ Rack::Server และเริ่มเว็บเซิร์ฟเวอร์

นี่คือวิธี bin/rails server สร้างอินสแตนซ์ของ Rack::Server

Rails::Server.new.tap do |server|
  require APP_PATH
  Dir.chdir(Rails.application.root)
  server.start
end

Rails::Server สืบทอดมาจาก Rack::Server และเรียกใช้วิธี Rack::Server#start ดังนี้:

class Server < ::Rack::Server
  def start
    # ...
    super
  end
end

2.3 rackup

หากต้องการใช้ rackup แทน bin/rails server คุณสามารถใส่โค้ดต่อไปนี้ใน config.ru ในไดเรกทอรีรากของแอปพลิเคชันเรลส์ของคุณ:

# Rails.root/config.ru
require_relative "config/environment"
run Rails.application

และเริ่มเซิร์ฟเวอร์:

$ rackup config.ru

หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือก rackup คุณสามารถเรียกใช้:

$ rackup --help

2.4 การพัฒนาและการโหลดอัตโนมัติ

Middlewares จะโหลดครั้งเดียวและไม่ได้ตรวจสอบการเปลี่ยนแปลง คุณต้องรีสตาร์ทเซิร์ฟเวอร์เพื่อให้การเปลี่ยนแปลงปรากฏในแอปพลิเคชันที่กำลังทำงาน

3 สแต็ก Middleware ของ Action Dispatcher

ส่วนใหญ่ของคอมโพเนนต์ภายในของ Action Dispatcher ถูกนำมาใช้เป็น Rack middlewares Rails::Application ใช้ ActionDispatch::MiddlewareStack เพื่อรวม middlewares ภายในและภายนอกต่าง ๆ เข้าด้วยกันเพื่อสร้างแอปพลิเคชันเรลส์แบบเต็มรูปแบบ

หมายเหตุ: ActionDispatch::MiddlewareStack เป็นเทียบเท่าของ Rails กับ Rack::Builder แต่ถูกสร้างขึ้นเพื่อให้ยืดหยุ่นและมีคุณสมบัติมากขึ้นเพื่อตอบสนองต่อความต้องการของ Rails

3.1 การตรวจสอบสแต็ก Middleware

Rails มีคำสั่งที่สะดวกสำหรับการตรวจสอบสแต็ก middleware ที่ใช้งานอยู่:

$ bin/rails middleware

สำหรับแอปพลิเคชันเรลส์ที่สร้างขึ้นใหม่เมื่อเร็ว ๆ นี้ อาจได้ผลลัพธ์ที่คล้ายกับนี้:

use ActionDispatch::HostAuthorization
use Rack::Sendfile
use ActionDispatch::Static
use ActionDispatch::Executor
use ActionDispatch::ServerTiming
use ActiveSupport::Cache::Strategy::LocalCache::Middleware
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use ActionDispatch::RemoteIp
use Sprockets::Rails::QuietAssets
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use WebConsole::Middleware
use ActionDispatch::DebugExceptions
use ActionDispatch::ActionableExceptions
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ContentSecurityPolicy::Middleware
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
use Rack::TempfileReaper
run MyApp::Application.routes

Middlewares เริ่มต้นที่แสดงที่นี่ (และอื่น ๆ) จะถูกสรุปในส่วน Internal Middlewares ด้านล่าง

3.2 การกำหนดค่าสแต็ก Middleware

Rails ให้ส่วนกำหนดค่าง่าย config.middleware สำหรับเพิ่ม ลบ และแก้ไข middlewares ในสแต็ก middleware ผ่าน application.rb หรือไฟล์กำหนดค่าสำหรับสภาพแวดล้อมที่เฉพาะเจาะจง environments/<environment>.rb

3.2.1 เพิ่ม Middleware

คุณสามารถเพิ่ม middleware ใหม่เข้าไปใน middleware stack โดยใช้วิธีการต่อไปนี้:

  • config.middleware.use(new_middleware, args) - เพิ่ม middleware ใหม่ที่ด้านล่างของ middleware stack

  • config.middleware.insert_before(existing_middleware, new_middleware, args) - เพิ่ม middleware ใหม่ก่อน middleware ที่ระบุใน middleware stack

  • config.middleware.insert_after(existing_middleware, new_middleware, args) - เพิ่ม middleware ใหม่หลัง middleware ที่ระบุใน middleware stack

# config/application.rb

# เพิ่ม Rack::BounceFavicon ที่ด้านล่าง
config.middleware.use Rack::BounceFavicon

# เพิ่ม Lifo::Cache หลัง ActionDispatch::Executor
# ส่งอาร์กิวเมนต์ { page_cache: false } ให้กับ Lifo::Cache
config.middleware.insert_after ActionDispatch::Executor, Lifo::Cache, page_cache: false

3.2.2 แทนที่ Middleware

คุณสามารถแทนที่ middleware ที่มีอยู่ใน middleware stack โดยใช้ config.middleware.swap.

# config/application.rb

# แทนที่ ActionDispatch::ShowExceptions ด้วย Lifo::ShowExceptions
config.middleware.swap ActionDispatch::ShowExceptions, Lifo::ShowExceptions

3.2.3 ย้าย Middleware

คุณสามารถย้าย middleware ที่มีอยู่ใน middleware stack โดยใช้ config.middleware.move_before และ config.middleware.move_after.

# config/application.rb

# ย้าย ActionDispatch::ShowExceptions ไปก่อน Lifo::ShowExceptions
config.middleware.move_before Lifo::ShowExceptions, ActionDispatch::ShowExceptions
# config/application.rb

# ย้าย ActionDispatch::ShowExceptions ไปหลัง Lifo::ShowExceptions
config.middleware.move_after Lifo::ShowExceptions, ActionDispatch::ShowExceptions

3.2.4 ลบ Middleware

เพิ่มบรรทัดต่อไปนี้ในการกำหนดค่าแอปพลิเคชันของคุณ:

# config/application.rb
config.middleware.delete Rack::Runtime

และตอนนี้หากคุณตรวจสอบ middleware stack คุณจะพบว่า Rack::Runtime ไม่ได้เป็นส่วนหนึ่งของมัน.

$ bin/rails middleware
(in /Users/lifo/Rails/blog)
use ActionDispatch::Static
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x00000001c304c8>
...
run Rails.application.routes

หากคุณต้องการลบ middleware เกี่ยวกับ session ทำตามขั้นตอนต่อไปนี้:

# config/application.rb
config.middleware.delete ActionDispatch::Cookies
config.middleware.delete ActionDispatch::Session::CookieStore
config.middleware.delete ActionDispatch::Flash

และเพื่อลบ middleware เกี่ยวกับเบราว์เซอร์,

# config/application.rb
config.middleware.delete Rack::MethodOverride

หากคุณต้องการให้เกิดข้อผิดพลาดเมื่อคุณพยายามลบรายการที่ไม่มีอยู่ใช้ delete! แทน.

# config/application.rb
config.middleware.delete! ActionDispatch::Executor

3.3 Internal Middleware Stack

ฟังก์ชันหลักของ Action Controller ถูกนำมาใช้เป็น Middlewares ดังต่อไปนี้:

ActionDispatch::HostAuthorization

  • ป้องกันการโจมตี DNS rebinding โดยอนุญาตเฉพาะโฮสต์ที่สามารถส่งคำขอได้ ดูคำแนะนำในการกำหนดค่าได้ที่ configuration guide.

Rack::Sendfile

  • ตั้งค่าเซิร์ฟเวอร์ให้มีส่วนหัว X-Sendfile ที่เฉพาะเจาะจง กำหนดค่านี้ผ่านตัวเลือก config.action_dispatch.x_sendfile_header.

ActionDispatch::Static

  • ใช้ในการให้บริการไฟล์สถิติจากไดเรกทอรี public ถูกปิดใช้งานหาก config.public_file_server.enabled เป็น false.

Rack::Lock

  • ตั้งค่า env["rack.multithread"] เป็น false และห่อแอปพลิเคชันด้วย Mutex.

ActionDispatch::Executor

  • ใช้สำหรับการโหลดโค้ดในรูปแบบที่ปลอดภัยสำหรับการพัฒนา.

ActionDispatch::ServerTiming

  • ตั้งค่าส่วนหัว Server-Timing ที่มีข้อมูลเกี่ยวกับประสิทธิภาพของคำขอ.

ActiveSupport::Cache::Strategy::LocalCache::Middleware

  • ใช้สำหรับการเก็บแคชในหน่วยความจำ แคชนี้ไม่ปลอดภัยในกรณีใช้งานหลายเธรด.

Rack::Runtime

  • ตั้งค่าส่วนหัว X-Runtime ที่มีเวลา (เป็นวินาที) ที่ใช้ในการประมวลผลคำขอ.

Rack::MethodOverride

  • อนุญาตให้แก้ไขวิธีการหากตั้งค่า params[:_method] ถูกตั้งค่า นี่คือ middleware ที่รองรับวิธีการ HTTP แบบ PUT และ DELETE.

ActionDispatch::RequestId

  • ทำให้สามารถใช้งาน X-Request-Id ที่ไม่ซ้ำกันในส่วนหัวของการตอบสนองและเปิดใช้งานเมธอด ActionDispatch::Request#request_id.

ActionDispatch::RemoteIp

  • ตรวจสอบการโจมตี IP spoofing.

Sprockets::Rails::QuietAssets

  • ยับยั้งการแสดงผลของล็อกเกอร์สำหรับคำขอทรัพยากร.

Rails::Rack::Logger

  • แจ้งให้ล็อกทราบว่าคำขอเริ่มต้นแล้ว หลังจากคำขอเสร็จสิ้น จะล้างล็อกทั้งหมด.

ActionDispatch::ShowExceptions

  • ช่วยแก้ไขข้อผิดพลาดที่ถูกส่งกลับจากแอปพลิเคชันและเรียกใช้แอปที่จัดรูปให้เหมาะสมสำหรับผู้ใช้สุดท้าย. ActionDispatch::DebugExceptions

  • รับผิดชอบในการบันทึกข้อผิดพลาดและแสดงหน้าต่างการแก้ปัญหาในกรณีที่คำขอเป็นท้องถิ่น

ActionDispatch::ActionableExceptions

  • ให้วิธีการส่งการกระทำจากหน้าข้อผิดพลาดของ Rails

ActionDispatch::Reloader

  • ให้การเตรียมและล้างคำขอสำหรับการโหลดโค้ดในระหว่างการพัฒนา

ActionDispatch::Callbacks

  • ให้การเรียกใช้งานก่อนและหลังการส่งคำขอ

ActiveRecord::Migration::CheckPending

  • ตรวจสอบการโยกย้ายที่รอดำเนินการและเรียก ActiveRecord::PendingMigrationError ถ้ามีการโยกย้ายที่รอดำเนินการ

ActionDispatch::Cookies

  • ตั้งค่าคุกกี้สำหรับคำขอ

ActionDispatch::Session::CookieStore

  • รับผิดชอบในการเก็บรักษาเซสชันในคุกกี้

ActionDispatch::Flash

  • ตั้งค่าคีย์แฟลช สามารถใช้ได้เฉพาะเมื่อ config.session_store ถูกตั้งค่าเป็นค่า

ActionDispatch::ContentSecurityPolicy::Middleware

  • ให้ DSL เพื่อกำหนดค่าส่วนหัว Content-Security-Policy

Rack::Head

  • แปลงคำขอ HEAD เป็นคำขอ GET และให้บริการเป็นเช่นนั้น

Rack::ConditionalGet

  • เพิ่มการสนับสนุน "Conditional GET" เพื่อให้เซิร์ฟเวอร์ตอบกลับโดยไม่มีอะไรถ้าหน้าเว็บไม่เปลี่ยนแปลง

Rack::ETag

  • เพิ่มส่วนหัว ETag ใน String bodies ทั้งหมด ETag ใช้สำหรับการตรวจสอบแคช

Rack::TempfileReaper

  • ทำความสะอาดไฟล์ชั่วคราวที่ใช้เพื่อเก็บข้อมูลคำขอแบบหลายส่วน

เคล็ดลับ: คุณสามารถใช้ Middleware ใดก็ได้จากที่กล่าวมาข้างต้นใน Rack stack ที่กำหนดเองได้

4 ทรัพยากร

4.1 เรียนรู้เกี่ยวกับ Rack

4.2 เข้าใจเกี่ยวกับ Middlewares

ข้อเสนอแนะ

คุณสามารถช่วยปรับปรุงคุณภาพของคู่มือนี้ได้

กรุณาช่วยเพิ่มเติมหากพบข้อผิดพลาดหรือข้อผิดพลาดทางความจริง เพื่อเริ่มต้นคุณสามารถอ่านส่วน การสนับสนุนเอกสาร ของเราได้

คุณอาจพบเนื้อหาที่ไม่สมบูรณ์หรือเนื้อหาที่ไม่ได้อัปเดต กรุณาเพิ่มเอกสารที่ขาดหายไปสำหรับเนื้อหาหลัก โปรดตรวจสอบ Edge Guides ก่อนเพื่อตรวจสอบ ว่าปัญหาได้รับการแก้ไขหรือไม่ในสาขาหลัก ตรวจสอบ คู่มือแนวทาง Ruby on Rails เพื่อดูรูปแบบและกฎเกณฑ์

หากคุณพบข้อผิดพลาดแต่ไม่สามารถแก้ไขได้เอง กรุณา เปิดปัญหา.

และสุดท้าย การสนทนาใด ๆ เกี่ยวกับ Ruby on Rails เอกสารยินดีต้อนรับที่สุดใน เว็บบอร์ดอย่างเป็นทางการของ Ruby on Rails.