الفرق بين المراجعتين لصفحة: «Rails/active support instrumentation»

من موسوعة حسوب
إنشاء الصفحة. هذه الصفحة من مساهمات "دعاء فرح"
 
طلا ملخص تعديل
 
(2 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:أدوات الدعم الفعال في ريلز}}</noinclude>
<noinclude>{{DISPLAYTITLE:أدوات Active Support في ريلز}}</noinclude>
الدعم الفعال هو جزء من Rails الأساسية التي توفر امتدادات لغة روبي والأدوات المساعدة وغيرها من الأشياء. أحد الأشياء التي تتضمنها هو واجهة برمجة تطبيقات للأجهزة يمكن استخدامها داخل تطبيق لقياس إجراءات معينة تحدث داخل شفرة روبي، مثل تلك الموجودة داخل تطبيق Rails أو إطار العمل نفسه. لا يقتصر على Rails، ولكن. يمكن استخدامه بشكل مستقل في نصوص Ruby الأخرى إذا كان ذلك مطلوبًا.
[[Rails/active support|Active Support]] هو جزء من نواة ريلز التي توفر ملحقات للغة روبي والأدوات المساعدة وغيرها من الأشياء. أحد الأشياء التي يتضمنها هو واجهة برمجية لأدوات قياس (instrumentation API) يمكن استخدامها داخل تطبيق لقياس إجراءات معينة تحدث داخل شيفرة روبي، مثل تلك الموجودة داخل تطبيق ريلز أو إطار العمل نفسه، إذ لا يقتصر ذلك على ريلز فقط. يمكن استخدامها بشكل مستقل في شيفرات روبي البرمجية الأخرى إذا كان ذلك مطلوبًا.


في هذا الدليل، ستتعلم كيفية استخدام واجهة برمجة تطبيقات الأجهزة داخل Active Support لقياس الأحداث داخل Rails وغيرها من رموز Ruby.
في هذا الدليل، ستتعلم كيفية استخدام الواجهة البرمجية لأدوات القياس (instrumentation API) داخل [[Rails/active support|Active Support]] لقياس الأحداث داخل ريلز وغيرها من شيفرات روبي.


بعد قراءة هذا الدليل، ستعرف:
بعد قراءة هذا الدليل، ستتعلم:
* ما الأدوات يمكن أن توفر.
* ما هي الأدوات المتوافرة.
* الخطافات داخل إطار Rails للأجهزة.
* الخطافات داخل إطار ريلز لأدوات القياس.
* إضافة مشترك إلى الخطاف.
* إضافة مُشترِك (subscriber) إلى خطاف.
* بناء تطبيق الأجهزة المخصصة.
* بناء تنفيذ مخصص لأداة قياس.


== مقدمة في الأجهزة ==
== مقدمة إلى الأدوات ==
الأدوات تسمح لواجهة برمجة التطبيقات الخاصة بالأجهزة التي يوفرها الدعم الفعال لمطوري البرامج بتوفير خطافات يمكن لمطوري البرامج الآخرين الدخول إليها. هناك العديد من هذه في إطار Rails. باستخدام واجهة برمجة التطبيقات هذه، يمكن للمطورين اختيار إعلامهم عند وقوع أحداث معينة داخل التطبيق أو جزء آخر من رمز روبي.
تسمح الواجهة البرمجية لأدوات القياس التي يوفرها [[Rails/active support|Active Support]] لمطوري البرامج بتوفير خطافات يمكن لمطوري البرامج الآخرين استعمالها. هناك العديد منها في إطار ريلز. باستخدام واجهة برمجة التطبيقات هذه، يمكن للمطورين اختيار كيفية تنبيههم عند وقوع أحداث معينة داخل التطبيق أو في جزء آخر من شيفرة روبي.


على سبيل المثال، هناك خطاف يتوفر ضمن Active Record  يستدعى في كل مرة يستخدم Active Record استعلام SQL في قاعدة بيانات. يمكن الاشتراك في هذا الخطاف واستخدامه لتتبع عدد طلبات البحث أثناء إجراء معين. هناك خطاف آخر حول معالجة إجراء وحدة التحكم. يمكن استخدام هذا، على سبيل المثال، لتتبع مدة اتخاذ إجراء معين.
على سبيل المثال، هناك خطاف يتوفر ضمن [[Rails/active record|Active Record]] يستدعى في كل مرة يستخدم [[Rails/active record|Active Record]] استعلام SQL في قاعدة بيانات. يمكن الاشتراك في هذا الخطاف واستخدامه لتتبع عدد طلبات البحث أثناء تنفيذ إجراء معين. هناك خطاف آخر حول معالجة إجراء وحدة التحكم. يمكن استخدام هذا، على سبيل المثال، لتتبع مدة تنفيذ إجراء معين.


يمكنك حتى إنشاء أحداثك الخاصة داخل تطبيقك والتي يمكنك الاشتراك لاحقًا فيها.
يمكنك حتى إنشاء أحداثك الخاصة داخل تطبيقك والتي يمكنك الاشتراك فيها لاحقًا.


== خطافات اطار Rails ==
== خطافات إطار ريلز ==
ضمن إطار Ruby on Rails، هناك عدد من الخطافات المقدمة للأحداث الشائعة. هذه مفصلة أدناه.
ضمن إطار ريلز، هناك عدد من الخطافات المتوافرة للأحداث الشائعة سنتظرق إليها في الأقسام الآتية.


== وحدة التحكم ==
== وحدة التحكم ==


