Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
rabl-old — rabl 0.8.6 + إصلاح لـ CVE-2014-4671 | Kitploit
أدوات/GitHubGitHub/cph/rabl-old
أدوات عامةتحليل الثغرات الأمنيةأمن الويبأمن واجهات برمجة التطبيقاتArchived
GitHubcph/rabl-old

rabl-old

rabl 0.8.6 + إصلاح لـ CVE-2014-4671

عرض المستودع
منذ 9 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

RABL

Continuous Integration status Dependency Status

RABL (Ruby API Builder Language) هو نظام قوالب روبي مخصص لـ Rails و Padrino لتوليد JSON، XML، MessagePack، PList و BSON. عند استخدام طريقة 'to_json' الخاصة بـ ActiveRecord، أجد نفسي أرغب في حل أكثر تعبيرًا وقوة لتوليد واجهات برمجة التطبيقات (APIs). ويكون ذلك صحيحًا بشكل خاص عندما يكون تمثيل JSON معقدًا أو لا يتطابق مع المخطط الدقيق المحدد في قاعدة البيانات.

على وجه الخصوص، أرغب بسهولة في:

  • إنشاء عُقد عشوائية مسماة بناءً على دمج البيانات في كائن
  • تمرير وسيطات إلى الدوال وتخزين النتيجة كعقدة فرعية
  • عرض قوالب جزئية ووراثتها لتقليل تكرار الكود
  • إعادة تسمية أو تغيير أسماء الخصائص (attributes) لتغيير الاسم من النموذج
  • إلحاق خصائص من عقدة فرعية إلى عقدة أصلية
  • تضمين العُقد فقط إذا تحقق شرط معين

أي شخص جرب طريقة 'to_json' المستخدمة في ActiveRecord لتوليد استجابة JSON قد شعر بألم هذا النهج التقييدي. RABL هو نظام قوالب عام تم إنشاؤه لحل هذه المشكلات من خلال معالجة توليد استجابة API بطريقة جديدة تمامًا.

جوهر RABL هو الالتزام بمبادئ MVC من خلال تأجيل تمثيلات بيانات API إلى طبقة العرض (view) من تطبيقك. لمعرفة تفاصيل المفاهيم الخاطئة الشائعة حول RABL، يرجى الاطلاع على دليلنا فهم RABL والذي يمكن أن يساعد في توضيح أي ارتباك حول هذا المشروع.

تغييرات جوهرية

  • الإصدار v0.8.0 (تم الإصدار في 14 فبراير 2013) يزيل الاعتماد على multi_json ويعتمد على Oj (أو JSON) كمحلل JSON. يبسط الكود، ويزيل تبعية، لكن قد ترغب في إزالة أي إشارات إلى MultiJson.

  • الإصدار v0.6.14 (تم الإصدار في 28 يونيو 2012) يتطلب استخدام render_views مع RSpec لاختبار القوالب. وإلا، فإن المتحكم (controller) سيمرر ببساطة أمر render كما يفعل مع قوالب ERB.

التثبيت

تثبيت RABL كـ gem:``` gem install rabl

root@kitploit:~
أو أضف إلى Gemfile الخاص بك:```ruby
# Gemfile
gem 'rabl'
# Also add either `oj` or `yajl-ruby` as the JSON parser
gem 'oj'

وقم بتشغيل bundle install لتثبيت التبعية.

إذا كنت تستخدم Rails 2.3.8 (وما فوق) أو Rails 3.X أو Padrino، فإن RABL يعمل دون أي تكوين.

هام: مع Padrino، تأكد من أن gem rabl مدرج بعد padrino gem في ملف Gemfile، وإلا فلن يتم تسجيل Rabl بشكل صحيح كمحرك قوالب.

