OOZOU
تواصلوا معنا
العودة إلى المدونة

Rack، الأساس الخفي لكل تطبيق ويب رائع بلغة Ruby

يُستخدم Rack في كل إطار عمل تقريبًا يعمل على Ruby، ومع ذلك لا يفهم كثير من مطوري Rails ما هو أو كيف يعمل. وفهم Rack يجعل هذه الأطر أقل رهبة، وهو أسهل مما تتوقعون حين تلقون نظرة عليه.

18 نوفمبر 2020
4 دقائق للقراءة
Rack، الأساس الخفي لكل تطبيق ويب رائع بلغة Ruby

واجهة Rack ومبادئها بسيطة جدًا في الواقع، كل ما في الأمر أننا لا نحتاج عادة إلى التفكير فيها عند العمل مع Rails أو Sinatra أو Hanami أو غيرها من الأطر المبنية فوق Rack.

إذن ما الذي يفعله Rack فعلًا؟

إنه واجهة بين خادم الويب وكود تطبيقكم! يستمع Rack إلى خادم الويب عبر handler، ثم يستدعي تطبيقكم بوسيط واحد هو Rack Environment. وللالتزام بهذه الواجهة، يجب أن يُرجع تطبيقكم مصفوفة من 3 عناصر: الحالة (status) والـ headers والمحتوى (body). يجب أن تكون الحالة عددًا صحيحًا يطابق رمز حالة HTTP صالحًا. ويجب أن تكون الـ headers عبارة عن hash من أزواج المفاتيح والقيم. وأخيرًا يجب أن يكون الـ body كائنًا يستجيب لـ each، وعادة ما يكون مصفوفة من السلاسل النصية.

مرحبًا يا عالم؟

لنبنِ أول تطبيق Rack. يأتي Rack مزودًا بـ handlers جاهزة لعدة خوادم ويب، وسنستخدم أحدها.

# hello_world.rb
require 'rack'

class HelloWorld
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello, World!"]]
  end
end
Rack::Handler::WEBrick.run HelloWorld.new

شغّلوه الآن وزوروا localhost:8080

ruby hello_world.rb

لنحوّل تطبيق Hello, World! إلى تطبيق Rack حقيقي

التطبيق أعلاه يُستدعى عبر الملف التنفيذي ruby، لكن Rack يوفر ملفًا تنفيذيًا اسمه rackup لتشغيل تطبيقات Rack. يتوقع هذا الملف وجود ملف في جذر تطبيقكم اسمه config.ru (اختصار r[ack]u[p])، ويُستخدم لإعداد سلسلة الـ middleware في Rack.

require 'thin'

class HelloWorld
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello, World!\n"]]
  end
end

class GoodbyeWorld
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)
    body << "Goodbye, World!\n"
    [status, headers, body]
  end
end

use GoodbyeWorld
run HelloWorld.new

حوّلنا الآن سكربت Rack إلى إعداد تطبيق Rack، وأجرينا أيضًا بعض التغييرات. استدعينا خادم الويب thin الذي يبدّل الـ handler تلقائيًا. وأضفنا أول middleware إلى السلسلة، وهو GoodbyeWorld. وأخيرًا صار بإمكاننا استخدام methods لغة Rack الخاصة (DSL)، وهي use وrun. فما الذي يفعله هذا الـ middleware؟ في هذه الحالة نشغّل التطبيق أولًا، ثم نضيف عبارة "Goodbye, World!" إلى محتوى الاستجابة. ويمكننا أن نفعل بالـ middleware أشياء أخرى أكثر واقعية. لنضف أداة بسيطة لقياس الأداء (profiler).

require 'thin'

class HelloWorld
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello, World!\n"]]
  end
end
class GoodbyeWorld
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)
    body << "Goodbye, World!\n"
    [status, headers, body]
  end
end

class Benchmarker
  def initialize(app)
    @app = app
  end

  def call(env)
    start_time = current_time
    status, headers, body = @app.call(env)
    end_time = current_time
    body << "Took #{end_time - start_time} seconds to complete"
    [status, headers, body]
  end

  def current_time
    Time.now.to_f * 1000
  end
end

use Benchmarker
use GoodbyeWorld
run HelloWorld.new