=== Write_fragment.action_controller ===
=== <code>write_fragment.action_controller</code> ===
{| class="wikitable"
{| class="wikitable"
|المفتاح
!المفتاح
|القيمة
!القيمة
|-
|-
|المفتاح الكامل
| ‎<code>:key</code>
|  :key
|المفتاح الكامل.
|}
|}
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 key: 'posts/1-dashboard-view'
 key: 'posts/1-dashboard-view'
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Read_fragment.action_controller ===
=== <code>read_fragment.action_controller</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|المفتاح الكامل
| ‎<code>:key</code>
|:key
|المفتاح الكامل.
|}
|}
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 key: 'posts/1-dashboard-view'
 key: 'posts/1-dashboard-view'
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Expire_fragment.action_controller ===
=== <code>expire_fragment.action_controller</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|المفتاح الكامل
| ‎<code>:key</code>
|:key
|المفتاح الكامل.
|}
|}
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 key: 'posts/1-dashboard-view'
 key: 'posts/1-dashboard-view'
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Exist_fragment?.action_controller ===
=== <code>exist_fragment?.action_controller</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|المفتاح الكامل
| ‎<code>:key</code>
|:key
|المفتاح الكامل.
|}
|}
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 key: 'posts/1-dashboard-view'
 key: 'posts/1-dashboard-view'
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Write_page.action_controller ===
=== <code>write_page.action_controller</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|المسار الكامل
| ‎<code>:key</code>
| :path
|المفتاح الكامل.
|}
|}
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 path: '/users/1'
 path: '/users/1'
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Expire_page.action_controller ===
=== <code>expire_page.action_controller</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|المسار الكامل
| ‎<code>:path</code>
| :path
|المسار الكامل.
|}
|}
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 path: '/users/1'
 path: '/users/1'
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Start_processing.action_controller ===
=== <code>start_processing.action_controller</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|اسم وحدة التحكم.
|‎<code>:controller</code>
|:controller
|اسم وحدة التحكم
|-
|-
|الإجراء.
|‎<code>:action</code>
|:action
|الإجراء
|-
|-
|تجزئة معاملات الطلب دون أي معامل مرشح.
|‎<code>:params</code>
|    :params
|جدول Hash من معاملات الطلب دون أي معامل مرشح
|-
|-
|طلب رأس الصفحة.
|‎<code>:headers</code>
|   :headers
|ترويسات طلب
|-
|-
|html/js/json/xml etc
|‎<code>:format</code>
|    :format
|html/js/json/xml ...إلخ.
|-
|-
|‎<code>:method</code>
|فعل طلب HTTP
|فعل طلب HTTP
|    :method
|-
|-
|‎<code>:path</code>
|طلب المسار
|طلب المسار
|:path
|}
|}
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 
  controller: "PostsController",
 controller: "PostsController",
  action: "new",
 
  params: { "action" => "new", "controller" => "posts" },
 action: "new",
  headers: #<ActionDispatch::Http::Headers:0x0055a67a519b88>,
 
  format: :html,
 params: { "action" => "new", "controller" => "posts" },
  method: "GET",
 
  path: "/posts/new"
 headers: #<ActionDispatch::Http::Headers:0x0055a67a519b88>,
 
 format: :html,
 
 method: "GET",
 
 path: "/posts/new"
 
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Process_action.action_controller ===
=== <code>process_action.action_controller</code> ===
{| class="wikitable"
{| class="wikitable"
|
!المفتاح
|
!القيمة
|-
|-
|اسم وحدة التحكم.
|‎<code>:controller</code>
|:controller
|اسم وحدة التحكم
|-
|-
|الإجراء.
|‎<code>:action</code>
|:action
|الإجراء
|-
|-
|تجزئة معاملات الطلب من غير اي معامل مرشح.
|‎<code>:params</code>
|:params
|جدول Hash لمعاملات الطلب من غير أي معامل مرشح
|-
|-
|طلب رأس الصفحة.
|‎<code>:headers</code>
|:headers
|ترويسات الطلب
|-
|-
|html/js/json/xml etc
|‎<code>:format</code>
|:format
|html/js/json/xml ...إلخ.
|-
|-
|فعل طلب HTTP.
|‎<code>:method</code>
|:method
|فعل طلب HTTP
|-
|-
|طلب المسار.
|‎<code>:path</code>
|:path
|طلب المسار
|-
|-
|رمز حالة HTTP.
|‎<code>:status</code>
|:status
|رمز حالة HTTP
|-
|-
|الكمية المستغرقة في الواجهة بالمللي ثانية.
|‎<code>:view_runtime</code>
|:view_runtime
|الكمية المستغرقة في واجهة العرض بالمللي ثانية.
|-
|-
|الكمية المستغرقة لتنفيذ استعلامات قاعدة البيانات في مللي ثانية.
|‎<code>:db_runtime</code>
|:db_runtime
|الكمية المستغرقة لتنفيذ استعلامات قاعدة البيانات بالميللي ثانية.
|}
|}
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 
  controller: "PostsController",
 controller: "PostsController",
  action: "index",
 
  params: {"action" => "index", "controller" => "posts"},
 action: "index",
  headers: #<ActionDispatch::Http::Headers:0x0055a67a519b88>,
 
  format: :html,
 params: {"action" => "index", "controller" => "posts"},
  method: "GET",
 
  path: "/posts",
 headers: #<ActionDispatch::Http::Headers:0x0055a67a519b88>,
  status: 200,
 
  view_runtime: 46.848,
 format: :html,
  db_runtime: 0.157
 
 method: "GET",
 
 path: "/posts",
 
 status: 200,
 
 view_runtime: 46.848,
 
 db_runtime: 0.157
 
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Send_file.action_controller ===
=== <code>send_file.action_controller</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|المسار الكامل للملف.
| ‎<code>:path</code>
|:path
|المسار الكامل.
|}
|}
ملاحظة: يمكن إضافة مفاتيح إضافية من قبل المتصل.
'''ملاحظة''': يمكن إضافة مفاتيح إضافية من قبل المتصل.


=== Send_data.action_controller ===
=== <code>send_data.action_controller</code> ===
ليس لدى ActionController أي معلومات محددة للحمولة. تُمرر جميع الخيارات إلى الحمولة.
ليس لدى المتحكم <code>ActionController</code> أي معلومات محددة للحمولة (payload). تُمرر جميع الخيارات إلى الحمولة (payload).


=== Redirect_to.action_controller ===
=== <code>redirect_to.action_controller</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|‎<code>:status</code>
|رمز استجابة HTTP
|رمز استجابة HTTP
|:status
|-
|-
|عنوان URL لإعادة التوجيه إلى
|‎<code>:location</code>
|     :location
|عنوان URL لإعادة التوجيه إليه
|}
|}
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 
  status: 302,
 status: 302,
  location: "http://localhost:3000/posts/new"
 
 location: "<nowiki>http://localhost:3000/posts/new</nowiki>"
 
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Halted_callback.action_controller ===
=== <code>halted_callback.action_controller</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!القيمة
|المفتاح
!المفتاح
|-
|-
|‎<code>:filter</code>
|المرشح الذي أوقف الإجراء.
|المرشح الذي أوقف الإجراء.
| :filter
|}
|}
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 filter: ":halting_filter"
 filter: ":halting_filter"
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Unpermitted_parameters.action_controller ===
=== <code>unpermitted_parameters.action_controller</code> ===
{| class="wikitable"
{| class="wikitable"
|المفتاح
!المفتاح
|القيمة
!القيمة
|-
|-
| :keys
|‎<code>:keys</code>
|المفاتيح غير مسموح لها.
|المفاتيح غير مسموح بها.
|}
|}


== واجهة الإجراء ==
== [[Rails/action view|Action View]] ==