مع Sinatra، أو أي إطار عمل آخر قائم على tilt، قم ببساطة بتسجيل:```ruby Rabl.register!

root@kitploit:~
وسيتم تهيئة RABL وتكون جاهزة للاستخدام. لاستخدامها مع Sinatra، راجع دليل [Sinatra Usage](https://github.com/nesquena/rabl/wiki/Setup-for-Sinatra).

## نظرة عامة ##

يمكنك استخدام RABL لإنشاء واجهات برمجة تطبيقات تعتمد على JSON وXML من أي كائن Ruby. مع RABL، يتم اشتقاق البيانات عادةً بشكل أساسي من النماذج (غير مرتبطة بـ ORM) ويتم وصف تمثيل مخرجات API داخل قالب عرض باستخدام DSL بسيط للغة Ruby. يتيح لك ذلك الحفاظ على بياناتك منفصلة عن JSON أو XML التي ترغب في إخراجها.

بعد تثبيت RABL (الموضح أعلاه)، يمكنك إنشاء قالب عرض RABL ثم عرض القالب من تطبيقات Sinatra أو Padrino أو Rails الخاصة بك من وحدة التحكم (أو المسار) بسهولة بالغة. باستخدام [Padrino](http://padrinorb.com) كمثال، بافتراض أن لديك نموذج `Post` مملوء بمنشورات المدونة، يمكنك عرض تمثيل API (كل من JSON وXML) عن طريق إنشاء مسار:```ruby
# app/app.rb
get "/posts", :provides => [:json, :xml] do
  @user = current_user
  @posts = Post.order("id DESC")
  render "posts/index"
end

ثم يمكننا إنشاء قالب RABL التالي للتعبير عن مخرجات API الخاصة بـ @posts:```ruby

app/views/posts/index.rabl

collection @posts attributes :id, :title, :subject child(:user) { attributes :full_name } node(:read) { |post| post.read_by?(@user) }

root@kitploit:~
والتي ستخرج JSON أو XML التالي عند زيارة `http://localhost:3000/posts.json````js
[{  "post" :
  {
    "id" : 5, title: "...", subject: "...",
    "user" : { full_name : "..." },
    "read" : true
  }
}]

هذه نظرة عامة أساسية ولكن هناك الكثير لتراه مثل الأجزاء الجزئية، الوراثة، العقد المخصصة، إلخ. اقرأ التفاصيل الكاملة لـ RABL أدناه.

التكوين

