ريلز مع Rack

من موسوعة حسوب

يغطي هذا الدليل دمج ريلز مع Rack والتفاعل مع مكونات Rack الأخرى.

بعد قراءة هذا الدليل، ستتعلم:

  • كيفية استخدام برمجيات Rack الوسيطة في تطبيقات ريلز الخاصة بك.
  • حزمة البرمجيات الوسيطة الداخلية لـ Action Pack.
  • كيفية تعريف مكدس برنامج وسيط مخصص (custom Middleware stack).

تحذير: يفترض هذا الدليل معرفة عملية ببروتوكول Rack وبمفاهيم Rack مثل البرمجيات الوسيطة (middlewares) وخرائط url و Rack::Builder.

مقدمة إلى Rack

يوفر Rack واجهة دنيا، ومركبة من وحدات، وقابلة للتهيئة لتطوير تطبيقات الويب في روبي. من خلال تغليف طلبات واستجابات HTTP بأبسط طريقة ممكنة، فهو يوحد ويقسم واجهة برمجة التطبيقات لخوادم الويب وأطر الويب والبرامج في ما بين (ما يسمى بالبرامج الوسيطة) في استدعاء تابع واحد.

شرح كيف يعمل Rack ليس في نطاق هذا الدليل. في حال لم تكن على دراية بأساسيات Rack، يجب عليك مراجعة قسم الموارد أدناه.

ريلز مع Rack

كائن Rack لتطبيق ريلز

Rails.application هو كائن تطبيق Rack الأساسي لتطبيق ريلز. يجب أن يكون أي خادم ويب متوافق مع Rack يستخدم الكائن Rails.application لخدمة تطبيق ريلز.

rails server

ينفِّذ rails server المهمة الأساسية لإنشاء كائن Rack::Server وبدء تشغيل خادم الويب.

فيما يلي كيفية إنشاء 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

rackup

لاستخدام rackup بدلًا من rails server لريلز، يمكنك وضع الشيفرة التالية في config.ru في مجلد جذر تطبيق ريلز الخاص بك:

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

وشغل الخادم:

$ rackup config.ru

لمعرفة المزيد حول خيارات rackup المختلفة، يمكنك تنفيذ الأمر:

$ rackup --help

التطوير وإعادة التحميل التلقائي

تُحمَّل البرمجيات الوسيطة مرةً واحدةً ولا تراقب التغييرات. سيكون عليك إعادة تشغيل الخادم حتى تنعكس التغييرات التي تجريها في التطبيق قيد التشغيل.

حزمة البرمجيات الوسيطة في Action Dispatcher

تُنفَّذ العديد من المكونات الداخلية لـ Action Dispatcher كبرامج وسيطية لـ Rack.

Rails::Application يستخدم ActionDispatch::MiddlewareStack لدمج مختلف البرامج الوسيطة الداخلية والخارجية لتشكيل تطبيق ريلز متكامل مع Rack.

ملاحظة: ActionDispatch::MiddlewareStack هو مكافئ ريلز الذي يقابل Rack::Builder، ولكن صُمم لتوفير مرونة أفضل وميزات أكثر لتلبية متطلبات ريلز.

فحص حزمة البرامج الوسيطة

لدى ريلز مهمة سهلة لفحص حزمة البرامج الوسيطة قيد الاستخدام:

$ bin/rails middleware

بالنسبة لتطبيق ريلز أُنشِئ حديثًا، فقد ينتج عن هذا الأمر ما يلي:

use Rack::Sendfile
use ActionDispatch::Static
use ActionDispatch::Executor
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::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

البرامج الوسيطية الافتراضية الموضحة هنا (وبعضها الآخر) في قسم البرامج الوسيطة الداخلية، أدناه.

ضبط حزمة البرامج الوسيطة

يوفر ريلز واجهة ضبط بسيطة config.middleware لإضافة أو إزالة وتعديل البرامج الوسيطة في حزمة البرامج الوسيطة عبر application.rb أو ملف الضبط الخاص بالبيئة environments/<environment>.rb.

إضافة برنامج وسيط

لإضافة برنامج وسيط جديد إلى حزمة البرامج الوسيطة، استخدم أي من التوابع التالية:

  • config.middleware.use(new_middleware, args)‎- يضيف البرنامج الوسيط الجديد في أسفل حزمة البرامج الوسيطة.
  • config.middleware.insert_before(existing_middleware, new_middleware, args)‎ - يضيف البرنامج الوسيط الجديد قبل البرنامج الوسيط المحدد الموجود في حزمة البرامج الوسيطة.
  • config.middleware.insert_after(existing_middleware, new_middleware, args)‎ - يضيف البرنامج الوسيط الجديد بعد البرنامج الوسيط الحالي المحدد في حزمة البرامج الوسيطة.
# config/application.rb
 
# في الأسفل Rack::BounceFavicon إضافة
config.middleware.use Rack::BounceFavicon
 
# ActionDispatch::Executor بعد Lifo::Cache إضافة
# Lifo::Cache إلى { page_cache: false } تمرير الوسيط
config.middleware.insert_after ActionDispatch::Executor, Lifo::Cache, page_cache: false

تبديل برنامج وسيط