=== Render_template.action_view ===
=== <code>render_template.action_view</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|‎<code>:identifier</code>
|المسار الكامل للقالب.
|المسار الكامل للقالب.
|:identifier
|-
|-
|‎<code>:layout</code>
|تخطيط قابل للتطبيق.
|تخطيط قابل للتطبيق.
|:layout
|}
|}
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 
  identifier: "/Users/adam/projects/notifications/app/views/posts/index.html.erb",
 identifier: "/Users/adam/projects/notifications/app/views/posts/index.html.erb",
  layout: "layouts/application"
 
 layout: "layouts/application"
 
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Render_partial.action_view ===
=== <code>render_partial.action_view</code> ===
{| class="wikitable"
{| class="wikitable"
|المفتاح
|القيمة
|القيمة
|المفتاح
|-
|-
|‎<code>:identifier</code>
|المسار الكامل للقالب.
|المسار الكامل للقالب.
|:identifier
|}
|}
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 
  identifier: "/Users/adam/projects/notifications/app/views/posts/_form.html.erb"
 identifier: "/Users/adam/projects/notifications/app/views/posts/_form.html.erb"
 
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Render_collection.action_view ===
=== <code>render_collection.action_view</code> ===
{| class="wikitable"
{| class="wikitable"
|المفتاح
!المفتاح
|القيمة
!القيمة
|-
|-
|   :identifier
|<code> ‎:identifier</code>
|المسار الكامل للقالب.
|المسار الكامل للقالب.
|-
|-
|    :count
|<code>‎:count</code>
|حجم المجموعة.
|حجم المجموعة.
|-
|-
| :cache_hits
|<code>‎:cache_hits</code>
|عدد الجزيئات التي جُلبت من ذاكرة التخزين المؤقت.
|عدد الجزيئات التي جُلبت من ذاكرة التخزين المؤقت.
|}
|}
Cache_hits: يُضمن فقط إذا كانت المجموعة مقدمة مع cached: true.
المفتاح <code>cache_hits:</code> يُضمَّن فقط إذا صُيِّرت المجموعة مع <code>cached: true</code>.


<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 
  identifier: "/Users/adam/projects/notifications/app/views/posts/_post.html.erb",
 identifier: "/Users/adam/projects/notifications/app/views/posts/_post.html.erb",
  count: 3,
 
  cache_hits: 0
 count: 3,
 
 cache_hits: 0
 
}
}
</syntaxhighlight>
</syntaxhighlight>


== السجل النشط ==
== [[Rails/active record|Active Record]] ==


=== Sql.active_record ===
=== <code>sql.active_record</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|جملة SQL.
|‎<code>:sql</code>
|:sql
|تعليمة SQL.
|-
|-
|‎<code>:name</code>
|اسم العملية.
|اسم العملية.
|:name
|-
|-
|self.object_id
|‎<code>:connection_id</code>
|:connection_id
|<code>self.object_id</code>
|-
|-
|‎<code>:binds</code>
|معاملات الربط.
|معاملات الربط.
|:binds
|-
|-
|تضاف true عند استخدام الاستعلامات المخبأة
|‎<code>:cached</code>
|    :cached
|تضاف <code>true</code> عند استخدام الاستعلامات المخبأة.
|}
|}
ملاحظة: ستضيف المحولات البيانات الخاصة بها أيضًا.
'''ملاحظة''': ستضيف المحولات البيانات الخاصة بها أيضًا.


<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 
  sql: "SELECT \"posts\".* FROM \"posts\" ",
 sql: "SELECT \"posts\".* FROM \"posts\" ",
  name: "Post Load",
 
  connection_id: 70307250813140,
 name: "Post Load",
  binds: []
 
 connection_id: 70307250813140,
 
 binds: []
 
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Instantiation.active_record ===
=== <code>instantiation.active_record</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|‎<code>:record_count</code>
|عدد السجلات التي أُنشئت نسخ لها.
|عدد السجلات التي أُنشئت نسخ لها.
|:record_count
|-
|-
|سجل الفئة.
|‎<code>:class_name</code>
|:class_name
|صنف السجل.
|}
|}
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 
  record_count: 1,
 record_count: 1,
  class_name: "User"
 
 class_name: "User"
 
}
}
</syntaxhighlight>
</syntaxhighlight>


== إجراء الإرسال ==
== [[Rails/action mailer|Action Mailer]] ==


=== Receive.action_mailer ===
=== <code>receive.action_mailer</code> ===
{| class="wikitable"
{| class="wikitable"
|المفتاح
!المفتاح
|القيمة
!القيمة
|-
|-
|:mailer
|‎<code>:mailer</code>
|اسم فئة الارسال.
|اسم صنف المرسل.
|-
|-
|:message_id
|‎<code>:message_id</code>
|معرف الرسالة، التي أُنشئت بواسطة جوهرة البريد.
|معرف الرسالة، التي أُنشئت بواسطة الجوهرة Mail.
|-
|-
|:subject
|‎<code>:subject</code>
|موضوع البريد.
|موضوع البريد.
|-
|-
|:to
|‎<code>:to</code>
|لمعالجة (عناوين) البريد.
|عنوان (عناوين) المُرسَل إليه.
|-
|-
|:from
|‎<code>:from</code>
|من عنوان البريد.
|عنوان المُرسِل.
|-
|-
|:bcc
|‎<code>:bcc</code>
|عناوين BCC للبريد.
|عناوين الأشخاص المراد إرسال نسخة مخفية (BCC) من البريد إليهم.
|-
|-
|:cc
|‎<code>:cc</code>
|عناوين CC للبريد.
|عناوين الأشخاص المراد إرسال نسخة (CC) من البريد إليهم.
|-
|-
|:date
|‎<code>:date</code>
|تاريخ البريد.
|تاريخ البريد.
|-
|-
|:mail
|‎<code>:mail</code>
|شكل مشفر للبريد.
|شكل مشفر للبريد.
|}
|}
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 
  mailer: "Notification",
 mailer: "Notification",
  message_id: "4f5b5491f1774_181b23fc3d4434d38138e5@mba.local.mail",
 
  subject: "Rails Guides",
 message_id: "4f5b5491f1774_181b23fc3d4434d38138e5@mba.local.mail",
  to: ["users@rails.com", "dhh@rails.com"],
 
  from: ["me@rails.com"],
 subject: "Rails Guides",
  date: Sat, 10 Mar 2012 14:18:09 +0100,
 
  mail: "..." # omitted for brevity
 to: ["users@rails.com", "dhh@rails.com"],
 
 from: ["me@rails.com"],
 
 date: Sat, 10 Mar 2012 14:18:09 +0100,
 
 mail: "..." # omitted for brevity
 
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Deliver.action_mailer ===
=== <code>deliver.action_mailer</code> ===
{| class="wikitable"
{| class="wikitable"
|المفتاح
!المفتاح
|القيمة
!القيمة
|-
|-
|:mailer
|‎<code>:mailer</code>
|اسم فئة الارسال.
|اسم صنف المرسل.
|-
|-
|:message_id
|‎<code>:message_id</code>
|معرف الرسالة، التي أُنشئت بواسطة جوهرة البريد.
|معرف الرسالة، التي أُنشئت بواسطة الجوهرة Mail.
|-
|-
|:subject
|‎<code>:subject</code>
|موضوع البريد.
|موضوع البريد.
|-
|-
|:to
|‎<code>:to</code>
|لمعالجة (عناوين) البريد.
|عنوان (عناوين) المُرسَل إليه.
|-
|-
|:from
|‎<code>:from</code>
|من عنوان البريد.
|عنوان المُرسِل.
|-
|-
|:bcc
|‎<code>:bcc</code>
|عناوين BCC للبريد.
|عناوين الأشخاص المراد إرسال نسخة مخفية (BCC) من البريد إليهم.
|-
|-
|:cc
|‎<code>:cc</code>
|عناوين CC للبريد.
|عناوين الأشخاص المراد إرسال نسخة (CC) من البريد إليهم.
|-
|-
|:date
|‎<code>:date</code>
|تاريخ البريد.
|تاريخ البريد.
|-
|-
|:mail
|‎<code>:mail</code>
|شكل مشفر للبريد.
|شكل مشفر للبريد.
|}
|}
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
  mailer: "Notification",
  message_id: "4f5b5491f1774_181b23fc3d4434d38138e5@mba.local.mail",
  subject: "Rails Guides",
  to: ["users@rails.com", "dhh@rails.com"],
  from: ["me@rails.com"],
  date: Sat, 10 Mar 2012 14:18:09 +0100,
  mail: "..." # omitted for brevity
}


 mailer: "Notification",
 message_id: "4f5b5491f1774_181b23fc3d4434d38138e5@mba.local.mail",
 subject: "Rails Guides",
 to: ["users@rails.com", "dhh@rails.com"],
 from: ["me@rails.com"],
 date: Sat, 10 Mar 2012 14:18:09 +0100,
 mail: "..." # omitted for brevity
}
</syntaxhighlight>
</syntaxhighlight>