صُمم RABL ليتطلب القليل من التكوين أو لا يتطلبه للعمل. هذا هو الحال في معظم السيناريوهات، ولكن اعتمادًا على احتياجاتك، قد ترغب في تعيين التكوينات العامة التالية في تطبيقك (هذه الكتلة اختيارية تمامًا):```ruby

config/initializers/rabl_init.rb

require 'rabl' Rabl.configure do |config|

Commented as these are defaults

config.cache_all_output = false

config.cache_sources = Rails.env != 'development' # Defaults to false

config.cache_engine = Rabl::CacheEngine.new # Defaults to Rails cache

config.perform_caching = false

config.escape_all_output = false

config.json_engine = nil # Class with #dump class method (defaults JSON)

config.msgpack_engine = nil # Defaults to ::MessagePack

config.bson_engine = nil # Defaults to ::BSON

config.plist_engine = nil # Defaults to ::Plist::Emit

config.include_json_root = true

config.include_msgpack_root = true

config.include_bson_root = true

config.include_plist_root = true

config.include_xml_root = false

config.include_child_root = true

config.enable_json_callbacks = false

config.xml_options = { :dasherize => true, :skip_types => false }

config.view_paths = []

config.raise_on_missing_attribute = true # Defaults to false

config.replace_nil_values_with_empty_strings = true # Defaults to false

end

root@kitploit:~
كل خيار يحدد سلوكًا مرتبطًا بمخرجات RABL. إذا تم تعطيل `include_json_root`، فإن ذلك يزيل العقدة الجذرية لكل كائن جذر في المخرجات، و `enable_json_callbacks` يمكّن دعم الإخراج بنمط 'jsonp' callback إذا كان الطلب الوارد يحتوي على معامل 'callback'.

إذا تم تعيين `include_child_root` إلى false، فإن الكائنات الفرعية في الرد لن تتضمن عقدة جذرية افتراضيًا. يتيح لك ذلك ضبط بنية الرد المطلوبة بشكل أدق.

إذا تم تعيين `cache_engine`، فيجب عليك تعيينه إلى فئة تحتوي على طريقة `fetch`. راجع [المحرك الافتراضي](https://github.com/nesquena/rabl/blob/master/lib/rabl/cache_engine.rb) للحصول على مثال.

إذا تم تعيين `perform_caching` إلى `true` فسيتم تنفيذ التخزين المؤقت. يمكنك تجاهل هذا الخيار إذا كنت تستخدم Rails، فهو مماثل لـ Rails `config.action_controller.perform_caching`

إذا تم تعيين `cache_sources` إلى `true`، فسيتم تخزين عمليات البحث عن القوالب مؤقتًا لتحسين الأداء. يمكن إعادة تعيين ذاكرة التخزين المؤقت يدويًا عن طريق تشغيل `Rabl.reset_source_cache!` داخل تطبيقك.

إذا تم تعيين `cache_all_output` إلى `true`، فسيتم تخزين كل قالب بما في ذلك كل قالب فردي يُستخدم كجزء من مجموعة بشكل منفصل. بالإضافة إلى ذلك، سيتم تخزين أي شيء داخل child و glue و partial بشكل منفصل. لتخزين قالب واحد فقط، راجع القسم المسمى 'Caching' أدناه.

إذا تم تعيين `escape_all_output` إلى `true` وكان ActiveSupport متاحًا، فسيتم ترميز مخرجات السمات باستخدام [ERB::Util.html_escape](http://corelib.rubyonrails.org/classes/ERB/Util.html). لن يتم ترميز العُقد المخصصة، استخدم `ERB::Util.h(value)`.

إذا تم تعيين `view_paths` إلى مسار، فسيتم التحقق من مسار العرض هذا لكل قالب rabl داخل تطبيقك. أضف إلى هذا المسار خاصة عند تضمين Rabl في محرك واستخدام مسارات العرض داخل تطبيق Rails آخر.

إذا تم تعيين `raise_on_missing_attribute` إلى `true`، فسيتم إطلاق RuntimeError كلما حاول Rabl عرض سمة غير موجودة. وإلا، سيتم ببساطة حذف السمة. تعيين هذا إلى true أثناء التطوير قد يساعد في زيادة متانة الكود الخاص بك، لكن استخدام `true` في كود الإنتاج غير موصى به.

إذا تم تعيين `replace_nil_values_with_empty_strings` إلى `true`، فسيتم تحويل جميع القيم التي تكون `nil` وعادةً ما تظهر كـ `null` في الرد إلى سلاسل فارغة.

إذا كنت ترغب في استخدام [oj](https://github.com/ohler55/oj) كمحرك ترميز JSON الأساسي، فما عليك سوى إضافته إلى ملف Gemfile الخاص بك:```ruby
# Gemfile
gem 'oj'

وسيستخدم RABL تلك المحرّك تلقائيًا لتشفير استجابات JSON الخاصة بك. قم بتعيين محرّك json_engine مخصص خاص بك والذي يُعرّف طريقة dump أو encode لتحويل بيانات Ruby إلى JSON:```ruby config.json_engine = ActiveSupport::JSON

root@kitploit:~
### تكوين التنسيق ###

يدعم RABL التكوين لـ MessagePack و BSON و Plist. تحقق من صفحة
[تكوين التنسيقات](https://github.com/nesquena/rabl/wiki/Configuring-Formats) لمزيد من التفاصيل.

## الاستخدام ##

### تعيين الكائن ###

لإعلان كائن البيانات لاستخدامه في القالب:```ruby
# app/views/users/show.json.rabl
object @user

أو حدد اسمًا مستعارًا للكائن:```ruby object @user => :person

=> { "person" : { ... } }

root@kitploit:~
أو تمرير مجموعة من الكائنات:```ruby
collection @users
# => [ { "user" : { ... } } ]

