ريلز مع 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 المخصصة بك.