=== Process.action_mailer ===
=== <code>process.action_mailer</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|اسم فئة الارسال.
|‎<code>:mailer</code>
|:mailer
|اسم صنف الارسال.
|-
|-
|‎<code>:action</code>
|الإجراء.
|الإجراء.
|:action
|-
|-
|الحجج.
|‎<code>:args</code>
|:args
|الوسائط.
|}
|}
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 
  mailer: "Notification",
 mailer: "Notification",
  action: "welcome_email",
 
  args: []
 action: "welcome_email",
 
 args: []
 
}
}
</syntaxhighlight>
</syntaxhighlight>


== الدعم الفعال ==
== [[Rails/active support|Active Support]] ==


=== Cache_read.active_support ===
=== <code>cache_read.active_support</code> ===
{| class="wikitable"
{| class="wikitable"
|المفتاح
!المفتاح
|القيمة
!القيمة
|-
|-
|:key
|<code>‎:key</code>
|المفتاح المستخدم في المخزن.
|المفتاح المستخدم في المخزن.
|-
|-
|:hit
|<code>‎:hit</code>
|إذا كانت هذه القراءة هي النتيجة.
|إذا كانت هذه القراءة (read) هي النتيجة.
|-
|-
|:super_operation
|<code>‎:super_operation</code>
|#fetch  عند إضافة قراءة مع :fetch   
|يضاف ‎<code>:fetch</code> عند استخدام <code>read</code> مع ‎<code>.fetch</code>.
|}
|}


=== Cache_generate.active_support ===
=== <code>cache_generate.active_support</code> ===
يستخدم هذا الحدث فقط عندما تستدعى #fetch بعلامة.
يستخدم هذا الحدث فقط عندما تستدعى ‎<code>.fetch</code> مع كتلة.
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|‎<code>:key</code>
|المفتاح المستخدم في المخزن.
|المفتاح المستخدم في المخزن.
|:key
|}
|}
ملاحظة: تدمج الخيارات التي مُررت لجلب البيانات مع الحمولة عند الكتابة إلى المخزن.
'''ملاحظة''': تدمج الخيارات التي مُررت لجلب البيانات مع الحمولة عند الكتابة إلى المخزن.


<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 
  key: 'name-of-complicated-computation'
 key: 'name-of-complicated-computation'
 
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Cache_fetch_hit.active_support ===
=== <code>cache_fetch_hit.active_support</code> ===
يستخدم هذا الحدث فقط عندما تستدعى #fetch بعلامة.
يستخدم هذا الحدث فقط عندما تستدعى ‎<code>.fetch</code> مع كتلة.
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|‎<code>:key</code>
|المفتاح المستخدم في المخزن.
|المفتاح المستخدم في المخزن.
|:key
|}
|}
ملاحظة: ملاحظة: تدمج الخيارات التي مُررت لجلب البيانات مع الحمولة.
'''ملاحظة''': تدمج الخيارات التي مُررت لجلب البيانات مع الحمولة.


<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 
  key: 'name-of-complicated-computation'
 key: 'name-of-complicated-computation'
 
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Cache_write.active_support ===
=== <code>cache_write.active_support</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|‎<code>:key</code>
|المفتاح المستخدم في المخزن.
|المفتاح المستخدم في المخزن.
|:key
|}
|}
ملاحظة: قد تضيف مخازن ذاكرة التخزين المؤقت مفاتيحها الخاصة.
'''ملاحظة''': قد تضيف مخازن ذاكرة التخزين المؤقت مفاتيحها الخاصة.


<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 
  key: 'name-of-complicated-computation'
 key: 'name-of-complicated-computation'
 
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Cache_delete.active_support ===
=== <code>cache_delete.active_support</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|‎<code>:key</code>
|المفتاح المستخدم في المخزن.
|المفتاح المستخدم في المخزن.
|:key
|}
|}
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 
  key: 'name-of-complicated-computation'
 key: 'name-of-complicated-computation'
 
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Cache_exist?.active_support ===
=== <code>cache_exist?.active_support</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|‎<code>:key</code>
|المفتاح المستخدم في المخزن.
|المفتاح المستخدم في المخزن.
|:key
|}
|}
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
{
{
 
  key: 'name-of-complicated-computation'
 key: 'name-of-complicated-computation'
 
}
}
</syntaxhighlight>
</syntaxhighlight>


== الوظيفة النشطة ==
== [[Rails/active job|Active Job]] ==


=== Enqueue_at.active_job ===
=== <code>enqueue_at.active_job</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|كائن QueueAdapter يعالج الوظيفة.
|‎<code>:adapter</code>
|:adapter
|كائن <code>QueueAdapter</code> يعالج الوظيفة.
|-
|-
|‎<code>:job</code>
|كائن الوظيفة.
|كائن الوظيفة.
|:job
|}
|}


=== Enqueue.active_job ===
=== <code>enqueue.active_job</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|كائن QueueAdapter يعالج الوظيفة.
|‎<code>:adapter</code>
|:adapter
|كائن <code>QueueAdapter</code> يعالج الوظيفة.
|-
|-
|‎<code>:job</code>
|كائن الوظيفة.
|كائن الوظيفة.
|:job
|}
|}


=== Perform_start.active_job ===
=== <code>perform_start.active_job</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|كائن QueueAdapter يعالج الوظيفة.
|‎<code>:adapter</code>
|:adapter
|كائن <code>QueueAdapter</code> يعالج الوظيفة.
|-
|-
|‎<code>:job</code>
|كائن الوظيفة.
|كائن الوظيفة.
|:job
|}
|}


=== Perform.active_job ===
=== <code>perform.active_job</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|كائن QueueAdapter يعالج الوظيفة.
|‎<code>:adapter</code>
|:adapter
|كائن <code>QueueAdapter</code> يعالج الوظيفة.
|-
|-
|‎<code>:job</code>
|كائن الوظيفة.
|كائن الوظيفة.
|:job
|}
|}


== كابل العمل ==
== [[Rails/action cable|Action Cable]] ==