أو تحديد تسمية عقدة الجذر للمجموعة:```ruby collection @users => :people

=> { "people" : [ { "person" : { ... } } ] }

root@kitploit:~
أو حتى تحديد كل من تسميات الطفل والجذر لمجموعة:```ruby
collection @users, :root => "people", :object_root => "user"
# => { "people" : [ { "user" : { ... } } ] }

وسيتم استخدام هذا كبيانات افتراضية للتقديم، أو تعطيل الجذر الكائن صراحةً:```ruby collection @users, :root => "people", :object_root => false

=> { "people" : [ { ... }, { ... } ] }

root@kitploit:~
قد تكون هناك أيضًا حالات غريبة حيث لا يتطابق المستوى الجذري للاستجابة مباشرة مع أي كائن:```ruby
object false
node(:some_count) { |m| @user.posts.count }
child(@user) { attribute :name }

في تلك الحالات، يمكن تعيين الكائن إلى 'false' ويمكن إنشاء العقد بحرية.

السمات

الاستخدام الأساسي لـ templater لتحديد بعض السمات البسيطة للاستجابة:```ruby

app/views/users/show.json.rabl

attributes :id, :foo, :bar

root@kitploit:~
أو استخدمها مع السمات المستعارة:```ruby
# Take the value of model attribute `foo` and name the node `bar`
attribute :foo => :bar
# => { bar : 5 }

أو حتى سمات متعددة ذات أسماء مستعارة:```ruby attributes :bar => :baz, :dog => :animal

=> # { baz : , animal : }

root@kitploit:~
أو إظهار السمات فقط إذا كان الشرط صحيحًا:```ruby
# m is the object being rendered, also supports :unless
attributes :foo, :bar, :if => lambda { |m| m.condition? }

لا يمكن دمج السمات المسماة والمستعارة على نفس السطر. هذا لا يعمل حالياً:```ruby attributes :foo, :bar => :baz # throws exception

root@kitploit:~
### العقد الفرعية ###

غالبًا ما يتطلب الرد تضمين معلومات متداخلة من البيانات المرتبطة بالنموذج الأصلي:```ruby
child :address do
  attributes :street, :city, :zip, :state
end

يمكنك أيضًا تعطيل جذر الكائن للعقدة الفرعية:```ruby child :posts, :object_root => false do attributes :id, :title end

root@kitploit:~
يمكنك أيضًا إضافة عقد فرعية من مصدر بيانات عشوائي:

```yaml
children:
  - { path: /path/to/data, type: file }
  - { path: /path/to/other/data, type: directory }
``````ruby
child @posts => :foobar do
  attributes :id, :title
end

أو استخدم ارتباطات النموذج مع اسم مستعار:```ruby

Renders all the 'posts' association

from the model into a node called 'foobar'

child :posts => :foobar do attributes :id, :title end

root@kitploit:~
يمكنك أيضًا تمرير الكائن الحالي:```ruby
object @user
child :posts do |user|
  attribute :title unless user.suspended?
end

ربط السمات

يمكنك أيضًا إلحاق السمات الفرعية بالعقدة الجذرية:```ruby

Appends post_id and post_name to parent json object

glue @post do attributes :id => :post_id, :name => :post_name end

root@kitploit:~
استخدم glue لإضافة سمات إضافية إلى الكائن الأصلي.

يمكنك أيضًا تمرير الكائن الحالي:```ruby
object @user
glue(@post) {|user| attribute :title if user.active? }

العُقد المخصصة

سيؤدي ذلك إلى إنشاء استجابة json بناءً على نتيجة كتلة node:```ruby

app/views/users/show.json.rabl

node :full_name do |u| u.first_name + " " + u.last_name end

root@kitploit:~
أو عقدة مخصصة توجد فقط إذا كان الشرط صحيحًا:```ruby
# m is the object being rendered, also supports :unless
node(:foo, :if => lambda { |m| m.has_foo? }) do |m|
  m.foo
end