يمكنك تبديل برنامج وسيط موجودة في حزمة البرامج الوسيطة باستخدام config.middleware.swap.

# config/application.rb
 
# ActionDispatch::ShowExceptions مكان Lifo::ShowExceptions تبديل
config.middleware.swap ActionDispatch::ShowExceptions, Lifo::ShowExceptions

حذف برنامج وسيط

أضف الأسطر التالية إلى ضبط التطبيق الخاص بك:

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

والآن، إذا فحصت حزمة البرامج الوسيطة، ستجد أن Rack::Runtime ليس جزءًا منها.

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

إذا كنت ترغب في إزالة البرامج الوسيطة ذات الصلة بالجلسة، قم بما يلي:

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

و لإزالة البرامج الوسيطة ذات الصلة بالمتصفح:

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

حزمة البرامج الوسيطة الداخلية

تُنفذ الكثير من وظائف وحدة التحكم كبرامج وسيطة. توضح القائمة التالية الغرض من كل منها:

  • Rack::Sendfile: يُعين الترويسة X-Sendfile المخصصة بالخادم. اضبط هذا عبر الخيار config.action_dispatch.x_sendfile_header.
  • ActionDispatch::Static: يُستخدَم لخدمة ملفات ثابتة من المجلد العام. يُعطَّل إذا كان config.public_file_server.enabled مضبوطًا إلى القيمة false.
  • Rack::Lock: يضبط الراية ["env["rack.multithread إلى القيمة false ويغلف التطبيق داخل كائن Mutex.
  • ActionDispatch::Executor: يُستخدَم لتحميل الخيط الشيفرة بشكل آمن أثناء التطوير.
  • ActiveSupport::Cache::Strategy::LocalCache::Middleware: يُستخدَم للتخزين المؤقت للذاكرة. ذاكرة التخزين المؤقت هذه ليست آمنة للخيوط.
  • Rack::Runtime: يُعيِّن الترويسة X-Runtime التي تحتوي على الوقت (بالثواني) المستغرق لتنفيذ الطلب.
  • Rack::MethodOverride: يسمح باستبدال تابع محدَّد إذا جرى تعيين params[:_method]‎. هذه هي البرامج الوسيطة التي تدعم أنواع التوابع PUT و DELETE لطلبيات HTTP.
  • ActionDispatch::RequestId: يجعل الترويسة X-Request-Id الفريدة متاحةً للاستجابة ويفعِّل التابع ActionDispatch::Request.request_id.
  • ActionDispatch::RemoteIp: يتحقق من هجمات انتحال IP.
  • Sprockets::Rails::QuietAssets: يخفي مخرجات المسجل المتعلقة بطلبات الأصول.
  • Rails::Rack::Logger: إعلام السجلات التي بدأت الطلب. بعد اكتمال الطلب، تمسح جميع السجلات.
  • ActionDispatch::ShowExceptions: يُنقذ أي استثناء أعيد من قبل التطبيق ويستدعي تطبيق الاستثناءات الذي سيغلفه بتنسيق يمكن عرضه على المستخدم النهائي.
  • ActionDispatch::DebugExceptions: مسؤول عن تسجيل الاستثناءات وعرض صفحة تنقيح الأخطاء في حالة الطلب المحلي.
  • ActionDispatch::Reloader: يوفر الاستعدادات وعمليات المسح، التي تهدف إلى المساعدة في إعادة تحميل التعليمات البرمجية أثناء التطوير.
  • ActionDispatch::Callbacks: يوفر الاستدعاءات لتُنفَّذ قبل وبعد إرسال الطلب.
  • ActiveRecord::Migration::CheckPending: يتحقق من عمليات التهجير المعلقة ويرفع الاستثناء ActiveRecord::PendingMigrationError في حالة وجود أي عمليات تهجير معلقة.
  • ActionDispatch::Cookies: يعين ملفات تعريف الارتباط للطلب.
  • ActionDispatch::Session::CookieStore: مسؤول عن تخزين الجلسة في ملفات تعريف الارتباط.
  • ActionDispatch::Flash: يضبط مفاتيح الوصول اللحظي (flash keys). متاح فقط في حالة تعيين config.action_controller.session_store إلى أي قيمة.
  • ActionDispatch::ContentSecurityPolicy::Middleware: يوفر لضبط الترويسة Content-Security-Policy.
  • Rack::Head: يحول طلبات HEAD إلى طلبات GET ويخدمهم على هذا النحو.
  • Rack::ConditionalGet: إضافة دعم لـ "طلبيات GET الشرطية" حتى لا يرد الخادم بشيء إذا لم تتغير الصفحة.
  • Rack::ETag: يضيف الترويسة ETag على جميع جسم السلسلة النصية. تُستخدَم ترويسات ETag للتحقق من صحة ذاكرة التخزين المؤقت
  • Rack::TempfileReaper: يمسح الملفات المؤقتة المستخدم لتخفيف طلبات متعددة الأجزاء.

تنبيه: من الممكن استخدام أي من البرامج الوسيطة المذكورة أعلاه في حزمة Rack المخصصة بك.

مراجع

تعلم Rack

فهم البرامج الوسيطة

مصادر