=== Perform_action.action_cable ===
=== <code>perform_action.action_cable</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|اسم فئة القناة.
|‎<code>:channel_class</code>
|:channel_class
|اسم صنف القناة.
|-
|-
|‎<code>:action</code>
|الإجراء.
|الإجراء.
|:action
|-
|-
|تجزئة البيانات.
|‎<code>:data</code>
|:data
|جدول Hash من البيانات.
|}
|}


=== Transmit.action_cable ===
=== <code>transmit.action_cable</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|اسم فئة القناة.
|‎<code>:channel_class</code>
|:channel_class
|اسم صنف القناة.
|-
|-
|تجزئة البيانات.
|‎<code>:data</code>
|:data
|جدول Hash من البيانات.
|-
|-
|عبر.
|‎<code>:via</code>
|:via
|النقل عبر (via).
|}
|}


=== Transmit_subscription_confirmation.action_cable ===
=== <code>transmit_subscription_confirmation.action_cable</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|اسم فئة القناة.
|‎<code>:channel_class</code>
|:channel_class
|اسم صنف القناة.
|}
|}


=== Transmit_subscription_rejection.action_cable ===
=== <code>transmit_subscription_rejection.action_cable</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|اسم فئة القناة.
|‎<code>:channel_class</code>
|:channel_class
|اسم صنف القناة.
|}
|}


=== Broadcast.action_cable ===
=== <code>broadcast.action_cable</code> ===
{| class="wikitable"
{| class="wikitable"
|المفتاح
!المفتاح
|القيمة
!القيمة
|-
|-
|:broadcasting
|‎<code>:broadcasting</code>
|بث مسمى.
|بث مسمى.
|-
|-
|:message
|‎<code>:message</code>
|تجزئة للرسالة.
|جدول Hash للرسالة.
|-
|-
|:coder
|‎<code>:coder</code>
|المبرمج.
|المرمز (coder).
|}
|}


== التخزين النشط ==
== [[Rails/active storage|Active Storage]] ==


=== Service_upload.active_storage ===
=== <code>service_upload.active_storage</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|‎<code>:key</code>
|رمز آمن.
|رمز آمن.
|:key
|-
|-
|‎<code>:service</code>
|اسم الخدمة.
|اسم الخدمة.
|:service
|-
|-
|‎<code>:checksum</code>
|تدقيق لضمان السلامة.
|تدقيق لضمان السلامة.
|:checksum
|}
|}


=== Service_streaming_download.active_storage ===
=== <code>service_streaming_download.active_storage</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|‎<code>:key</code>
|رمز آمن.
|رمز آمن.
|:key
|-
|-
|‎<code>:service</code>
|اسم الخدمة.
|اسم الخدمة.
|:service
|}
|}


=== Service_download.active_storage ===
=== <code>service_download.active_storage</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|‎<code>:key</code>
|رمز آمن.
|رمز آمن.
|:key
|-
|-
|‎<code>:service</code>
|اسم الخدمة.
|اسم الخدمة.
|:service
|}
|}


=== Service_delete.active_storage ===
=== <code>service_delete.active_storage</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|‎<code>:key</code>
|رمز آمن.
|رمز آمن.
|:key
|-
|-
|‎<code>:service</code>
|اسم الخدمة.
|اسم الخدمة.
|:service
|}
|}


=== Service_delete_prefixed.active_storage ===
=== <code>service_delete_prefixed.active_storage</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|‎<code>:prefix</code>
|بادئة المفتاح.
|بادئة المفتاح.
|:prefix
|-
|-
|‎<code>:service</code>
|اسم الخدمة.
|اسم الخدمة.
|:service
|}
|}


=== Service_exist.active_storage ===
=== <code>service_exist.active_storage</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|‎<code>:key</code>
|رمز آمن.
|رمز آمن.
|:key
|-
|-
|‎<code>:service</code>
|اسم الخدمة.
|اسم الخدمة.
|:service
|-
|-
|الملف أو السقوط موجود أم لا.
|‎<code>:exist</code>
|:exist
|ملف أو كائن بيانات ثنائية موجود أم لا.
|}
|}


=== Service_url.active_storage ===
=== <code>service_url.active_storage</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|‎<code>:key</code>
|رمز آمن.
|رمز آمن.
|:key
|-
|-
|‎<code>:service</code>
|اسم الخدمة.
|اسم الخدمة.
|:service
|-
|-
|عنوان URL أُنشأ.
|‎<code>:url</code>
|:url
|عنوان URL المولد.
|}
|}


== Railties ==
== Railties ==


=== Load_config_initializer.railties ===
=== <code>load_config_initializer.railties</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|المسار لتحميل مُهيئ من config / initializers.
|‎<code>:initializer</code>
|:initializer
|مسار تحميل مُهيئ من config/initializers.
|}
|}


== Rails ==
== Rails ==


=== Deprecation.rails ===
=== <code>deprecation.rails</code> ===
{| class="wikitable"
{| class="wikitable"
|القيمة
!المفتاح
|المفتاح
!القيمة
|-
|-
|تحذير الانتقاص.
|‎<code>:message</code>
|:message
|تحذير الإهمال.
|-
|-
|من اين جاء الانتقاص.
|‎<code>:callstack</code>
|:callstack
|من أين جاء تحذير الإهمال.
|}
|}


== الاشتراك في الحدث ==
== الاشتراك في الحدث ==
الاشتراك في حدث أمر سهل. استخدم ActiveSupport :: Notifications.subscribe مع كتلة للاستماع إلى أي إخطار.
الاشتراك في حدث أمر سهل. استخدم <code>ActiveSupport::Notifications.subscribe</code> مع كتلة للاستماع إلى أي إخطار.
 
يتلقى الكتلة الوسيطات التالية:
 
- اسم الحدث.
 
- الوقت عند البدء.
 
- الوقت عند الانتهاء.


- معرف فريد لهذا الحدث.
تتلقى الكتلة الوسائط التالية:
* اسم الحدث.
* وقت بدء الحدث.
* وقت انتهاء الحدث.
* معرف فريد لهذا الحدث.


- الحمولة (الموضحة في الأقسام السابقة).
* الحمولة (الموضحة في الأقسام السابقة).
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
ActiveSupport::Notifications.subscribe "process_action.action_controller" do |name, started, finished, unique_id, data|
ActiveSupport::Notifications.subscribe "process_action.action_controller" do |name, started, finished, unique_id, data|
 
  # your own custom stuff
 # your own custom stuff
  Rails.logger.info "#{name} Received!"
 
end
 Rails.logger.info "#{name} Received!"
 
End
</syntaxhighlight>
</syntaxhighlight>


تعريف كل وسيطات الكتلة هذه في كل مرة يمكن أن تكون مملة. يمكنك بسهولة إنشاء ActiveSupport :: Notifications :: Event من وسيطات حظر مثل هذا:
تعريف كل وسائط الكتلة هذه في كل مرة يمكن أن تكون مملة. يمكنك بسهولة إنشاء <code>ActiveSupport::Notifications::Event</code> من وسائط كتلة مثل هذا:
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
ActiveSupport::Notifications.subscribe "process_action.action_controller" do |*args|
ActiveSupport::Notifications.subscribe "process_action.action_controller" do |*args|
 
  event = ActiveSupport::Notifications::Event.new *args
 event = ActiveSupport::Notifications::Event.new *args
 
  event.name     # => "process_action.action_controller"
 event.name      # => "process_action.action_controller"
  event.duration # => 10 (in milliseconds)
 
  event.payload   # => {:extra=>information}
 event.duration  # => 10 (in milliseconds)
 
  Rails.logger.info "#{event} Received!"
 event.payload   # => {:extra=>information}