أو لا تمرر اسمًا واجعل كتلة العقدة مدمجة في الاستجابة:```ruby node do |u| { :full_name => u.first_name + " " + u.last_name }

=> { full_name : "Bob Johnson" }

end

root@kitploit:~
### Partials ###

يمكنك استخدام العقد المخصصة مثل هذه لإنشاء تمثيلات مرنة لقيمة باستخدام جميع البيانات من النموذج.

غالبًا ما تحتاج إلى الوصول إلى كائنات بيانات أخرى من أجل بناء عقد مخصصة في ارتباطات أكثر تعقيدًا. يمكنك الحصول على الوصول إلى تمثيل rabl لكائن بيانات آخر عن طريق تقديم partial من RABL:```ruby
node :location do
  { :city => @city, :address => partial("users/address", :object => @address) }
end

أو حتى الوصول إلى كائن مرتبط بالنموذج الأب:```ruby node :location do |m| { :city => m.city, :address => partial("users/address", :object => m.address) } end

root@kitploit:~
يمكنك استخدام هذه الطريقة لبناء عقد معقدة حسب الرغبة لواجهات API الخاصة بك. لاحظ أنك بحاجة إلى تعريف قوالب RABL لكل كائن ترغب في إنشاء تمثيلات له بهذه الطريقة.

### الوراثة ###

مشكلة أخرى شائعة في العديد من أدوات بناء القوالب هي التكرار غير الضروري في الكود. عادةً ما تشترك العديد من تمثيلات كائن عبر نقاط نهاية متعددة في سمات أو عقد مشتركة. من المحتمل أن تكون العقد الخاصة بكائن 'post' متشابهة أو متماثلة في معظم الإشارات عبر نقاط النهاية المختلفة.

تمتلك RABL القدرة على تمديد قوالب "قاعدة" أخرى وسمات إضافية:```ruby
# app/views/users/advanced.json.rabl
extends "users/base" # another RABL template in "app/views/users/base.json.rabl"

node :can_drink do |m|
  m.age > 21
end

يمكنك أيضًا تمديد قوالب rabl الأخرى أثناء بناء العقد الفرعية لتقليل التكرار:```ruby

app/views/users/show.json.rabl

child @address do extends "address/item" end

root@kitploit:~
استخدام الأجزاء الجزئية والوراثة يمكن أن يقلل بشكل كبير من تكرار الكود في قوالبك.

يمكنك رؤية المزيد من الأمثلة على [صفحة ويكي إعادة استخدام القوالب](https://github.com/nesquena/rabl/wiki/Reusing-templates).

### تمرير المتغيرات المحلية في الأجزاء الجزئية ###

يمكنك تمرير مجموعة عشوائية من المتغيرات المحلية عند عرض الأجزاء الجزئية أو توسيع القوالب.
على سبيل المثال، إذا أردنا إظهار أي معلومات حول منشور معين والتعليقات المرتبطة به في `posts/:id.json`
ولكن في حالات أخرى نريد إخفاء هذه التعليقات. يمكننا استخدام المتغيرات المحلية لفعل ذلك:```ruby
# app/views/posts/index.json.rabl
collection @posts

extends('posts/show', :locals => { :hide_comments => true })
# or using partial instead of extends
# node(false) { |post| partial('posts/show', :object => :post, :locals => { :hide_comments => true })}

ثم الوصول إلى المتغيرات المحلية في القالب الفرعي:```ruby

app/views/posts/show.json.rabl

object @post

attributes :id, :title, :body, :created_at node(:comments) { |post| post.comments } unless locals[:hide_comments]

root@kitploit:~
يمكن أن يكون هذا مفيدًا كأداة متقدمة عند توسيع أو عرض partials.

### نطاق القالب ###

في RABL، لديك إمكانية الوصول إلى كل ما تحتاجه لبناء استجابة API. كل قالب RABL لديه وصول كامل إلى controllers instance variables بالإضافة إلى جميع view helpers و routing urls.```ruby
# app/some/template.rabl
object @post
# Access instance variables
child(@user => :user) { ... }
# or Rails helpers
node(:formatted_body) { |post| simple_format(post.body) }

لا ينبغي أن تكون هناك مشكلة في جلب البيانات المناسبة لبناء الرد.