تعديل الـ Environment

حتى الآن عرضنا فقط كيف نغلّف التطبيق، فلنغيّر ذلك بحيث نعدّل الـ environment فقط. الأمر بسيط: بدلًا من استدعاء التطبيق ثم تعديل الاستجابة، نعدّل env أولًا ثم نستدعي التطبيق.

require 'thin'

class HelloWorld
  def call(env)
    if env['flip'] == 'heads'
      [200, {"Content-Type" => "text/plain"}, ["Hello, World!\n"]]
    else
      [401, {"Content-Type" => "text/plain"}, ["Naughty naughty\n"]]
    end
  end
end

class CoinFlip
  def initialize(app)
    @app = app
  end

  def call(env)
    env['flip'] = %w[heads tails].sample
    @app.call(env)
  end
end

use CoinFlip
run HelloWorld.new

إيقاف التنفيذ

إذا أرجع أي middleware استجابة، فلن تُعالَج بقية السلسلة. وتستفيد من ذلك بعض أدوات middleware في Rack مثل rack-attack، التي تمنع المهاجمين من إرسال طلبات خبيثة إلى تطبيقنا. لنعدّل المنطق بحيث تفوز طلباتنا عشوائيًا.

require 'thin'

class HelloWorld
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello, World!\n"]]
  end
end

class CoinFlip
  def initialize(app)
    @app = app
  end

  def call(env)
    if %w[heads tails].sample == 'heads'
      @app.call(env)
    else
      [200, {"Content-Type" => "text/plain"}, ["Winner winner chicken dinner!\n"]]
    end
  end
end

class GoodbyeWorld
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)
    body << "Goodbye, World!\n"
    [status, headers, body]
  end
end

use CoinFlip
use GoodbyeWorld
run HelloWorld.new

Related Articles

كيف أصمّم برمجيات؟ دليل المبتدئين لأصحاب الأعمال

كيف أصمّم برمجيات؟ دليل المبتدئين لأصحاب الأعمال

تصميم البرمجيات عملية ممتعة لكنها معقدة، تتطلب الإبداع والتفكير المنطقي ومهارات حل المشكلات.

اقرأوا المزيد
مستقبل الحوسبة الطرفية: ما تحتاج الشركات إلى معرفته

مستقبل الحوسبة الطرفية: ما تحتاج الشركات إلى معرفته

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

اقرأوا المزيد
مستقبل قطاع التجزئة: الذكاء الاصطناعي والواقع المعزّز واتجاهات التحوّل الرقمي

مستقبل قطاع التجزئة: الذكاء الاصطناعي والواقع المعزّز واتجاهات التحوّل الرقمي

يتطور قطاع التجزئة بوتيرة غير مسبوقة بفضل الذكاء الاصطناعي (AI) والواقع المعزّز (AR) وتقنيات التحوّل الرقمي. فلم تعد المتاجر التقليدية مجرد أماكن لبيع المنتجات، بل أصبحت متاجر ذكية وتفاعلية.

اقرأوا المزيد

Have a Project in Mind?

Let's discuss how we can help bring your ideas to life with our expertise in web and mobile development.

ابدأوا المحادثةhello@oozou.com
OOZOU Logo

بانكوك · سنغافورة · هونغ كونغ

X
Facebook
Instagram
LinkedIn
OOZOU Co., Ltd.
548 One City Centre
Ploenchit Road
Bangkok 10330
Thailand
+66 2544 0000
hello@oozou.com

الخدمات

  • تطوير الويب
  • وكلاء الذكاء الاصطناعي والذكاء الاصطناعي التوليدي
  • تطوير تطبيقات الجوال
  • تحليلات البيانات وهندستها
  • تصميم تجربة المستخدم وواجهته (UX/UI) وتصميم المنتجات
  • التحوّل الرقمي

الشركة

  • من نحن
  • الوظائف
  • المدونة
  • دراسات الحالة
  • عروض حية
  • تعلّمت اليوم
  • تواصل معنا

المزيد

  • القطاعات
  • شبكة الشركاء
© 2026 OOZOU. جميع الحقوق محفوظة.
سياسة الخصوصيةمدونة قواعد السلوكسياسة مكافحة الرشوة والفساد