end
 
 Rails.logger.info "#{event} Received!"
 
End
</syntaxhighlight>
</syntaxhighlight>


في معظم الأحيان، لا تهتم إلا بالبيانات نفسها. هنا هو اختصار للحصول على البيانات فقط.
في معظم الأحيان، لا تهتم إلا بالبيانات نفسها. هنا هو اختصار للحصول على البيانات فقط.
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
ActiveSupport::Notifications.subscribe "process_action.action_controller" do |*args|
ActiveSupport::Notifications.subscribe "process_action.action_controller" do |*args|
 
  data = args.extract_options!
 data = args.extract_options!
  data # { extra: :information }
 
end
 data # { extra: :information }
 
End
</syntaxhighlight>
</syntaxhighlight>


يمكنك أيضًا الاشتراك في الأحداث التي تتطابق مع تعبير عادي. يتيح لك هذا الاشتراك في أحداث متعددة في وقت واحد. هنا يمكنك الاشتراك في كل شيء من ActionController.
يمكنك أيضًا الاشتراك في الأحداث التي تتطابق مع تعبير نمطي. يتيح لك هذا الاشتراك في أحداث متعددة في وقت واحد. هنا يمكنك الاشتراك في كل شيء من <code>ActionController</code>.
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
ActiveSupport::Notifications.subscribe /action_controller/ do |*args|
ActiveSupport::Notifications.subscribe /action_controller/ do |*args|
 
  # ActionController تفحُّص جميع أحداث
 # inspect all ActionController events
end
 
End
</syntaxhighlight>
</syntaxhighlight>


== إنشاء أحداث مخصصة ==
== إنشاء أحداث مخصصة ==
إضافة الأحداث الخاصة بك من السهل كذلك. ActiveSupport::Notifications سيعتني بكل الرفع الثقيل من أجلك. ببساطة تستدعى  instrument مع الاسم والحمولة والكتلة. سيرسل الإخطار بعد إرجاع الكتلة. ينشئ ActiveSupport أوقات البدء والانتهاء بالإضافة إلى المعرف الفريد. جميع البيانات التي مُررت إلى استدعاء instrument تجعلها في الحمولة.
إضافة الأحداث الخاصة بك من السهل أيضًا. <code>ActiveSupport::Notifications</code> سيعتني بكل شيء من أجلك. استدعي <code>instrument</code> ببساطة مع الاسم والحمولة والكتلة. سيرسل الإخطار بعد إرجاع الكتلة. ينشئ <code>ActiveSupport</code> أوقات البدء والانتهاء بالإضافة إلى معرف فريد. جميع البيانات التي مُررت إلى الاستدعاء <code>instrument</code> تجعلها في الحمولة.


إليك مثال على ذلك:
إليك مثال على ذلك:
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
ActiveSupport::Notifications.instrument "my.custom.event", this: :data do
ActiveSupport::Notifications.instrument "my.custom.event", this: :data do
 
  # do your custom stuff here
 # do your custom stuff here
end
 
End
</syntaxhighlight>
</syntaxhighlight>


الآن يمكنك الاستماع إلى هذا الحدث مع:
الآن يمكنك الاستماع إلى هذا الحدث مع:
<syntaxhighlight lang="rails">
<syntaxhighlight lang="rails">
ActiveSupport::Notifications.subscribe "my.custom.event" do |name, started, finished, unique_id, data|
ActiveSupport::Notifications.subscribe "my.custom.event" do |name, started, finished, unique_id, data|
 
  puts data.inspect # {:this=>:data}
 puts data.inspect # {:this=>:data}
end
 
End
</syntaxhighlight>
</syntaxhighlight>


يجب عليك اتباع معايير Rails عند تحديد الأحداث الخاصة بك. التنسيق هو: event.library. إذا كان تطبيقك يرسل التغريدات، فيجب إنشاء حدث باسم tweet.twitter.
يجب عليك اتباع معايير ريلز عند تحديد الأحداث الخاصة بك. التنسيق هو: <code>event.library</code>. إذا كان تطبيقك يرسل التغريدات، فيجب إنشاء حدث باسم <code>tweet.twitter</code>.