التداخل العميق

في واجهات برمجة التطبيقات، قد تحتاج غالبًا إلى بناء عقد من المستوى الثاني أو الثالث. لنفترض أن لدينا نموذج 'اختبار' يحتوي على العديد من 'الأسئلة' ثم كل سؤال يحتوي على العديد من 'الإجابات'. يمكننا عرض هذا التسلسل الهرمي في RABL بسهولة:```ruby

app/views/quizzes/show.json.rabl

object @quiz attribute :title child :questions do attribute :caption child :answers do # Use inheritance to reduce duplication extends "answers/item" end end

root@kitploit:~
سيعرض هذا كائن الاختبار مع الأسئلة والأجوبة المتداخلة كما هو متوقع مع عقدة الاختبار، والأسئلة والأجوبة المضمنة.
لاحظ أن RABL يمكن تداخله بعمق تعسفي داخل العقد الفرعية للسماح بتعريف هذه التمثيلات.

### التخزين المؤقت ###

يدعم RABL التخزين المؤقت المدمج للقوالب باستخدام استراتيجيات التخزين المؤقت للمقتطفات. لاحظ أن التخزين المؤقت **متاح حاليًا** فقط لـ Rails ولكن الدعم للأطر الأخرى مخطط له في إصدار مستقبلي. أبسط استخدام للتخزين المؤقت هو:```ruby
# app/views/users/show.json.rabl
object @quiz
cache @quiz # key = rabl/quiz/[cache_key]
attribute :title

التخزين المؤقت يمكن أن يسرع بشكل كبير عملية عرض قوالب RABL في الإنتاج ويوصى به بشدة عندما يكون ذلك ممكنًا. للحصول على نظرة أكثر تفصيلاً عن التخزين المؤقت، راجع دليل التخزين المؤقت على الويكي.

عرض القوالب مباشرة

هناك حالات حيث يتطلب التطبيق عرض قوالب RABL خارج سياق العرض التقليدي. على سبيل المثال، لعرض RABL ضمن مهمة Rake أو لإنشاء حمولات قائمة انتظار الرسائل. في هذه الحالة، يمكن استخدام Rabl.render كما هو موضح أدناه:

root@kitploit:~
# مثال على استخدام Rabl.render
``````ruby
Rabl.render(object, template, :view_path => 'app/views', :format => :json) #=> "{...json...}"

يمكنك استخدام طرق المساعدة في Rabl::Renderer لتقديم الكائنات أيضاً:```ruby Rabl::Renderer.json(@post, 'posts/show') Rabl::Renderer.xml(@post, 'posts/show')

root@kitploit:~
تسمح هذه الطرق باستخدام RABL لإجراء تحويلات عشوائية لكائن ما إلى تنسيق مطلوب.```ruby
Rabl::Renderer.new('posts/show', @post, :view_path => 'app/views', :format => 'hash').render