== مصادر ==
== مصادر ==
* [https://guides.rubyonrails.org/active_support_instrumentation.html صفحة Active Support Instrumentation في توثيق Ruby On Rails الرسمي.]
* [https://guides.rubyonrails.org/active_support_instrumentation.html صفحة Active Support Instrumentation في توثيق Ruby On Rails الرسمي.]

المراجعة الحالية بتاريخ 08:43، 25 مارس 2019

Active Support هو جزء من نواة ريلز التي توفر ملحقات للغة روبي والأدوات المساعدة وغيرها من الأشياء. أحد الأشياء التي يتضمنها هو واجهة برمجية لأدوات قياس (instrumentation API) يمكن استخدامها داخل تطبيق لقياس إجراءات معينة تحدث داخل شيفرة روبي، مثل تلك الموجودة داخل تطبيق ريلز أو إطار العمل نفسه، إذ لا يقتصر ذلك على ريلز فقط. يمكن استخدامها بشكل مستقل في شيفرات روبي البرمجية الأخرى إذا كان ذلك مطلوبًا.

في هذا الدليل، ستتعلم كيفية استخدام الواجهة البرمجية لأدوات القياس (instrumentation API) داخل Active Support لقياس الأحداث داخل ريلز وغيرها من شيفرات روبي.

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

  • ما هي الأدوات المتوافرة.
  • الخطافات داخل إطار ريلز لأدوات القياس.
  • إضافة مُشترِك (subscriber) إلى خطاف.
  • بناء تنفيذ مخصص لأداة قياس.

مقدمة إلى الأدوات

تسمح الواجهة البرمجية لأدوات القياس التي يوفرها Active Support لمطوري البرامج بتوفير خطافات يمكن لمطوري البرامج الآخرين استعمالها. هناك العديد منها في إطار ريلز. باستخدام واجهة برمجة التطبيقات هذه، يمكن للمطورين اختيار كيفية تنبيههم عند وقوع أحداث معينة داخل التطبيق أو في جزء آخر من شيفرة روبي.

على سبيل المثال، هناك خطاف يتوفر ضمن Active Record يستدعى في كل مرة يستخدم Active Record استعلام SQL في قاعدة بيانات. يمكن الاشتراك في هذا الخطاف واستخدامه لتتبع عدد طلبات البحث أثناء تنفيذ إجراء معين. هناك خطاف آخر حول معالجة إجراء وحدة التحكم. يمكن استخدام هذا، على سبيل المثال، لتتبع مدة تنفيذ إجراء معين.

يمكنك حتى إنشاء أحداثك الخاصة داخل تطبيقك والتي يمكنك الاشتراك فيها لاحقًا.

خطافات إطار ريلز

ضمن إطار ريلز، هناك عدد من الخطافات المتوافرة للأحداث الشائعة سنتظرق إليها في الأقسام الآتية.

وحدة التحكم

write_fragment.action_controller

المفتاح القيمة
 ‎:key المفتاح الكامل.
{
 key: 'posts/1-dashboard-view'
}

read_fragment.action_controller

المفتاح القيمة
 ‎:key المفتاح الكامل.
{
 key: 'posts/1-dashboard-view'
}

expire_fragment.action_controller

المفتاح القيمة
 ‎:key المفتاح الكامل.
{
 key: 'posts/1-dashboard-view'
}

exist_fragment?.action_controller

المفتاح القيمة
 ‎:key المفتاح الكامل.
{
 key: 'posts/1-dashboard-view'
}

 write_page.action_controller

المفتاح القيمة
 ‎:key المفتاح الكامل.
{
 path: '/users/1'
}

expire_page.action_controller

المفتاح القيمة
 ‎:path المسار الكامل.
{
 path: '/users/1'
}

start_processing.action_controller

المفتاح القيمة
:controller اسم وحدة التحكم
:action الإجراء
:params جدول Hash من معاملات الطلب دون أي معامل مرشح
:headers ترويسات طلب
:format html/js/json/xml ...إلخ.
:method فعل طلب HTTP
:path طلب المسار
{
  controller: "PostsController",
  action: "new",
  params: { "action" => "new", "controller" => "posts" },
  headers: #<ActionDispatch::Http::Headers:0x0055a67a519b88>,
  format: :html,
  method: "GET",
  path: "/posts/new"
}

process_action.action_controller

المفتاح القيمة
:controller اسم وحدة التحكم
:action الإجراء
:params جدول Hash لمعاملات الطلب من غير أي معامل مرشح
:headers ترويسات الطلب
:format html/js/json/xml ...إلخ.
:method فعل طلب HTTP
:path طلب المسار
:status رمز حالة HTTP
:view_runtime الكمية المستغرقة في واجهة العرض بالمللي ثانية.
:db_runtime الكمية المستغرقة لتنفيذ استعلامات قاعدة البيانات بالميللي ثانية.
{
  controller: "PostsController",
  action: "index",
  params: {"action" => "index", "controller" => "posts"},
  headers: #<ActionDispatch::Http::Headers:0x0055a67a519b88>,
  format: :html,
  method: "GET",
  path: "/posts",
  status: 200,
  view_runtime: 46.848,
  db_runtime: 0.157
}

send_file.action_controller

المفتاح القيمة
 ‎:path المسار الكامل.

ملاحظة: يمكن إضافة مفاتيح إضافية من قبل المتصل.

send_data.action_controller

ليس لدى المتحكم ActionController أي معلومات محددة للحمولة (payload). تُمرر جميع الخيارات إلى الحمولة (payload).

redirect_to.action_controller

المفتاح القيمة
:status رمز استجابة HTTP
:location عنوان URL لإعادة التوجيه إليه
{
  status: 302,
  location: "http://localhost:3000/posts/new"
}

halted_callback.action_controller

القيمة المفتاح
:filter المرشح الذي أوقف الإجراء.
{
 filter: ":halting_filter"
}

unpermitted_parameters.action_controller

المفتاح القيمة
:keys المفاتيح غير مسموح بها.

Action View

render_template.action_view

المفتاح القيمة
:identifier المسار الكامل للقالب.
:layout تخطيط قابل للتطبيق.
{
  identifier: "/Users/adam/projects/notifications/app/views/posts/index.html.erb",
  layout: "layouts/application"
}

render_partial.action_view

المفتاح القيمة
:identifier المسار الكامل للقالب.
{
  identifier: "/Users/adam/projects/notifications/app/views/posts/_form.html.erb"
}

render_collection.action_view

المفتاح القيمة
 ‎:identifier المسار الكامل للقالب.
‎:count حجم المجموعة.
‎:cache_hits عدد الجزيئات التي جُلبت من ذاكرة التخزين المؤقت.

المفتاح cache_hits: يُضمَّن فقط إذا صُيِّرت المجموعة مع cached: true.

{
  identifier: "/Users/adam/projects/notifications/app/views/posts/_post.html.erb",
  count: 3,
  cache_hits: 0
}

Active Record

sql.active_record

المفتاح القيمة
:sql تعليمة SQL.
:name اسم العملية.
:connection_id self.object_id
:binds معاملات الربط.
:cached تضاف true عند استخدام الاستعلامات المخبأة.

ملاحظة: ستضيف المحولات البيانات الخاصة بها أيضًا.

{
  sql: "SELECT \"posts\".* FROM \"posts\" ",
  name: "Post Load",
  connection_id: 70307250813140,
  binds: []
}

instantiation.active_record

المفتاح القيمة
:record_count عدد السجلات التي أُنشئت نسخ لها.
:class_name صنف السجل.
{
  record_count: 1,
  class_name: "User"
}

Action Mailer

receive.action_mailer

المفتاح القيمة
:mailer اسم صنف المرسل.
:message_id معرف الرسالة، التي أُنشئت بواسطة الجوهرة Mail.
:subject موضوع البريد.
:to عنوان (عناوين) المُرسَل إليه.
:from عنوان المُرسِل.
:bcc عناوين الأشخاص المراد إرسال نسخة مخفية (BCC) من البريد إليهم.
:cc عناوين الأشخاص المراد إرسال نسخة (CC) من البريد إليهم.
:date تاريخ البريد.
:mail شكل مشفر للبريد.
{
  mailer: "Notification",
  message_id: "4f5b5491f1774_181b23fc3d4434d38138e5@mba.local.mail",
  subject: "Rails Guides",
  to: ["users@rails.com", "dhh@rails.com"],
  from: ["me@rails.com"],
  date: Sat, 10 Mar 2012 14:18:09 +0100,
  mail: "..." # omitted for brevity
}

deliver.action_mailer

المفتاح القيمة
:mailer اسم صنف المرسل.
:message_id معرف الرسالة، التي أُنشئت بواسطة الجوهرة Mail.
:subject موضوع البريد.
:to عنوان (عناوين) المُرسَل إليه.
:from عنوان المُرسِل.
:bcc عناوين الأشخاص المراد إرسال نسخة مخفية (BCC) من البريد إليهم.
:cc عناوين الأشخاص المراد إرسال نسخة (CC) من البريد إليهم.
:date تاريخ البريد.
:mail شكل مشفر للبريد.
{
  mailer: "Notification",
  message_id: "4f5b5491f1774_181b23fc3d4434d38138e5@mba.local.mail",
  subject: "Rails Guides",
  to: ["users@rails.com", "dhh@rails.com"],
  from: ["me@rails.com"],
  date: Sat, 10 Mar 2012 14:18:09 +0100,
  mail: "..." # omitted for brevity
}

process.action_mailer

المفتاح القيمة
:mailer اسم صنف الارسال.
:action الإجراء.
:args الوسائط.
{
  mailer: "Notification",
  action: "welcome_email",
  args: []
}

Active Support

cache_read.active_support

المفتاح القيمة
‎:key المفتاح المستخدم في المخزن.
‎:hit إذا كانت هذه القراءة (read) هي النتيجة.
‎:super_operation يضاف ‎:fetch عند استخدام read مع ‎.fetch.

cache_generate.active_support

يستخدم هذا الحدث فقط عندما تستدعى ‎.fetch مع كتلة.

المفتاح القيمة
:key المفتاح المستخدم في المخزن.

ملاحظة: تدمج الخيارات التي مُررت لجلب البيانات مع الحمولة عند الكتابة إلى المخزن.

{
  key: 'name-of-complicated-computation'
}

cache_fetch_hit.active_support

يستخدم هذا الحدث فقط عندما تستدعى ‎.fetch مع كتلة.

المفتاح القيمة
:key المفتاح المستخدم في المخزن.

ملاحظة: تدمج الخيارات التي مُررت لجلب البيانات مع الحمولة.

{
  key: 'name-of-complicated-computation'
}

cache_write.active_support

المفتاح القيمة
:key المفتاح المستخدم في المخزن.

ملاحظة: قد تضيف مخازن ذاكرة التخزين المؤقت مفاتيحها الخاصة.

{
  key: 'name-of-complicated-computation'
}

cache_delete.active_support

المفتاح القيمة
:key المفتاح المستخدم في المخزن.
{
  key: 'name-of-complicated-computation'
}

cache_exist?.active_support

المفتاح القيمة
:key المفتاح المستخدم في المخزن.
{
  key: 'name-of-complicated-computation'
}

Active Job

enqueue_at.active_job

المفتاح القيمة
:adapter كائن QueueAdapter يعالج الوظيفة.
:job كائن الوظيفة.

enqueue.active_job

المفتاح القيمة
:adapter كائن QueueAdapter يعالج الوظيفة.
:job كائن الوظيفة.

perform_start.active_job

المفتاح القيمة
:adapter كائن QueueAdapter يعالج الوظيفة.
:job كائن الوظيفة.

perform.active_job

المفتاح القيمة
:adapter كائن QueueAdapter يعالج الوظيفة.
:job كائن الوظيفة.

Action Cable

perform_action.action_cable

المفتاح القيمة
:channel_class اسم صنف القناة.
:action الإجراء.
:data جدول Hash من البيانات.

transmit.action_cable

المفتاح القيمة
:channel_class اسم صنف القناة.
:data جدول Hash من البيانات.
:via النقل عبر (via).

transmit_subscription_confirmation.action_cable

المفتاح القيمة
:channel_class اسم صنف القناة.

transmit_subscription_rejection.action_cable

المفتاح القيمة
:channel_class اسم صنف القناة.

broadcast.action_cable

المفتاح القيمة
:broadcasting بث مسمى.
:message جدول Hash للرسالة.
:coder المرمز (coder).

Active Storage

service_upload.active_storage

المفتاح القيمة
:key رمز آمن.
:service اسم الخدمة.
:checksum تدقيق لضمان السلامة.

service_streaming_download.active_storage

المفتاح القيمة
:key رمز آمن.
:service اسم الخدمة.

service_download.active_storage

المفتاح القيمة
:key رمز آمن.
:service اسم الخدمة.

service_delete.active_storage

المفتاح القيمة
:key رمز آمن.
:service اسم الخدمة.

service_delete_prefixed.active_storage

المفتاح القيمة
:prefix بادئة المفتاح.
:service اسم الخدمة.

service_exist.active_storage

المفتاح القيمة
:key رمز آمن.
:service اسم الخدمة.
:exist ملف أو كائن بيانات ثنائية موجود أم لا.

service_url.active_storage

المفتاح القيمة
:key رمز آمن.
:service اسم الخدمة.
:url عنوان URL المولد.

Railties

load_config_initializer.railties

المفتاح القيمة
:initializer مسار تحميل مُهيئ من config/initializers.

Rails

deprecation.rails

المفتاح القيمة
:message تحذير الإهمال.
:callstack من أين جاء تحذير الإهمال.

الاشتراك في الحدث

الاشتراك في حدث أمر سهل. استخدم ActiveSupport::Notifications.subscribe مع كتلة للاستماع إلى أي إخطار.

تتلقى الكتلة الوسائط التالية:

  • اسم الحدث.
  • وقت بدء الحدث.
  • وقت انتهاء الحدث.
  • معرف فريد لهذا الحدث.
  • الحمولة (الموضحة في الأقسام السابقة).
ActiveSupport::Notifications.subscribe "process_action.action_controller" do |name, started, finished, unique_id, data|
  # your own custom stuff
  Rails.logger.info "#{name} Received!"
end

تعريف كل وسائط الكتلة هذه في كل مرة يمكن أن تكون مملة. يمكنك بسهولة إنشاء ActiveSupport::Notifications::Event من وسائط كتلة مثل هذا:

ActiveSupport::Notifications.subscribe "process_action.action_controller" do |*args|
  event = ActiveSupport::Notifications::Event.new *args
 
  event.name      # => "process_action.action_controller"
  event.duration  # => 10 (in milliseconds)
  event.payload   # => {:extra=>information}
 
  Rails.logger.info "#{event} Received!"
end

في معظم الأحيان، لا تهتم إلا بالبيانات نفسها. هنا هو اختصار للحصول على البيانات فقط.

ActiveSupport::Notifications.subscribe "process_action.action_controller" do |*args|
  data = args.extract_options!
  data # { extra: :information }
end

يمكنك أيضًا الاشتراك في الأحداث التي تتطابق مع تعبير نمطي. يتيح لك هذا الاشتراك في أحداث متعددة في وقت واحد. هنا يمكنك الاشتراك في كل شيء من ActionController.

ActiveSupport::Notifications.subscribe /action_controller/ do |*args|
  # ActionController تفحُّص جميع أحداث
end

إنشاء أحداث مخصصة

إضافة الأحداث الخاصة بك من السهل أيضًا. ActiveSupport::Notifications سيعتني بكل شيء من أجلك. استدعي instrument ببساطة مع الاسم والحمولة والكتلة. سيرسل الإخطار بعد إرجاع الكتلة. ينشئ ActiveSupport أوقات البدء والانتهاء بالإضافة إلى معرف فريد. جميع البيانات التي مُررت إلى الاستدعاء instrument تجعلها في الحمولة.

إليك مثال على ذلك:

ActiveSupport::Notifications.instrument "my.custom.event", this: :data do
  # do your custom stuff here
end

الآن يمكنك الاستماع إلى هذا الحدث مع:

ActiveSupport::Notifications.subscribe "my.custom.event" do |name, started, finished, unique_id, data|
  puts data.inspect # {:this=>:data}
end

يجب عليك اتباع معايير ريلز عند تحديد الأحداث الخاصة بك. التنسيق هو: event.library. إذا كان تطبيقك يرسل التغريدات، فيجب إنشاء حدث باسم tweet.twitter.

مصادر