يمكنك أيضًا تمرير متغيرات مثيل أخرى لاستخدامها في قالبك على النحو التالي:```ruby Rabl::Renderer.new('posts/show', @post, :locals => { :custom_title => "Hello world!" })

root@kitploit:~
ثم، في القالب الخاص بك، يمكنك استخدام `@custom_title` كالتالي:```
attribute :content
node(:title) { @custom_title }
```
### رؤوس نوع المحتوى ###

حاليًا في RABL، لا يتم تعيين نوع محتوى الاستجابة تلقائيًا. وذلك لأن RABL مصمم للعمل مع أي إطار عمل قائم على Rack وبأقصى قدر من الحياد تجاه التنسيق.
راجع [هذه المشكلة](https://github.com/nesquena/rabl/issues/185#issuecomment-4501232) لمزيد من التفاصيل، وإذا كانت لديك أي أفكار أو تصحيحات، فيُرجى إبلاغي بها.

في غضون ذلك، تأكد من تعيين أنواع المحتوى المناسبة عند الحاجة. هذا عادةً ما يكون بسيطًا جدًا في كل من Rails وPadrino. أوصي باستخدام before_filter على ذلك المتحكم أو تحديدها مباشرة في إجراء.

## الموارد ##

هناك العديد من الموارد المتاحة المتعلقة بـ RABL بما في ذلك [ويكي RABL](https://github.com/nesquena/rabl/wiki)، والعديد من الدروس والأدلة المفصلة أدناه.
يمكنك أيضًا الاطلاع على [موقع RABL](http://nesquena.github.com/rabl).

### الاستخدام المتقدم ###

روابط للموارد الخاصة بالاستخدام المتقدم:

 * [إدارة التعقيد](https://github.com/nesquena/rabl/wiki/Managing-complexity-with-presenters)
 * [تحسينات الإنتاج](https://github.com/nesquena/rabl/wiki/Rabl-In-Production)
 * [التكامل مع Grape](https://github.com/nesquena/rabl/wiki/Using-Rabl-with-Grape)
 * [عرض JSON لهيكل شجري باستخدام RABL](https://github.com/nesquena/rabl/issues/70)
 * [التخطيطات (erb وhaml وrabl) في RABL](https://github.com/nesquena/rabl/wiki/Using-Layouts)
 * [التكامل مع Backbone أو Ember.js](https://github.com/nesquena/rabl/wiki/Backbone-Integration)
 * [RABL مع محركات Rails](https://github.com/nesquena/rabl/wiki/Setup-rabl-with-rails-engines)

يُرجى إضافة استخداماتك الخاصة وإخباري حتى نتمكن من إضافتها هنا! تأكد أيضًا من الاطلاع على [ويكي RABL](https://github.com/nesquena/rabl/wiki) لاستخدامات أخرى.

### الدروس التعليمية ###

يمكن أن تكون الدروس التعليمية مفيدة دائمًا عند البدء لأول مرة:

 * [Railscasts #322](http://railscasts.com/episodes/322-rabl) - يشرح Ryan Bates RABL
 * [BackboneRails](http://www.backbonerails.com/) - دروس فيديو رائعة من Brian Mann
 * [إنشاء API باستخدام RABL وPadrino](http://blog.crowdint.com/2012/10/22/rabl-with-padrino.html)
 * http://blog.joshsoftware.com/2011/12/23/designing-rails-api-using-rabl-and-devise/
 * http://engineering.gomiso.com/2011/06/27/building-a-platform-api-on-rails/
 * http://blog.lawrencenorton.com/better-json-requests-with-rabl
 * http://www.rodrigoalvesvieira.com/developing-json-api-rails-rabl/
 * http://tech.favoritemedium.com/2011/06/using-rabl-in-rails-json-web-api.html
 * http://seesparkbox.com/foundry/better_rails_apis_with_rabl
 * http://blog.dcxn.com/2011/06/22/rails-json-templates-through-rabl
 * http://teohm.github.com/blog/2011/05/31/using-rabl-in-rails-json-web-api

أخبرني إذا كان هناك أي موارد مفيدة أخرى غير مدرجة هنا.

### المكتبات ذات الصلة ###

هناك مكتبات أخرى يمكنها إما استكمال أو توسيع وظائف RABL:

 * [versioncake](https://github.com/bwillis/versioncake) - مكتبة ممتازة لترقيم إصدارات واجهات برمجة التطبيقات RABL الخاصة بك بسهولة
 * [gon](https://github.com/gazay/gon) - يكشف متغيرات Rails الخاصة بك في JavaScript مع دعم RABL المدمج.
 * [rabl-rails](https://github.com/ccocchi/rabl-rails) - إعادة تطبيق لـ RABL وRails مع التركيز على [السرعة](https://github.com/ccocchi/rabl-benchmark/blob/master/BENCHMARK).

أخبرني إذا كان هناك أي مكتبات ذات صلة أخرى غير مدرجة هنا.

### استكشاف الأخطاء وإصلاحها ###

 * [استدعاءات متكررة لمجموعة](https://github.com/nesquena/rabl/issues/142#issuecomment-2969107)
 * [اختبار عروض RABL](https://github.com/nesquena/rabl/issues/130#issuecomment-4179285)

### أمثلة ###

راجع دليل [الأمثلة](https://github.com/nesquena/rabl/tree/master/examples).

## المشكلات ##

تحقق من علامة التبويب [المشكلات](https://github.com/nesquena/rabl/issues) للحصول على قائمة كاملة:

 * قياس أداء صارم وتحسينات في الأداء

## المؤلفون والمساهمون ##

شكرًا لـ [Miso](http://gomiso.com) على السماح لي بإنشاء هذا لتطبيقاتنا وإصدار هذا المشروع!

* [Nathan Esquenazi](https://github.com/nesquena) - منشئ المشروع
* [Arthur Chiu](https://github.com/achiu) - المشرف الأساسي، خبير اختبار Riot
* [Tim Lee](https://github.com/timothy1ee) - RABL كان اسمًا رائعًا اختاره المدير التقني لـ Miso.
* [David Sommers](https://github.com/databyte) - حل القوالب، ودعم التخزين المؤقت، وأكثر من ذلك بكثير
* [Rick Thomas](https://github.com/rickthomasjr) - أضاف خيارات لـ extends واختبار Sinatra
* [Benjamin Yu](https://github.com/byu) - أضاف دعم تنسيق msgpack
* [Chris Kimpton](https://github.com/kimptoc) - المساعدة في التوثيق والويكي
* [Marjun](https://github.com/mpagalan) - أضاف خيارات تهيئة xml
* [Anton Orel](https://github.com/skyeagle) - أضاف التوافق مع Rails 3.1
* [Sasha Koss](https://github.com/kossnocorp) - أضاف دعم multi_json
* [Matthew Schulkind](https://github.com/mschulkind) - تنظيف التهيئة والاختبارات
* [Luke van der Hoeven](https://github.com/plukevdh) - دعم الكائنات غير ORM في القوالب
* [Andrey Voronkov](https://github.com/Antiarchitect) - أضاف دعم تنسيق BSON
* [Alli Witheford](https://github.com/alzeih) - أضاف دعم تنسيق Plist
* [Ryan Bigg](https://github.com/radar) - تحسين كود حل القوالب
* [Ivan Vanderbyl](https://github.com/ivanvanderbyl) - أضاف أداة عرض للأغراض العامة
* [Cyril Mougel](https://github.com/shingara) - أضاف دعم محرك التخزين المؤقت القابل للتوصيل وتحسينات أداة العرض
* [Teng Siong Ong](https://github.com/siong1987) - تحسين واجهة أداة العرض
* [Brad Dunbar](https://github.com/braddunbar) - تمرير الكائن الحالي إلى الكتل

والعديد من المساهمين الآخرين المدرجين في [CHANGELOG](https://github.com/nesquena/rabl/blob/master/CHANGELOG.md).

هل تريد المساهمة بدعم تنسيق آخر؟
راجع التصحيحات الخاصة بـ [دعم msgpack](https://github.com/nesquena/rabl/pull/69) و[دعم plist](https://github.com/nesquena/rabl/pull/153) و[دعم BSON](https://github.com/nesquena/rabl/pull/163) كمرجع.

يُرجى إنشاء فرع والمساهمة، أي مساعدة في تحسين هذا المشروع محل تقدير!

هذا المشروع عضو في [بيان البرامج مفتوحة المصدر](http://ossmanifesto.org).

## الإلهامات ##

هناك بعض المكتبات الممتازة التي ساعدت في إلهام RABL وهي مدرجة أدناه:

 * [Tequila](https://github.com/inem/tequila)
 * [JSON Builder](https://github.com/dewski/json_builder)
 * [Argonaut](https://github.com/jbr/argonaut)

شكرًا مرة أخرى لكل هذه المشاريع الرائعة.

## حقوق النشر ##

حقوق النشر © 2011-2012 Nathan Esquenazi. راجع [MIT-LICENSE](https://github.com/nesquena/rabl/blob/master/MIT-LICENSE) للتفاصيل.
تنزيل الأداة