الفرق بين المراجعتين ل"Rails/configuring"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(اكمال إضافة الصفحة وتنسيقها. هذه الصفحة من مساهمات "هشام رزق الله")
سطر 1: سطر 1:
ضبط تطبيقات ريلز
+
<noinclude>{{DISPLAYTITLE:ضبط تطبيقات ريلز}}</noinclude>
 
 
 
يغطي هذا الدليل ميزات الضبط والتهيئة المتاحة لتطبيقات ريلز. بعد قراءة هذا الدليل، ستتعلم:
 
يغطي هذا الدليل ميزات الضبط والتهيئة المتاحة لتطبيقات ريلز. بعد قراءة هذا الدليل، ستتعلم:
 
* كيفية ضبط سلوك تطبيقات ريلز.
 
* كيفية ضبط سلوك تطبيقات ريلز.
 
* كيفية إضافة شيفرة مصدريّة إضافية لتنفيذها وقت بدء تشغيل التطبيق.
 
* كيفية إضافة شيفرة مصدريّة إضافية لتنفيذها وقت بدء تشغيل التطبيق.
  
= مواقع شيفرة التهيئة والضبط =
+
== مواقع شيفرة التهيئة والضبط ==
 
يوفر ريلز أربعة مواضع رئيسيّة لوضع الشيفرة المصدريّة للتهيئة:
 
يوفر ريلز أربعة مواضع رئيسيّة لوضع الشيفرة المصدريّة للتهيئة:
 
* config/application.rb
 
* config/application.rb
سطر 13: سطر 12:
  
 
== تشغيل شيفرة برمجية قبل ريلز ==
 
== تشغيل شيفرة برمجية قبل ريلز ==
في الحدث النادر الذي يحتاج تطبيقك لتشغيل بعض الشيفرات البرمجية قبل تحميل ريلز نفسه، ضعها قبل استدعاء <code>require 'rails/all'‎</code> في config/application.rb.
+
في أحيان نادرة، يحتاج تطبيقك لتشغيل بعض الشيفرات البرمجية قبل تحميل ريلز نفسه، ذا ضعها آنذاك قبل استدعاء <code>require 'rails/all'‎</code> في config/application.rb.
  
== إعداد مكونات ريلز ==
+
== ضبط مكونات ريلز ==
بشكل عام، تعني مهمة إعداد ريلز إعداد مكونات ريلز بالإضافة إلى ريلز نفسه، يسمح لك ملف الضبط config/application.rb وملفات الضبط الخاصة بالبيئة (مثل الملف config/environments/production.rb) بتحديد الإعدادات المتنوّعة التي تريد تمريرها إلى كافة المكونات.
+
بشكل عام، تعني مهمة ضبط ريلز إعداد مكونات ريلز بالإضافة إلى ريلز نفسه. يسمح لك ملف الضبط config/application.rb وملفات الضبط الخاصة بالبيئة (مثل الملف config/environments/production.rb) بتحديد الإعدادات المتنوّعة التي تريد تمريرها إلى كافة المكونات.
  
 
على سبيل المثال، يمكنك إضافة هذا الإعداد إلى الملف config/application.rb:<syntaxhighlight lang="rails">
 
على سبيل المثال، يمكنك إضافة هذا الإعداد إلى الملف config/application.rb:<syntaxhighlight lang="rails">
 
config.time_zone = 'Central Time (US & Canada)'
 
config.time_zone = 'Central Time (US & Canada)'
</syntaxhighlight>هذه إعدادات لريلز نفسه، إذا كنت ترغب في تمرير الإعدادات إلى مكونات Rails فرديّة، فيمكنك القيام بذلك عبر نفس كائن الضبط في config/application.rb:<syntaxhighlight lang="rails">
+
</syntaxhighlight>هذه إعدادات لريلز نفسه، إذا كنت ترغب في تمرير الإعدادات إلى مكونات ريلز فرديّة، فيمكنك القيام بذلك عبر نفس كائن الضبط في config/application.rb:<syntaxhighlight lang="rails">
 
config.active_record.schema_format = :ruby
 
config.active_record.schema_format = :ruby
 
</syntaxhighlight>سيستخدم ريلز هذا الإعداد لضبط [[Rails/active record basics|السجل الفعال]].
 
</syntaxhighlight>سيستخدم ريلز هذا الإعداد لضبط [[Rails/active record basics|السجل الفعال]].
  
== إعدادات ريلز العامة ==
+
=== إعدادات ريلز العامة ===
 
ستُستدعى توابع الإعدادات هذه على الكائن <code>Rails::Railtie</code> مثل صنف فرعي من <code>Rails::Engine</code> أو <code>Rails::Application</code>.
 
ستُستدعى توابع الإعدادات هذه على الكائن <code>Rails::Railtie</code> مثل صنف فرعي من <code>Rails::Engine</code> أو <code>Rails::Application</code>.
 
* <code>config.after_initialize</code>: يأخذ الكتلة التي سيتم تنفيذها بعدما ينتهي ريلز من تهيئة التطبيق، ويتضمّن هذا تهيئة الإطار نفسه، والمحركات، وجميع مهيئات التطبيق في config/initializers، لاحظ أن هذه الكتلة ستُنفَّذ لمهام البداية، وهي مفيدة لضبط القيم المعدّة بواسطة مهيئات أخرى:
 
* <code>config.after_initialize</code>: يأخذ الكتلة التي سيتم تنفيذها بعدما ينتهي ريلز من تهيئة التطبيق، ويتضمّن هذا تهيئة الإطار نفسه، والمحركات، وجميع مهيئات التطبيق في config/initializers، لاحظ أن هذه الكتلة ستُنفَّذ لمهام البداية، وهي مفيدة لضبط القيم المعدّة بواسطة مهيئات أخرى:
سطر 34: سطر 33:
 
* <code>config.asset_host</code>: يعيّن المضيف للأصول (assets)، وهو مفيدة عندما يُستخدم CDN لاستضافة الأصول أو عندما تريد العمل حول قيود التزامن المضمنة في المتصفحات باستخدام أسماء النطاقات المستعارة المختلفة. وهي نسخة مختصرة لـ <code>config.action_controller.asset_host</code>.
 
* <code>config.asset_host</code>: يعيّن المضيف للأصول (assets)، وهو مفيدة عندما يُستخدم CDN لاستضافة الأصول أو عندما تريد العمل حول قيود التزامن المضمنة في المتصفحات باستخدام أسماء النطاقات المستعارة المختلفة. وهي نسخة مختصرة لـ <code>config.action_controller.asset_host</code>.
 
* <code>config.autoload_once_paths</code>: يقبل مصفوفة من المسارات التي سيحمل ريلز تلقائيًّا الثوابت منها التي لن تمسح لكل طلب، وهي مناسبة إذا كان <code>config.cache_classes</code> يساوي <code>false</code>، والتي هي الحالة الافتراضيّة لوضع التطوير. وخلاف ذلك، يحدث كل التحميل التلقائي مرّة واحدة فقط، ويجب أن تكون جميع عناصر هذه المصفوفة في <code>autoload_paths</code>. بشكل افتراضي هي مصفوفة فارغة.
 
* <code>config.autoload_once_paths</code>: يقبل مصفوفة من المسارات التي سيحمل ريلز تلقائيًّا الثوابت منها التي لن تمسح لكل طلب، وهي مناسبة إذا كان <code>config.cache_classes</code> يساوي <code>false</code>، والتي هي الحالة الافتراضيّة لوضع التطوير. وخلاف ذلك، يحدث كل التحميل التلقائي مرّة واحدة فقط، ويجب أن تكون جميع عناصر هذه المصفوفة في <code>autoload_paths</code>. بشكل افتراضي هي مصفوفة فارغة.
* <code>config.autoload_paths</code>: يقبل مصفوفة من المسارات التي يحمل ريلز بشكل تلقائي الثوابت منها، وبشكل افتراضي هي جميع المجلدات داخل app، ولم يعد من المستحسن ضبط هذا، راجع الثوابت المحملة والمعاد تحميلها تلقائيًّا.
+
* <code>config.autoload_paths</code>: يقبل مصفوفة من المسارات التي يحمل ريلز بشكل تلقائي الثوابت منها، وبشكل افتراضي هي جميع المجلدات داخل app، ولم يعد من المستحسن ضبط هذا. راجع الثوابت المحملة والمعاد تحميلها تلقائيًّا.
 
* <code>config.cache_classes</code>: يتحكم ما إذا كان يجب إعادة تحميل أصناف التطبيق والوحدات في كل طلب، وبشكل افتراضي تكون قيمتها <code>false</code> في وضع التطوير و <code>true</code>  في أوضاع الاختبار والإنتاج.
 
* <code>config.cache_classes</code>: يتحكم ما إذا كان يجب إعادة تحميل أصناف التطبيق والوحدات في كل طلب، وبشكل افتراضي تكون قيمتها <code>false</code> في وضع التطوير و <code>true</code>  في أوضاع الاختبار والإنتاج.
 
* <code>config.beginning_of_week</code>: يعيّن بداية الأسبوع الافتراضيّة للتطبيق، وهو يقبل رمزًا يمثِّل يوم أسبوع صحيح (على سبيل المثال ‎<code>:monday</code>).
 
* <code>config.beginning_of_week</code>: يعيّن بداية الأسبوع الافتراضيّة للتطبيق، وهو يقبل رمزًا يمثِّل يوم أسبوع صحيح (على سبيل المثال ‎<code>:monday</code>).
سطر 58: سطر 57:
 
* <code>config.debug_exception_response_format</code>: تعيّن التنسيق المستخدم في الاستجابات عند حدوث الأخطاء في وضع التطوير. قيمته الافتراضية هي: ‎<code>:api</code> لتطبيقات ذات الواجهة البرمجية فقط و ‎<code>:default</code> للتطبيقات العادية.
 
* <code>config.debug_exception_response_format</code>: تعيّن التنسيق المستخدم في الاستجابات عند حدوث الأخطاء في وضع التطوير. قيمته الافتراضية هي: ‎<code>:api</code> لتطبيقات ذات الواجهة البرمجية فقط و ‎<code>:default</code> للتطبيقات العادية.
 
* <code>config.file_watcher</code>: هو الصنف المستخدم للكشف عن تحديثات الملف في نظام الملفات عندما يكون <code>config.reload_classes_only_on_change</code> مضبوطًا إلى القيمة <code>true</code>. ويأتي ريلز مع <code>ActiveSupport::FileUpdateChecker</code> - الافتراضي -، و <code>ActiveSupport::EventedFileUpdateChecker</code> (يعتمد هذا على الجوهرة [https://github.com/guard/listen listen]) ويجب أن تتوافق الأصناف المخصصة مع واجهة برمجة التطبيقات <code>ActiveSupport::FileUpdateChecker</code>.
 
* <code>config.file_watcher</code>: هو الصنف المستخدم للكشف عن تحديثات الملف في نظام الملفات عندما يكون <code>config.reload_classes_only_on_change</code> مضبوطًا إلى القيمة <code>true</code>. ويأتي ريلز مع <code>ActiveSupport::FileUpdateChecker</code> - الافتراضي -، و <code>ActiveSupport::EventedFileUpdateChecker</code> (يعتمد هذا على الجوهرة [https://github.com/guard/listen listen]) ويجب أن تتوافق الأصناف المخصصة مع واجهة برمجة التطبيقات <code>ActiveSupport::FileUpdateChecker</code>.
* <code>config.filter_parameters</code>: يُستخدم لتصفيّة المعاملات التي لا تريد عرضها في السجلات، مثل كلمات المرور وأرقام بطاقات الائتمان، وبشكل افتراضي، يصفي ريلز كلمات المرور عن طريق إضافة <code>Rails.application.config.filter_parameters += [:password]‎</code> في config/initializers/filter_parameter_logging.rb. وتعمل عملية ترشيح المعاملات من خلال مطابقة التعبير النمطي بشكل جزئي.
+
* <code>config.filter_parameters</code>: يُستخدم لتصفيّة المعاملات التي لا تريد عرضها في السجلات، مثل كلمات المرور وأرقام بطاقات الائتمان. وبشكل افتراضي، يصفي ريلز كلمات المرور عن طريق إضافة <code>Rails.application.config.filter_parameters += [:password]‎</code> في config/initializers/filter_parameter_logging.rb. وتعمل عملية ترشيح المعاملات من خلال مطابقة التعبير النمطي بشكل جزئي.
 
* <code>config.force_ssl</code>: يجبر جميع الطلبات أن تُخدم عبر HTTPS عن طريق استخدام الوسيط <code>ActionDispatch::SSL</code>، ويعيّن <code>config.action_mailer.default_url_options</code> ليكون <code>{ protocol: 'https'‎ }</code>. ويمكن ضبط ذلك عن طريق الإعداد <code>config.ssl_options</code>، - يمكنك مراجعة توثيق <code>[http://api.rubyonrails.org/v5.2.2/classes/ActionDispatch/SSL.html ActionDispatch::SSL]</code> لمزيد من المعلومات.
 
* <code>config.force_ssl</code>: يجبر جميع الطلبات أن تُخدم عبر HTTPS عن طريق استخدام الوسيط <code>ActionDispatch::SSL</code>، ويعيّن <code>config.action_mailer.default_url_options</code> ليكون <code>{ protocol: 'https'‎ }</code>. ويمكن ضبط ذلك عن طريق الإعداد <code>config.ssl_options</code>، - يمكنك مراجعة توثيق <code>[http://api.rubyonrails.org/v5.2.2/classes/ActionDispatch/SSL.html ActionDispatch::SSL]</code> لمزيد من المعلومات.
 
* <code>config.log_formatter</code>: يعّرف منسّق مسجّل ريلز، وهذا الخيار الافتراضي لنسخة <code>ActiveSupport::Logger::SimpleFormatter</code> لجميع الأوضاع، وإذا عيّنت قيمة للإعداد <code>config.logger</code>، فيجب عليك أن تمرر قيمة المنسّق (formatter) إلى المسجّل قبل تغليفه في النسخة <code>ActiveSupport::TaggedLogging</code>، ولن يفعل ريلز ذلك بالنيابة عنك.
 
* <code>config.log_formatter</code>: يعّرف منسّق مسجّل ريلز، وهذا الخيار الافتراضي لنسخة <code>ActiveSupport::Logger::SimpleFormatter</code> لجميع الأوضاع، وإذا عيّنت قيمة للإعداد <code>config.logger</code>، فيجب عليك أن تمرر قيمة المنسّق (formatter) إلى المسجّل قبل تغليفه في النسخة <code>ActiveSupport::TaggedLogging</code>، ولن يفعل ريلز ذلك بالنيابة عنك.
سطر 64: سطر 63:
 
* <code>config.log_tags</code>: يقبل قائمة من: التوابع التي يستجيب لها كائن الطلب <code>request</code>، أو كائن من النوع <code>Proc</code> يقبل كائن الطلب <code>request</code>، أو شيئًا يستجيب إلى <code>to_s</code>. هذا يجعل من وضع علامة على أسطر السجل أسهل مع تنقيح المعلومات مثل النطاق الفرعي و معرّف الطلب - وكلاهما مفيد للغاية في تنقيح تطبيقات متعددة المستخدمين في بيئة الإنتاج.
 
* <code>config.log_tags</code>: يقبل قائمة من: التوابع التي يستجيب لها كائن الطلب <code>request</code>، أو كائن من النوع <code>Proc</code> يقبل كائن الطلب <code>request</code>، أو شيئًا يستجيب إلى <code>to_s</code>. هذا يجعل من وضع علامة على أسطر السجل أسهل مع تنقيح المعلومات مثل النطاق الفرعي و معرّف الطلب - وكلاهما مفيد للغاية في تنقيح تطبيقات متعددة المستخدمين في بيئة الإنتاج.
 
* <code>config.logger</code>: هو السجل الذي سيُستخدم لـ <code>Rails.logger</code> وأي تسجيل ريلز ذا صلة مثل <code>ActiveRecord::Base.logger</code>. القيمة الافتراضية له هي نسخة من <code>ActiveSupport::TaggedLogging</code> الذي يغلف نسخة من <code>ActiveSupport::Logger</code> والتي ستُسجَّل مخرجاته في المجلد log/. يمكنك توفير مسجّل مخصّص، وللحصول على التوافق الكامل، يجب عليك اتباع هذه الإرشادات:
 
* <code>config.logger</code>: هو السجل الذي سيُستخدم لـ <code>Rails.logger</code> وأي تسجيل ريلز ذا صلة مثل <code>ActiveRecord::Base.logger</code>. القيمة الافتراضية له هي نسخة من <code>ActiveSupport::TaggedLogging</code> الذي يغلف نسخة من <code>ActiveSupport::Logger</code> والتي ستُسجَّل مخرجاته في المجلد log/. يمكنك توفير مسجّل مخصّص، وللحصول على التوافق الكامل، يجب عليك اتباع هذه الإرشادات:
** لإعتماد منسّق، يجب عليك تعيين منسّق بشكل يدوي من قيمة الضبط config.log_formatter إلى المُسجّل.
+
** لإعتماد منسّق، يجب عليك تعيين منسّق بشكل يدوي من قيمة الضبط <code>config.log_formatter</code> إلى المُسجّل.
 
** لدعم السجلات الموسومة (tagged logs)، يجب تغليف النسخة <code>log</code> مع <code>ActiveSupport::TaggedLogging</code>.
 
** لدعم السجلات الموسومة (tagged logs)، يجب تغليف النسخة <code>log</code> مع <code>ActiveSupport::TaggedLogging</code>.
 
** لدعم الوضه الصامت (silencing)، يجب أن يتضمّن المسجّل الوحدات <code>LoggerSilence</code> و <code>ActiveSupport::LoggerThreadSafeLevel</code>. الصنف <code>ActiveSupport::Logger</code> متضمن بالفعل في هذه الوحدات.
 
** لدعم الوضه الصامت (silencing)، يجب أن يتضمّن المسجّل الوحدات <code>LoggerSilence</code> و <code>ActiveSupport::LoggerThreadSafeLevel</code>. الصنف <code>ActiveSupport::Logger</code> متضمن بالفعل في هذه الوحدات.
سطر 85: سطر 84:
 
<syntaxhighlight lang="rails">
 
<syntaxhighlight lang="rails">
 
config.session_store :my_custom_store
 
config.session_store :my_custom_store
</syntaxhighlight>يجب تعرف هذا المخزن كـ ActionDispatch::Session::MyCustomStore.
+
</syntaxhighlight>يجب تعرف هذا المخزن كـ <code>ActionDispatch::Session::MyCustomStore</code>.
 
* <code>config.time_zone</code>: يعيّن المنطقة الزمنيّة الافتراضيّة للتطبيق ويفعّل المنطقة الزمنيّة [[Rails/active record basics|للسجل الفعال]].
 
* <code>config.time_zone</code>: يعيّن المنطقة الزمنيّة الافتراضيّة للتطبيق ويفعّل المنطقة الزمنيّة [[Rails/active record basics|للسجل الفعال]].
  
== ضبط الأصول (Assets) ==
+
=== ضبط الأصول (Assets) ===
 
* <code>config.assets.enabled</code>: هو راية تتحكّم في تمكين خط الأنابيب (pipeline) الخاص بالأصول، وقيمته <code>true</code> بشكل افتراضي.
 
* <code>config.assets.enabled</code>: هو راية تتحكّم في تمكين خط الأنابيب (pipeline) الخاص بالأصول، وقيمته <code>true</code> بشكل افتراضي.
 
* <code>config.assets.css_compressor</code>: يعرّف ضاغط شيفرة [[CSS]] المراد استعماله، ويكون <code>sass-rails</code> بشكل افتراضي، والقيمة البديلة الفريدة في الوقت الحالي هي ‎<code>:yui</code> والتي تستخدم الجوهرة yui-compressor.
 
* <code>config.assets.css_compressor</code>: يعرّف ضاغط شيفرة [[CSS]] المراد استعماله، ويكون <code>sass-rails</code> بشكل افتراضي، والقيمة البديلة الفريدة في الوقت الحالي هي ‎<code>:yui</code> والتي تستخدم الجوهرة yui-compressor.
سطر 105: سطر 104:
 
* <code>config.assets.quiet</code>: يعطّل تسجيل طلبات الأصول، وهو <code>true</code> بشكل افتراضي في development.rb.
 
* <code>config.assets.quiet</code>: يعطّل تسجيل طلبات الأصول، وهو <code>true</code> بشكل افتراضي في development.rb.
  
== ضبط المولدات ==
+
=== ضبط المولدات ===
يسمح لك ريلز بتغيير المولدات التي تُستخدم مع أسلوب <code>config.generators</code>، ويأخذ هذا الأسلوب كتلة:<syntaxhighlight lang="rails">
+
يسمح لك ريلز بتغيير المولدات التي تُستخدم مع أسلوب <code>config.generators</code>، ويأخذ هذا الأسلوب كتلةً مثل:<syntaxhighlight lang="rails">
 
config.generators do |g|
 
config.generators do |g|
 
   g.orm :active_record
 
   g.orm :active_record
سطر 112: سطر 111:
 
end
 
end
 
</syntaxhighlight>هذه هي المجموعة الكاملة من الأساليب التي يمكن استخدامها في هذه الكتلة كالتالي:
 
</syntaxhighlight>هذه هي المجموعة الكاملة من الأساليب التي يمكن استخدامها في هذه الكتلة كالتالي:
* <code>assets</code>: تسمح لك بإنشاء الأصول عند توليد السقالة، وهي <code>true</code> بشكل افتراضي.
+
* <code>assets</code>: تسمح لك بإنشاء الأصول عند توليد السقالة (scaffold)، وهي <code>true</code> بشكل افتراضي.
 
* <code>force_plural</code>: يسمح لك بوضع أسماء النموذج بصيغة الجمع، وهي <code>false</code> بشكل افتراضي.
 
* <code>force_plural</code>: يسمح لك بوضع أسماء النموذج بصيغة الجمع، وهي <code>false</code> بشكل افتراضي.
 
* <code>helper</code>: يعرّف ما إذا كان سيتم توليد المساعدين، وهو <code>true</code> بشكل افتراضي.
 
* <code>helper</code>: يعرّف ما إذا كان سيتم توليد المساعدين، وهو <code>true</code> بشكل افتراضي.
سطر 125: سطر 124:
 
* <code>stylesheets</code>: يشغّل الخطاف (hook) لأوراق الأنماط (stylesheets) في المولدات، ويُستخدم في ريلز عند عمل المولّد <code>scaffold</code>، لكن يمكن استخدام هذا الخطاف في مولدات أخرى كذلك، وهو <code>true</code> بشكل افتراضي.
 
* <code>stylesheets</code>: يشغّل الخطاف (hook) لأوراق الأنماط (stylesheets) في المولدات، ويُستخدم في ريلز عند عمل المولّد <code>scaffold</code>، لكن يمكن استخدام هذا الخطاف في مولدات أخرى كذلك، وهو <code>true</code> بشكل افتراضي.
 
* <code>stylesheet_engine</code>: يضبط محرّك أوراق الأنماط (مثل sass) الذي يجب استخدامه عند توليد الأصول، وهو ‎<code>:css</code> بشكل افتراضي.
 
* <code>stylesheet_engine</code>: يضبط محرّك أوراق الأنماط (مثل sass) الذي يجب استخدامه عند توليد الأصول، وهو ‎<code>:css</code> بشكل افتراضي.
* <code>scaffold_stylesheet</code>: ينشئ scaffold.css عند توليد مورد دي سقالة، وهو <code>true</code> بشكل افتراضي.
+
* <code>scaffold_stylesheet</code>: ينشئ scaffold.css عند توليد مورد ذي سقالة (scaffolded controller)، وهو <code>true</code> بشكل افتراضي.
 
* <code>test_framework</code>: يعرّف أي إطار اختبار يجب استخدامه، وهو <code>false</code> وسيستخدم Minitest بشكل افتراضي.
 
* <code>test_framework</code>: يعرّف أي إطار اختبار يجب استخدامه، وهو <code>false</code> وسيستخدم Minitest بشكل افتراضي.
 
* <code>template_engine</code>: يعرّف محرك القوالب المراد استخدامه، مثل ERB أو Haml، وهو ‎<code>:erb</code> بشكل افتراضي.
 
* <code>template_engine</code>: يعرّف محرك القوالب المراد استخدامه، مثل ERB أو Haml، وهو ‎<code>:erb</code> بشكل افتراضي.
  
== ضبط البرمجيات الوسيطة ==
+
=== ضبط البرمجيات الوسيطة ===
 
يأتي كل تطبيق ريلز مع مجموعة قياسيّة من البرامج الوسيطة (middleware) التي تُستخدم في هذا الترتيب في بيئة التطوير:
 
يأتي كل تطبيق ريلز مع مجموعة قياسيّة من البرامج الوسيطة (middleware) التي تُستخدم في هذا الترتيب في بيئة التطوير:
 
* <code>ActionDispatch::SSL</code>: يفرض أن يُخدم كل طلب باستخدام HTTPS، وهو مفعّل إذا كان <code>config.force_ssl</code> يساوي <code>true</code>، ويمكن ضبط الخيارات الممرّرت إلى هذا عن طريق تعيين <code>config.ssl_options</code>.
 
* <code>ActionDispatch::SSL</code>: يفرض أن يُخدم كل طلب باستخدام HTTPS، وهو مفعّل إذا كان <code>config.force_ssl</code> يساوي <code>true</code>، ويمكن ضبط الخيارات الممرّرت إلى هذا عن طريق تعيين <code>config.ssl_options</code>.
سطر 163: سطر 162:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== ضبط الواجهة البرمجية لتدويل ريلز (i18n) ==
+
=== ضبط الواجهة البرمجية لتدويل ريلز (i18n) ===
 
يتم تفويض جميع خيارات الضبط إلى المكتبة <code>I18n</code>.
 
يتم تفويض جميع خيارات الضبط إلى المكتبة <code>I18n</code>.
 
* <code>config.i18n.available_locales</code>: تعرض القوائم البيضاء للمحليات (locale) المتوفّرة للتطبيق. وهي بشكل افتراضي لجميع مفاتيح المحليّة الموجودة في الملفات المحليّة، وهي في لاعادة ‎<code>:en</code> في التطبيق الجديد.
 
* <code>config.i18n.available_locales</code>: تعرض القوائم البيضاء للمحليات (locale) المتوفّرة للتطبيق. وهي بشكل افتراضي لجميع مفاتيح المحليّة الموجودة في الملفات المحليّة، وهي في لاعادة ‎<code>:en</code> في التطبيق الجديد.
 
* <code>config.i18n.default_locale</code>: تعيّن المحلي الافتراضي للتطبيق المستخدم في <code>I18n</code>، وهي بشكل افتراضي تساوي ‎<code>:en</code>.
 
* <code>config.i18n.default_locale</code>: تعيّن المحلي الافتراضي للتطبيق المستخدم في <code>I18n</code>، وهي بشكل افتراضي تساوي ‎<code>:en</code>.
* <code>config.i18n.enforce_available_locales</code>: يضمن أن جميع المحليات التي مرّت عبر <code>I18n</code> قد أُعلن عنها في قائمة <code>available_locales</code>، وسيرمي استثناء <code>I18n::InvalidLocale</code> عند إعداد محلي غير متوفّر، وهي بشكل افتراضي <code>true</code>، ومن المستحسن عدم تعطيل هذا الخيار ما لم يكن مطلوبًا بشدّة، حيث يعمل هذا كمقياس أمان ضد تعيين أي محلي غير صالح من المدخلات المستخدم.
+
* <code>config.i18n.enforce_available_locales</code>: يضمن أن جميع المحليات التي مرّت عبر <code>I18n</code> قد أُعلن عنها في قائمة <code>available_locales</code>، وسيرمي الاستثناء <code>I18n::InvalidLocale</code> عند إعداد محلي غير متوفّر. وهي بشكل افتراضي <code>true</code>، ومن المستحسن عدم تعطيل هذا الخيار ما لم يكن مطلوبًا بشدّة، حيث يعمل هذا كمقياس أمان ضد تعيين أي محلي غير صالح من المدخلات المستخدم.
* <code>config.i18n.load_path</code>: يعيّن المسار الذي يستخدمه ريلز للبحث عن الملفات المحليّة، وهي بشكل افتراضي تساوي <code>config/locales/*.{yml,rb}‎</code>.
+
* <code>config.i18n.load_path</code>: يعيّن المسار الذي يستخدمه ريلز للبحث عن الملفات المحليّة. وهي بشكل افتراضي تساوي <code>config/locales/*.{yml,rb}‎</code>.
* <code>config.i18n.fallbacks</code>: يعيّن السلوك الاحتياطي للترجمات المفقودة، وهذه 3 أمثلة استخدام لهذا الخيار:
+
* <code>config.i18n.fallbacks</code>: يعيّن السلوك الاحتياطي للترجمات المفقودة. إليك ثلاثة أمثلة استخدام لهذا الخيار:
  
 
** يمكنك تعيين الخيار على <code>true</code> لاستخدام المحلي الافتراضي:
 
** يمكنك تعيين الخيار على <code>true</code> لاستخدام المحلي الافتراضي:
سطر 187: سطر 186:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== ضبط السجل الفعال ==
+
=== ضبط السجل الفعال ===
 
يتضمّن <code>config.active_record</code> مجموعة متنوّعة من خيارات الضبط:
 
يتضمّن <code>config.active_record</code> مجموعة متنوّعة من خيارات الضبط:
 
* <code>config.active_record.logger</code>: يقبل مسجلًا يتطابق مع الواجهة <code>Log4r</code> أو الصنف <code>Logger</code> الافتراضي الذي يخص روبي، والذي يمرر بعد ذلك إلى أي اتصالات قاعدة بيانات جديدة تم إنشاؤها. يمكنك استرداد هذا السجل من خلال استدعاء <code>logger</code> إما في صنف نموذج السجل الفعال أو في نسخة نموذج السجل الفعال. ويمكنك تعيينه إلى القيمة <code>nil</code> لتعطيل التسجيل.
 
* <code>config.active_record.logger</code>: يقبل مسجلًا يتطابق مع الواجهة <code>Log4r</code> أو الصنف <code>Logger</code> الافتراضي الذي يخص روبي، والذي يمرر بعد ذلك إلى أي اتصالات قاعدة بيانات جديدة تم إنشاؤها. يمكنك استرداد هذا السجل من خلال استدعاء <code>logger</code> إما في صنف نموذج السجل الفعال أو في نسخة نموذج السجل الفعال. ويمكنك تعيينه إلى القيمة <code>nil</code> لتعطيل التسجيل.
سطر 194: سطر 193:
 
**‎<code>:table_name_with_underscore</code>: سيجعل المفتاح الأساسي للصنف <code>Customer</code> هو <code>customer_id</code>.
 
**‎<code>:table_name_with_underscore</code>: سيجعل المفتاح الأساسي للصنف <code>Customer</code> هو <code>customer_id</code>.
 
* <code>config.active_record.table_name_prefix</code>: يتيح لك تعيين سلسلة عامة (global) لارفاقها بأسماء الجداول. إذا قمت تعيين هذا الضبط إلى <code>northwest_‎</code>، فإن الصنف <code>Customer</code> سيبحث عن <code>northwest_customers</code> كجدول له. وبشكل افتراضي يساوي سلسلة نصيّة فارغة.
 
* <code>config.active_record.table_name_prefix</code>: يتيح لك تعيين سلسلة عامة (global) لارفاقها بأسماء الجداول. إذا قمت تعيين هذا الضبط إلى <code>northwest_‎</code>، فإن الصنف <code>Customer</code> سيبحث عن <code>northwest_customers</code> كجدول له. وبشكل افتراضي يساوي سلسلة نصيّة فارغة.
* <code>config.active_record.table_name_suffix</code>: يتيح لك تعيين سلسلة عامة (global) لإلحاقها بأسماء الجداول،. إذا قمت تعيين هذا الضبط إلى <code>_northwest</code> فإن الصنف <code>Customer</code> سيبحث عن <code>customers_northwest</code> كجدول له. وبشكل افتراضي يساوي سلسلة نصيّة فارغة.
+
* <code>config.active_record.table_name_suffix</code>: يتيح لك تعيين سلسلة عامة (global) لإلحاقها بأسماء الجداول. إذا قمت تعيين هذا الضبط إلى <code>_northwest</code> فإن الصنف <code>Customer</code> سيبحث عن <code>customers_northwest</code> كجدول له. وبشكل افتراضي يساوي سلسلة نصيّة فارغة.
 
* <code>config.active_record.schema_migrations_table_name</code>: يتيح لك تعيين سلسلة نصيّة لاستخدامها كاسم جدول تهجيرات المخطط (schema migrations table).
 
* <code>config.active_record.schema_migrations_table_name</code>: يتيح لك تعيين سلسلة نصيّة لاستخدامها كاسم جدول تهجيرات المخطط (schema migrations table).
 
* <code>config.active_record.internal_metadata_table_name</code>: يتيح لك تعيين سلسلة نصيّة لاستخدامها كاسم جدول البيانات الأوليّة الداخلية.
 
* <code>config.active_record.internal_metadata_table_name</code>: يتيح لك تعيين سلسلة نصيّة لاستخدامها كاسم جدول البيانات الأوليّة الداخلية.
 
* <code>config.active_record.protected_environments</code>: يتيح لك تعيين مصفوفة من أسماء البيئات التي ينبعي فيها حظر الإجراءات المدمرة (destructive actions).
 
* <code>config.active_record.protected_environments</code>: يتيح لك تعيين مصفوفة من أسماء البيئات التي ينبعي فيها حظر الإجراءات المدمرة (destructive actions).
 
* <code>config.active_record.pluralize_table_names</code>: يحدد ما إذا كان ريلز سيبحث عن أسماء الجداول المفردة أو الجمع في قاعدة البيانات. إذا تم تعيينه على <code>true</code> (الافتراضي)، فسيستخدم الصنف <code>Customer</code> الجدول <code>customers</code> وإذا كانت <code>false</code>، فسيستخدم الصنف <code>Customer</code> الجدول <code>customer</code>.
 
* <code>config.active_record.pluralize_table_names</code>: يحدد ما إذا كان ريلز سيبحث عن أسماء الجداول المفردة أو الجمع في قاعدة البيانات. إذا تم تعيينه على <code>true</code> (الافتراضي)، فسيستخدم الصنف <code>Customer</code> الجدول <code>customers</code> وإذا كانت <code>false</code>، فسيستخدم الصنف <code>Customer</code> الجدول <code>customer</code>.
* <code>config.active_record.default_timezone</code>: يحدد ما إذا كان سيُستخدم <code>Time.local</code> (إذا عيّن إلى القيمة <code>:local</code>) أو <code>Time.utc</code> (إذا عيّن إلى القيمة <code>:utc</code>) عند سحب التواريخ والأوقات من قاعدة البيانات. القيمة الافتراضية لهذا الخيار هي <code>:utc</code>.
+
* <code>config.active_record.default_timezone</code>: يحدد ما إذا كان سيُستخدم <code>Time.local</code> (إذا عيّن إلى القيمة <code>:local</code>) أو <code>Time.utc</code> (إذا عيّن إلى القيمة <code>:utc</code>) عند سحب التواريخ والأوقات من قاعدة البيانات. القيمة الافتراضية لهذا الخيار هي <code>:utc</code>.
* <code>config.active_record.schema_format</code>: يتحكم في التنسيق من أجل تفريغ مخطط قاعدة البيانات إلى ملف. والخيارات هي <code>:ruby</code> (الافتراضي) لإصدار مستقل لقاعدة البيانات يعتمد على عمليات التهجير، أو <code>:sql</code> لمجموعة من تعليمات [[SQL]] (التي يمكن أن تعتمد على قاعدة البيانات).
+
* <code>config.active_record.schema_format</code>: يتحكم في التنسيق من أجل تفريغ مخطط قاعدة البيانات إلى ملف. والخيارات هي <code>:ruby</code> (الافتراضي) لإصدار مستقل لقاعدة البيانات يعتمد على عمليات التهجير، أو <code>:sql</code> لمجموعة من تعليمات [[SQL]] (التي يمكن أن تعتمد على قاعدة البيانات).
 
* <code>config.active_record.error_on_ignored_order</code>: يحدد ما إذا كان ينبغي رفع الخطأ إذا تم تجاهل ترتيب الاستعلام أثناء استعلام مجموعة واحدة. الخيارات هي <code>true</code> (رفع خطأ) أو <code>false</code> (تحذير)، وبشكل افتراضي تساوي <code>false</code>.
 
* <code>config.active_record.error_on_ignored_order</code>: يحدد ما إذا كان ينبغي رفع الخطأ إذا تم تجاهل ترتيب الاستعلام أثناء استعلام مجموعة واحدة. الخيارات هي <code>true</code> (رفع خطأ) أو <code>false</code> (تحذير)، وبشكل افتراضي تساوي <code>false</code>.
 
* <code>config.active_record.timestamped_migrations</code>: تتحكم ما إذا كان يتم ترقيم عمليات التهجير باستخدام أرقام مسلسلة أو مع طوابع زمنيّة (timestamps). بشكل افتراضي تساوي <code>true</code> لاستخدام الطوابع الزمنية، والتي يفضل استخدامها إذا كان هنالك العديد من المطورين الذي يعملون على نفس التطبيق.
 
* <code>config.active_record.timestamped_migrations</code>: تتحكم ما إذا كان يتم ترقيم عمليات التهجير باستخدام أرقام مسلسلة أو مع طوابع زمنيّة (timestamps). بشكل افتراضي تساوي <code>true</code> لاستخدام الطوابع الزمنية، والتي يفضل استخدامها إذا كان هنالك العديد من المطورين الذي يعملون على نفس التطبيق.
سطر 208: سطر 207:
 
* <code>config.active_record.partial_writes</code>: هو قيمة منطقيّة وتتحكّم ما إذا كانت تُستخدم عمليات الكتابة الجزئية أم لا (بمعنى ما إذا كانت التحديثات تعيّن الخاصيات المتسخة [dirty]). لاحظ أنه عند استخدام عمليات الكتابة الجزئية، يجب عليك استخدام القفل المستبشر <code>config.active_record.lock_optimistically</code> نظرًا لأن التحديثات المتزامنة قد تكتب الخاصيات استنادًا إلى حالة قراءة تالفة. بشكل افتراضي يساوي <code>true</code>.
 
* <code>config.active_record.partial_writes</code>: هو قيمة منطقيّة وتتحكّم ما إذا كانت تُستخدم عمليات الكتابة الجزئية أم لا (بمعنى ما إذا كانت التحديثات تعيّن الخاصيات المتسخة [dirty]). لاحظ أنه عند استخدام عمليات الكتابة الجزئية، يجب عليك استخدام القفل المستبشر <code>config.active_record.lock_optimistically</code> نظرًا لأن التحديثات المتزامنة قد تكتب الخاصيات استنادًا إلى حالة قراءة تالفة. بشكل افتراضي يساوي <code>true</code>.
 
* <code>config.active_record.maintain_test_schema</code>: هي قيمة منطقيّة تتحكم في ما إذا كان السجل الفعال يجب أن يحاول تحديث مخطط قاعدة بيانات الاختبار (test database schema) مع db/schema.rb (أو db/structure.sql) عند تشغيل الاختبارات. بشكل افتراضي يساوي <code>true</code>.
 
* <code>config.active_record.maintain_test_schema</code>: هي قيمة منطقيّة تتحكم في ما إذا كان السجل الفعال يجب أن يحاول تحديث مخطط قاعدة بيانات الاختبار (test database schema) مع db/schema.rb (أو db/structure.sql) عند تشغيل الاختبارات. بشكل افتراضي يساوي <code>true</code>.
* <code>config.active_record.dump_schema_after_migration</code>: هو راية تتحكّم في ما إذا كان يجب أن يحدث تفريغ المخطّط (db/schema.rb أو db/structure.sql) عند تشغيل عمليات التهجير. ويعيّن هذه الراية إلى القيمة <code>false</code> في config/environments/production.rb المنشئ بواسطة ريلز. والقيمة الافتراضيّة هي true إذا لم يعيّن هذا الضبط.
+
* <code>config.active_record.dump_schema_after_migration</code>: هو راية تتحكّم في ما إذا كان يجب أن يحدث تفريغ المخطّط (db/schema.rb أو db/structure.sql) عند تشغيل عمليات التهجير. ويعيّن هذه الراية إلى القيمة <code>false</code> في config/environments/production.rb المنشئ بواسطة ريلز. والقيمة الافتراضيّة هي <code>true</code> إذا لم يعيّن هذا الضبط.
 
* <code>config.active_record.dump_schemas</code>: يتحكّم في ما هي مخططات قاعدة البيانات التي ستفرّغ عند استدعاء <code>db:structure:dump</code>. الخيارات هي: <code>:schema_search_path</code> (وهو الافتراضي) والذي يفرّغ أي مخططات مدرجة في <code>schema_search_path</code>، <code>:all</code> الذي يفرّغ دائمًا جميع المخططات بغض النظر عن <code>schema_search_path</code> أو سلسلة نصيّة من المخططات المفصولة بفواصل.
 
* <code>config.active_record.dump_schemas</code>: يتحكّم في ما هي مخططات قاعدة البيانات التي ستفرّغ عند استدعاء <code>db:structure:dump</code>. الخيارات هي: <code>:schema_search_path</code> (وهو الافتراضي) والذي يفرّغ أي مخططات مدرجة في <code>schema_search_path</code>، <code>:all</code> الذي يفرّغ دائمًا جميع المخططات بغض النظر عن <code>schema_search_path</code> أو سلسلة نصيّة من المخططات المفصولة بفواصل.
 
* <code>config.active_record.belongs_to_required_by_default</code>: هي قيمة منطقيّة تتحكّم في ما إذا كان السجل يفشل في التحقق (validation) إذا لم يكن هنالك ارتباط من النوع belongs_to ([[Rails/association basics#.D8.A7.D8.B1.D8.AA.D8.A8.D8.A7.D8.B7 .D8.A7.D9.84.D8.A7.D9.86.D8.AA.D9.85.D8.A7.D8.A1 .28belongs to.29|ارتباط انتماء]]).
 
* <code>config.active_record.belongs_to_required_by_default</code>: هي قيمة منطقيّة تتحكّم في ما إذا كان السجل يفشل في التحقق (validation) إذا لم يكن هنالك ارتباط من النوع belongs_to ([[Rails/association basics#.D8.A7.D8.B1.D8.AA.D8.A8.D8.A7.D8.B7 .D8.A7.D9.84.D8.A7.D9.86.D8.AA.D9.85.D8.A7.D8.A1 .28belongs to.29|ارتباط انتماء]]).
سطر 228: سطر 227:
 
* <code>ActiveRecord::SchemaDumper.ignore_tables</code>: يقبل مصفوفة من الجداول التي لا يجب تضمينها في أي ملف مخطط تم إنشاؤه.
 
* <code>ActiveRecord::SchemaDumper.ignore_tables</code>: يقبل مصفوفة من الجداول التي لا يجب تضمينها في أي ملف مخطط تم إنشاؤه.
  
== ضبط إجراء التحكم (Action Controller) ==
+
=== ضبط إجراء التحكم (Action Controller) ===
 
يتضمّن <code>config.action_controller</code> عددًا من إعدادات الضبط هي:
 
يتضمّن <code>config.action_controller</code> عددًا من إعدادات الضبط هي:
 
* <code>config.action_controller.asset_host</code>: يعيّن المضيف للأصول، وهو مفيد عند استخدام CDN لاستضافة الأصول بدلًا من خادم التطبيق نفسه.
 
* <code>config.action_controller.asset_host</code>: يعيّن المضيف للأصول، وهو مفيد عند استخدام CDN لاستضافة الأصول بدلًا من خادم التطبيق نفسه.
سطر 242: سطر 241:
 
* <code>config.action_controller.relative_url_root</code>: يمكن استخدامه لإخبار ريلز أنك تنشر تطبيقك إلى مجلد فرعي. بشكل افتراضي يساوي <code>ENV['RAILS_RELATIVE_URL_ROOT']‎</code>.
 
* <code>config.action_controller.relative_url_root</code>: يمكن استخدامه لإخبار ريلز أنك تنشر تطبيقك إلى مجلد فرعي. بشكل افتراضي يساوي <code>ENV['RAILS_RELATIVE_URL_ROOT']‎</code>.
 
* <code>config.action_controller.permit_all_parameters</code>: يعيّن السماح لجميع المعاملات بالتعيين الشامل بشكل افتراضي. القيمة الافتراضية هي <code>false</code>.
 
* <code>config.action_controller.permit_all_parameters</code>: يعيّن السماح لجميع المعاملات بالتعيين الشامل بشكل افتراضي. القيمة الافتراضية هي <code>false</code>.
* <code>config.action_controller.action_on_unpermitted_parameters</code>: يفعّل التسجيل أو رفع استثناء إذا تم العثور على معاملات غير مسموح بها بشكل صريح. استعمل <code>:log</code> أو <code>:raise</code> لكل حالة على التوالي. القيمة الافتراضيّة هي <code>:log</code> في أوضاع التطوير والاختبار، و <code>false</code> في جميع الأوضاع الأخرى.
+
* <code>config.action_controller.action_on_unpermitted_parameters</code>: يفعّل التسجيل أو رفع استثناء إذا تم العثور على معاملات غير مسموح بها بشكل صريح. استعمل <code>:log</code> أو <code>:raise</code> لكل حالة على التوالي. القيمة الافتراضيّة هي <code>:log</code> في أوضاع التطوير والاختبار، و <code>false</code> في جميع الأوضاع الأخرى.
 
* <code>config.action_controller.always_permitted_parameters</code>: تعيّن قائمة بالمعاملات المسموح بها بشكل افتراضي. القيم الافتراضيّة هي <code>['controller', 'action']</code>
 
* <code>config.action_controller.always_permitted_parameters</code>: تعيّن قائمة بالمعاملات المسموح بها بشكل افتراضي. القيم الافتراضيّة هي <code>['controller', 'action']</code>
 
* <code>config.action_controller.enable_fragment_cache_logging</code>: يحدد ما إذا كان سيتم تسجيل أجزاء القراءة والكتابة لذاكرة التخزين المؤقت بشكل مفصل كالتالي:
 
* <code>config.action_controller.enable_fragment_cache_logging</code>: يحدد ما إذا كان سيتم تسجيل أجزاء القراءة والكتابة لذاكرة التخزين المؤقت بشكل مفصل كالتالي:
سطر 257: سطر 256:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== ضبط إجراء الإرسال (Action Dispatch) ==
+
=== ضبط إجراء الإرسال (Action Dispatch) ===
 
* <code>config.action_dispatch.session_store</code>: يعيّن اسم المخزن المراد تخزين بيانات الجلسة فيه. وهو بشكل افتراضي <code>:cookie_store</code> وتتضمن الخيارات الصالحة الأخرى <code>:active_record_store</code> أو <code>:mem_cache_store</code> أو اسم الصنف المخصص الخاص بك.
 
* <code>config.action_dispatch.session_store</code>: يعيّن اسم المخزن المراد تخزين بيانات الجلسة فيه. وهو بشكل افتراضي <code>:cookie_store</code> وتتضمن الخيارات الصالحة الأخرى <code>:active_record_store</code> أو <code>:mem_cache_store</code> أو اسم الصنف المخصص الخاص بك.
 
* <code>config.action_dispatch.default_headers</code>: هو [[Ruby/Hash|جدول Hash]] مع ترويسات HTTP التي تم تعيينها بشكل افتراضي في كل استجابة. بشكل افتراضي، معرّفة على أنها:
 
* <code>config.action_dispatch.default_headers</code>: هو [[Ruby/Hash|جدول Hash]] مع ترويسات HTTP التي تم تعيينها بشكل افتراضي في كل استجابة. بشكل افتراضي، معرّفة على أنها:
سطر 284: سطر 283:
 
* <code>config.action_dispatch.use_authenticated_cookie_encryption</code>: يتحكّم ما إذا كانت ملفات تعريف الارتباط المشفّرة والموقعة تستخدم التشفير AES-256-GCM أو التشفير AES-256-CBC القديم. وهو <code>true</code> بشكل افتراضي.
 
* <code>config.action_dispatch.use_authenticated_cookie_encryption</code>: يتحكّم ما إذا كانت ملفات تعريف الارتباط المشفّرة والموقعة تستخدم التشفير AES-256-GCM أو التشفير AES-256-CBC القديم. وهو <code>true</code> بشكل افتراضي.
 
* <code>config.action_dispatch.perform_deep_munge</code>: يضبط ما إذا كان يجب تنفيذ التابع <code>deep_munge</code> على المعاملات. انظر دليل [[Rails/security|الأمن]] لمزيد من المعلومات. القيمة الافتراضية لهذا الضبط هي <code>true</code>.
 
* <code>config.action_dispatch.perform_deep_munge</code>: يضبط ما إذا كان يجب تنفيذ التابع <code>deep_munge</code> على المعاملات. انظر دليل [[Rails/security|الأمن]] لمزيد من المعلومات. القيمة الافتراضية لهذا الضبط هي <code>true</code>.
* <code>config.action_dispatch.rescue_responses</code>: يضبط الاستثناءات التي عيّنت لحالة HTTP، وهي تقبل جدول hash ويمكنك تحديد أزواج من استثناء/حالة. وهو بشكل افتراضي معرّف على أنه:
+
* <code>config.action_dispatch.rescue_responses</code>: يضبط الاستثناءات التي عيّنت لحالة HTTP، وهي تقبل [[Ruby/Hash|جدول hash]] ويمكنك تحديد أزواج من استثناء/حالة. وهو بشكل افتراضي معرّف على أنه:
 
<syntaxhighlight lang="rails">
 
<syntaxhighlight lang="rails">
 
config.action_dispatch.rescue_responses = {
 
config.action_dispatch.rescue_responses = {
سطر 309: سطر 308:
 
* <code>ActionDispatch::Callbacks.after</code>: تأخذ كتلة من التعليمات البرمجيّة لتشغيلها بعد الطلب.
 
* <code>ActionDispatch::Callbacks.after</code>: تأخذ كتلة من التعليمات البرمجيّة لتشغيلها بعد الطلب.
  
== ضبط إجراء العرض ==
+
=== ضبط إجراء العرض ===
 
يتضمن <code>config.action_view</code> مجموعة صغيرة من إعدادات الضبط:
 
يتضمن <code>config.action_view</code> مجموعة صغيرة من إعدادات الضبط:
 
* <code>config.action_view.cache_template_loading</code>: يتحكّم في ما إذا كان يجب إعادة تحميل القوالب في كل طلب أو لا. القيمة الافتراضية لهذا الضبط هي نفس القيمة التي ضُبَط في <code>config.cache_classes</code>.
 
* <code>config.action_view.cache_template_loading</code>: يتحكّم في ما إذا كان يجب إعادة تحميل القوالب في كل طلب أو لا. القيمة الافتراضية لهذا الضبط هي نفس القيمة التي ضُبَط في <code>config.cache_classes</code>.
  
* <code>config.action_view.field_error_proc</code>: يوفّر مولّد HTML لعرض الأخطاء التي تأتي من نموذج فعال (Active Model)، وهو بشكل افتراضي:
+
* <code>config.action_view.field_error_proc</code>: يوفّر مولّد HTML لعرض الأخطاء التي تأتي من [[Rails/active model basics|نموذج فعال]] (Active Model)، وهو بشكل افتراضي:
 
<syntaxhighlight lang="rails">
 
<syntaxhighlight lang="rails">
 
Proc.new do |html_tag, instance|
 
Proc.new do |html_tag, instance|
سطر 329: سطر 328:
 
* <code>config.action_view.raise_on_missing_translations</code>: يحدد ما إذا كان يجب رفع خطأ للتحويلات المفقودة.
 
* <code>config.action_view.raise_on_missing_translations</code>: يحدد ما إذا كان يجب رفع خطأ للتحويلات المفقودة.
 
* <code>config.action_view.automatically_disable_submit_tag</code>: يحدد ما إذا كان يجب تعطيل <code>submit_tag</code> (وسم الإرسال) عند النقر. وهو بشكل افتراضي <code>true</code>.
 
* <code>config.action_view.automatically_disable_submit_tag</code>: يحدد ما إذا كان يجب تعطيل <code>submit_tag</code> (وسم الإرسال) عند النقر. وهو بشكل افتراضي <code>true</code>.
* <code>config.action_view.debug_missing_translation</code>: يحدد ما إذا كان سيغلف مفتاح التحويلات المفقودة في الوسم <code>[[HTML/span|<nowiki><span></nowiki>]]</code> أو لا، وهو <code>true</code> بشكل افتراضي.
+
* <code>config.action_view.debug_missing_translation</code>: يحدد ما إذا كان سيغلف مفتاح التحويلات المفقودة في الوسم <code>[[HTML/span|<nowiki><span></nowiki>]]</code> أو لا. وهو <code>true</code> بشكل افتراضي.
 
* <code>config.action_view.form_with_generates_remote_forms</code>: يحدد ما إذا كان <code>form_with</code> يولّد نماذج عن بعد أم لا، وهو <code>true</code> بشكل افتراضي.
 
* <code>config.action_view.form_with_generates_remote_forms</code>: يحدد ما إذا كان <code>form_with</code> يولّد نماذج عن بعد أم لا، وهو <code>true</code> بشكل افتراضي.
 
* <code>config.action_view.form_with_generates_ids</code>: يحدد ما إذا كان <code>form_with</code> يولد معرفات على المدخلات، وهو <code>true</code> بشكل افتراضي.
 
* <code>config.action_view.form_with_generates_ids</code>: يحدد ما إذا كان <code>form_with</code> يولد معرفات على المدخلات، وهو <code>true</code> بشكل افتراضي.
  
== ضبط [[Rails/action mailer basics|إجراء المراسلة]] ==
+
=== ضبط [[Rails/action mailer basics|إجراء المراسلة]] ===
 
هنالك عدد من الإعدادات المتاحة في الضبط <code>config.action_mailer</code>:
 
هنالك عدد من الإعدادات المتاحة في الضبط <code>config.action_mailer</code>:
 
* <code>config.action_mailer.logger</code>: يقبل مسجلًا مطابقًا للواجهة <code>Log4r</code> أو صنف روبي <code>Logger</code> الافتراضي، والذي يُستخدم بعد ذلك لتسجيل المعلومات من [[Rails/action mailer basics|إجراء المراسلة]]. اضبطه إلى القيمة <code>nil</code> لتعطيل التسجيل.
 
* <code>config.action_mailer.logger</code>: يقبل مسجلًا مطابقًا للواجهة <code>Log4r</code> أو صنف روبي <code>Logger</code> الافتراضي، والذي يُستخدم بعد ذلك لتسجيل المعلومات من [[Rails/action mailer basics|إجراء المراسلة]]. اضبطه إلى القيمة <code>nil</code> لتعطيل التسجيل.
سطر 385: سطر 384:
 
* <code>config.action_mailer.perform_caching</code>: يحدد ما إذا كان يجب أن تقوم قوالب الإرسال بإجراء تخزين مؤقت للأجزاء أو لا. وهو <code>false</code> بشكل افتراضي في جميع البيئات.
 
* <code>config.action_mailer.perform_caching</code>: يحدد ما إذا كان يجب أن تقوم قوالب الإرسال بإجراء تخزين مؤقت للأجزاء أو لا. وهو <code>false</code> بشكل افتراضي في جميع البيئات.
  
== ضبط [[Rails/active support core extensions|الدعم الفعال]] ==
+
=== ضبط [[Rails/active support core extensions|الدعم الفعال]] ===
 
هنالك عدة خيارات ضبط متاحة في [[Rails/active support core extensions|الدعم الفعال]]:
 
هنالك عدة خيارات ضبط متاحة في [[Rails/active support core extensions|الدعم الفعال]]:
 
* <code>config.active_support.bare</code>: يفعّل أو يعطّل تحميل <code>active_support/all</code> عند تشغيل ريلز. وهو <code>nil</code> بشكل افتراضي، مما يعني أن <code>active_support/all</code> ستكون مُحمَّلَة.
 
* <code>config.active_support.bare</code>: يفعّل أو يعطّل تحميل <code>active_support/all</code> عند تشغيل ريلز. وهو <code>nil</code> بشكل افتراضي، مما يعني أن <code>active_support/all</code> ستكون مُحمَّلَة.
 
* <code>config.active_support.test_order</code>: يعيّن الترتيب الذي من خلاله تنفّذ حالات الاختبار. القيم المحتملة هي <code>:random</code> و ‎<code>:sorted</code>. قيمته الافتراضية هي <code>:random</code>.
 
* <code>config.active_support.test_order</code>: يعيّن الترتيب الذي من خلاله تنفّذ حالات الاختبار. القيم المحتملة هي <code>:random</code> و ‎<code>:sorted</code>. قيمته الافتراضية هي <code>:random</code>.
* <code>config.active_support.escape_html_entities_in_json</code>: يفعّل أو يعطّل تهريب كيانات HTML في سَلسَلة JSON، وهو <code>true</code> بشكل افتراضي.
+
* <code>config.active_support.escape_html_entities_in_json</code>: يفعّل أو يعطّل تهريب كيانات HTML في سَلسَلة JSON. وهو <code>true</code> بشكل افتراضي.
* <code>config.active_support.use_standard_json_time_format</code>: يفعّل أو يعطّل سلسلة التواريخ إلى تنسيق ISO 8601، وهو <code>true</code> افتراضيًا.
+
* <code>config.active_support.use_standard_json_time_format</code>: يفعّل أو يعطّل سلسلة التواريخ إلى تنسيق ISO 8601. وهو <code>true</code> افتراضيًا.
 
* <code>config.active_support.time_precision</code>: يعيّن دقة قيمة الوقت التي تم ترميزها. وهو 3 افتراضيًا.
 
* <code>config.active_support.time_precision</code>: يعيّن دقة قيمة الوقت التي تم ترميزها. وهو 3 افتراضيًا.
 
* <code>config.active_support.use_sha1_digests</code>: يحدد ما إذا كنت ستستخدم الخوارزمية SHA-1 بدلًا من MD5 لتوليد القيم المختصرة المشفرة غير الحساسة، مثل الترويسة ETag. القيمة الافتراضية هي <code>false</code>.
 
* <code>config.active_support.use_sha1_digests</code>: يحدد ما إذا كنت ستستخدم الخوارزمية SHA-1 بدلًا من MD5 لتوليد القيم المختصرة المشفرة غير الحساسة، مثل الترويسة ETag. القيمة الافتراضية هي <code>false</code>.
سطر 400: سطر 399:
 
* <code>ActiveSupport::Deprecation.silenced</code>: يعيّن ما إذا كان ستعرض تحذيرات الإهمال أو لا.
 
* <code>ActiveSupport::Deprecation.silenced</code>: يعيّن ما إذا كان ستعرض تحذيرات الإهمال أو لا.
  
== ضبط الوظيفة الفعالة ==
+
=== ضبط [[Rails/active job basics|الوظيفة الفعالة]] ===
 
يوفّر <code>config.active_job</code> خيارات الضبط التاليّة:
 
يوفّر <code>config.active_job</code> خيارات الضبط التاليّة:
 
* <code>config.active_job.queue_adapter</code>: يعيّن المحوّل لواجهة الطابور الخلفية (queueing backend). إن المحوّل الافتراضي هو <code>:async</code>. للحصول على قائمة محدّثة من المحولات المضمنة، راجع وثائق واجهة برمجة التطبيقات لـ <code>[http://api.rubyonrails.org/v5.2.2/classes/ActiveJob/QueueAdapters.html ActiveJob::QueueAdapters]</code>.
 
* <code>config.active_job.queue_adapter</code>: يعيّن المحوّل لواجهة الطابور الخلفية (queueing backend). إن المحوّل الافتراضي هو <code>:async</code>. للحصول على قائمة محدّثة من المحولات المضمنة، راجع وثائق واجهة برمجة التطبيقات لـ <code>[http://api.rubyonrails.org/v5.2.2/classes/ActiveJob/QueueAdapters.html ActiveJob::QueueAdapters]</code>.
سطر 435: سطر 434:
 
* <code>config.active_job.logger</code>: يقبل مسجلًا مطابقًا للواجهة <code>Log4r</code> أو صنف روبي <code>Logger</code> الافتراضي، والذي سيُستخدم بعد ذلك لتسجيل المعلومات من الوظيفة الفعالة. يمكنك استرداد هذا السجل عن طريق استدعاء <code>logger</code> على أي صنف وظيفة فعالة أو نسخة من الوظيفة الفعالة. اضبطه إلى القيمة <code>nil</code> لتعطيل التسجيل.
 
* <code>config.active_job.logger</code>: يقبل مسجلًا مطابقًا للواجهة <code>Log4r</code> أو صنف روبي <code>Logger</code> الافتراضي، والذي سيُستخدم بعد ذلك لتسجيل المعلومات من الوظيفة الفعالة. يمكنك استرداد هذا السجل عن طريق استدعاء <code>logger</code> على أي صنف وظيفة فعالة أو نسخة من الوظيفة الفعالة. اضبطه إلى القيمة <code>nil</code> لتعطيل التسجيل.
  
== ضبط [[Rails/action cable overview|إجراء الربط]] ==
+
=== ضبط [[Rails/action cable overview|إجراء الربط]] ===
 
* <code>config.action_cable.url</code>: يقبل سلسلة نصيّة للعنوان URL الخاص بالمكان الذي تستضيف فيه خادم [[Rails/action cable overview|إجراء الربط]]. يمكنك استخدام هذا الخيار إذا كنت تشغّل خوادم إجراء الربط المنفصلة عن التطبيق الرئيسي.
 
* <code>config.action_cable.url</code>: يقبل سلسلة نصيّة للعنوان URL الخاص بالمكان الذي تستضيف فيه خادم [[Rails/action cable overview|إجراء الربط]]. يمكنك استخدام هذا الخيار إذا كنت تشغّل خوادم إجراء الربط المنفصلة عن التطبيق الرئيسي.
 
* <code>config.action_cable.mount_path</code>: يقبل سلسلة نصيّة لمكان وصل [[Rails/action cable overview|إجراء الربط]]، كجزء من عملية الخادم الرئيسيّة. وهو يساوي بشكل افتراضي ‎/cable ويمكنك تعيينه إلى القيمة <code>nil</code> حتى لا يوصل (mount) [[Rails/action cable overview|إجراء الربط]] كجزء من خادم ريلز العادي.
 
* <code>config.action_cable.mount_path</code>: يقبل سلسلة نصيّة لمكان وصل [[Rails/action cable overview|إجراء الربط]]، كجزء من عملية الخادم الرئيسيّة. وهو يساوي بشكل افتراضي ‎/cable ويمكنك تعيينه إلى القيمة <code>nil</code> حتى لا يوصل (mount) [[Rails/action cable overview|إجراء الربط]] كجزء من خادم ريلز العادي.
  
== ضبط [[Rails/active storage overview|التخزين الفعال]] ==
+
=== ضبط [[Rails/active storage overview|التخزين الفعال]] ===
 
يوفّر <code>config.active_storage</code> خيارات الضبط التالية:
 
يوفّر <code>config.active_storage</code> خيارات الضبط التالية:
 
* <code>config.active_storage.analyzers</code>: يقبل مصفوفة من الأصناف التي تشير إلى المحللات (analyzers) المتاحة من أجل كائنات البيانات الثنائية للتخزين الفعال (Active Storage blobs). يساوي افتراضيًّا إلى <code>[ActiveStorage::Analyzer::ImageAnalyzer, ActiveStorage::Analyzer::VideoAnalyzer]</code>. هذا الأول يمكنه استخراج عرض وارتفاع لكائن بيانات ثنائية لفيديو (image blob)، ويمكن للأخير استخلاص العرض والارتفاع والمدة والزاوية ونسبة العرض إلى الإرتفاع لكائن بيانات ثنائية لفيديو (video blob).
 
* <code>config.active_storage.analyzers</code>: يقبل مصفوفة من الأصناف التي تشير إلى المحللات (analyzers) المتاحة من أجل كائنات البيانات الثنائية للتخزين الفعال (Active Storage blobs). يساوي افتراضيًّا إلى <code>[ActiveStorage::Analyzer::ImageAnalyzer, ActiveStorage::Analyzer::VideoAnalyzer]</code>. هذا الأول يمكنه استخراج عرض وارتفاع لكائن بيانات ثنائية لفيديو (image blob)، ويمكن للأخير استخلاص العرض والارتفاع والمدة والزاوية ونسبة العرض إلى الإرتفاع لكائن بيانات ثنائية لفيديو (video blob).
سطر 469: سطر 468:
 
   database: blog_development
 
   database: blog_development
 
   pool: 5
 
   pool: 5
</syntaxhighlight>سيتصل هذا بقاعدة بيانات تدعى blog_development باستخدام المحوّل <code>postgresql</code>، ويمكن تخزين هذه المعلومات نفسها في عنوان URL وتوفيرها عبر متغير البيئة كالتالي:<syntaxhighlight lang="shell">
+
</syntaxhighlight>سيتصل هذا بقاعدة بيانات تدعى <code>blog_development</code> باستخدام المحوّل <code>postgresql</code>، ويمكن تخزين هذه المعلومات نفسها في عنوان URL وتوفيرها عبر متغير البيئة كالتالي:<syntaxhighlight lang="shell">
 
> puts ENV['DATABASE_URL']
 
> puts ENV['DATABASE_URL']
 
postgresql://localhost/blog_development?pool=5
 
postgresql://localhost/blog_development?pool=5
سطر 561: سطر 560:
 
</syntaxhighlight>'''ملاحظة''': يستخدم ريلز قواعد بيانات SQLite3 لتخزين البيانات بشكل افتراضي لأن قاعدة البيانات لا تحتاج إلى ضبط. ويدعم ريلز MySQL (بما في ذلك MariaDB) أيضًا و PostgreSQL "خارج الصندوق" ولديه ملحقات للعديد من أنظمة قواعد البيانات. وإذا كنت تستخدم قاعدة البيانات في بيئة الإنتاج، فغالبا ما يملك ريلز محوّلًا لها.
 
</syntaxhighlight>'''ملاحظة''': يستخدم ريلز قواعد بيانات SQLite3 لتخزين البيانات بشكل افتراضي لأن قاعدة البيانات لا تحتاج إلى ضبط. ويدعم ريلز MySQL (بما في ذلك MariaDB) أيضًا و PostgreSQL "خارج الصندوق" ولديه ملحقات للعديد من أنظمة قواعد البيانات. وإذا كنت تستخدم قاعدة البيانات في بيئة الإنتاج، فغالبا ما يملك ريلز محوّلًا لها.
  
=== ضبط قاعدة بيانات MySQL أو MariaDB ===
+
==== ضبط قاعدة بيانات MySQL أو MariaDB ====
 
إذا اخترّت استخدام MySQL أو MariaDB بدلًا من SQLite3،  فسيبدو الملف config/database.yml مختلفًا قليلًا. إليك كيف سيبدو:<syntaxhighlight lang="text">
 
إذا اخترّت استخدام MySQL أو MariaDB بدلًا من SQLite3،  فسيبدو الملف config/database.yml مختلفًا قليلًا. إليك كيف سيبدو:<syntaxhighlight lang="text">
 
development:
 
development:
سطر 584: سطر 583:
 
   adapter: postgresql
 
   adapter: postgresql
 
   prepared_statements: false
 
   prepared_statements: false
</syntaxhighlight>إذا كان مفعّلًا، سيُنشئ السجل الفعال ما يصل إلى 1000 تعبير مهيَّأ (<code>prepared_statements</code>) لكل اتصال قاعدة البيانات بشكل افتراضي. ولتعديل هذا السلوك، يمكنك تعيين <code>statement_limit</code> إلى قيمة مختلفة مثل:<syntaxhighlight lang="text">
+
</syntaxhighlight>إذا كان مفعّلًا، سيُنشئ السجل الفعال ما يصل إلى 1000 تعبير مهيَّئ (<code>prepared_statements</code>) لكل اتصال قاعدة البيانات بشكل افتراضي. ولتعديل هذا السلوك، يمكنك تعيين <code>statement_limit</code> إلى قيمة مختلفة مثل:<syntaxhighlight lang="text">
 
production:
 
production:
 
   adapter: postgresql
 
   adapter: postgresql
سطر 674: سطر 673:
 
يمكن أيضًا ضبط بعض أجزاء ريلز خارجيًا من خلال توفير متغيرات البيئة، ويتعرّف على المتغيرات البيئة التالية من خلال أجزاء مختلفة من ريلز:
 
يمكن أيضًا ضبط بعض أجزاء ريلز خارجيًا من خلال توفير متغيرات البيئة، ويتعرّف على المتغيرات البيئة التالية من خلال أجزاء مختلفة من ريلز:
 
* <code>ENV["RAILS_ENV"]‎</code>: تعرّف بيئة ريلز (التطوير، أو الإنتاج، أو الاختبار ...إلخ.) والتي سيعمل ريلز فيها.
 
* <code>ENV["RAILS_ENV"]‎</code>: تعرّف بيئة ريلز (التطوير، أو الإنتاج، أو الاختبار ...إلخ.) والتي سيعمل ريلز فيها.
* <code>ENV["RAILS_RELATIVE_URL_ROOT"]‎</code>: يستخدم بواسطة رمز التوجيه للتعرّف على عناوين URL عند نشر تطبيقك إلى مجلّد فرعي.
+
* <code>ENV["RAILS_RELATIVE_URL_ROOT"]‎</code>: يستخدم بواسطة رمز التوجيه للتعرّف على عناوين URL عند [https://guides.rubyonrails.org/configuring.html#deploy-to-a-subdirectory-relative-url-root نشر تطبيقك إلى مجلّد فرعي].
 
* <code>ENV["RAILS_CACHE_ID"]‎</code> و <code>ENV["RAILS_APP_VERSION"]‎</code>: يُستخدمان لإنشاء مفاتيح ذاكرة تخزين مؤقت موسّعة في شيفرة التخزين المؤقت لريلز، ويسمح هذا لك بأن يكون لديك عدة مخازن منفصلة من نفس التطبيق.
 
* <code>ENV["RAILS_CACHE_ID"]‎</code> و <code>ENV["RAILS_APP_VERSION"]‎</code>: يُستخدمان لإنشاء مفاتيح ذاكرة تخزين مؤقت موسّعة في شيفرة التخزين المؤقت لريلز، ويسمح هذا لك بأن يكون لديك عدة مخازن منفصلة من نفس التطبيق.
  
سطر 685: سطر 684:
  
 
== أحداث التهيئة ==
 
== أحداث التهيئة ==
يحتوي ريلز على خمسة أحداث تهيئة يمكن ربطها (مدرجة بترتيب التشغيل):
+
يحتوي ريلز على خمسة أحداث تهيئة يمكن ربطها (مدرجة بالترتيب الذي تعمل به):
* Before_configuration: يشتغل هذا بمجرّد أن يرث ثابت التطبيق من Rails::Application، وتقيّم استدعاءات config قبل حدوث ذلك.
+
* <code>before_configuration</code>: يُنفَّذ هذا بمجرّد أن يرث ثابت التطبيق من <code>Rails::Application</code>، وتقيّم استدعاءات <code>config</code> قبل حدوث ذلك.
* Before_initialize: يشتغل هذا مباشرةً قبل حدوث عملية التهيئة الخاصة بالتطبيق باستخدام :bootstrap_hook initializer بالقرب من بداية عملية تهيئة Rails.
+
* <code>before_initialize</code>: يُنفَّذ هذا مباشرةً قبل حدوث عملية التهيئة الخاصة بالتطبيق باستخدام <code>:bootstrap_hook initializer</code> بالقرب من بداية عملية تهيئة ريلز.
* To_prepare: يشتغل بعد تشغيل initializer لجميع Railties (بما في ذلك التطبيق نفسه)، لكن قبل eager loading وبناء كومة الوسيط. الأهم من ذلك، سيعمل على كل طلب في التطوير، لكن مرة واحدة (أثناء التشغيل) في الإنتاج والاختبار.
+
* <code>to_prepare</code>: يُنفَّذ بعد تشغيل المهيئ لجميع Railties (بما في ذلك التطبيق نفسه)، لكن قبل التحميل الحثيث (eager loading) وبناء كومة البرمجيات الوسيطة (middleware stack). الأهم من ذلك، سيُنفَّذ على كل طلب في التطوير، لكن مرة واحدة (أثناء التشغيل) في الإنتاج والاختبار.
* Before_eager_load: يشتغل هذا مباشرةً قبل حدوث eager loading، والذي هو السلوك الافتراضي لبيئة الإنتاج وليس لبيئة التطوير.
+
* <code>before_eager_load</code>: يُنفَّذ هذا مباشرةً قبل حدوث التحميل الحثيث (eager loading)، والذي هو السلوك الافتراضي لبيئة الإنتاج وليس لبيئة التطوير.
* After_initialize: يشتغل مباشرةً بعد تهيئة التطبيق، وبعد تشغيل مهئيات التطبيق في config/initializers.
+
* <code>after_initialize</code>: يُنفَّذ مباشرةً بعد تهيئة التطبيق، وبعد تشغيل مهئيات التطبيق في config/initializers.
لتعريف حد لهذه hooks، استخدم صياغة الكتلة داخل الصنف الفرعي Rails::Application أو Rails::Railtie أو Rails::Engine:
+
لتعريف حدث لهذه الخطافات، استخدم صياغة الكتلة داخل الصنف الفرعي <code>Rails::Application</code> أو <code>Rails::Railtie</code> أو <code>Rails::Engine</code>:<syntaxhighlight lang="rails">
 
 
 
module YourApp
 
module YourApp
 
+
  class Application < Rails::Application
 class Application < Rails::Application
+
    config.before_initialize do
 
+
      # تجري عملية تهيئة الشيفرة هنا
config.before_initialize do
+
    end
 
+
  end
  # initialization code goes here
 
 
 
 
end
 
end
 
+
</syntaxhighlight>بدلًا من ذلك، يمكنك إجراء ذلك من خلال التابع <code>config</code> في الكائن <code>Rails.application</code>:<syntaxhighlight lang="rails">
 end
 
 
 
End
 
 
 
بدلًا من ذلك، يمكنك إجراء ذلك من خلال تابع config في كائن Rails.application:
 
 
 
 
Rails.application.config.before_initialize do
 
Rails.application.config.before_initialize do
 +
  # تجري عملية تهيئة الشيفرة هنا
 +
end
 +
</syntaxhighlight>'''تحذير''': لا يجري إعداد بعض أجزاء تطبيقك، ولا سيما التوجيه، في النقطة التي تُستدعَى فيها الكتلة <code>after_initialize</code>.
  
 # initialization code goes here
+
=== <code>Rails::Railtie.initializer</code> ===
 
+
يحتوي ريلز على العديد من المهيئات (initializers) التي تعمل عند بدء التشغيل والتي تم تعريفها كافة باستخدام التابع <code>initializer</code> من <code>Rails::Railtie</code>. وهذا مثال على المهيئ <code>set_helpers_path</code> من وحدة التحكم:<syntaxhighlight lang="rails">
End
 
 
 
تحذير: لم تعدّ بعد بعض أجزاء التطبيق، ولا سيما التوجيه، في النقطة التي تُستدعى فيها كتلة after_initialize.
 
 
 
== Rails::Railtie#initializer ==
 
يحتوي Rails على العديد من initializers التي تعمل عند بدء التشغيل والتي تم تعريفها كافة باستخدام التابع initializer من Rails::Railtie. وهذا مثال على مهيئ set_helpers_path من Action Controller:
 
 
 
 
initializer "action_controller.set_helpers_path" do |app|
 
initializer "action_controller.set_helpers_path" do |app|
 +
  ActionController::Helpers.helpers_path = app.helpers_paths
 +
end
 +
</syntaxhighlight>يأخذ التابع <code>initializer</code> ثلاثة معاملات؛ الأول هو اسم المهيئ والثاني هو [[Ruby/Hash|جدول hash]] اختياري (غير معروض هنا) والثالث هو كتلة. يمكن تحديد المفتاح <code>:before</code> في جدول الخيارات hash لتحديد المهيئ الجديد الذي يجب تشغيله أولًا، والمفتاح <code>:after</code> لتحديد المهيئ المراد تشغيله فيما بعد.
  
 ActionController::Helpers.helpers_path = app.helpers_paths
+
ستشتغل المهيئات المعرّفة باستخدام التابع <code>initializer</code> بالترتيب الذي تم تعريفها فيه، باستثناء تلك التي تستخدم التابعين <code>:before</code> و ‎<code>:after</code>.
 
 
End
 
  
يأخذ التابع initializer ثلاثة معاملات حيث أن الأول هو اسم المهيئ والثاني هو hash اختياري (غير معروض هنا) والثالث هو كتلة، يمكن تحديد مفتاح :before في hash الخيارات لتحديد المهيئ الجديد الذي يجب تشغيله أولًا، ومفتاح :after سيحدد المهيئ لتشغيل هذا المهيئ فيما بعد.
+
'''تحذير''': يمكنك وضع المهيئ الخاص بك قبل أو بعد أي مهيئ آخر في السلسلة، طالما أنه منطقي. لنفترض أن لديك 4 مهيئات تسمى من "one" إلى "four" (معرّفة بهذا الترتيب) ولقد عرّفت "four" ليعمل قبل "four" -المعرف مسبقًا - ولكن بعد "three" وهذا ليس منطقيًا؛ لن يتمكن ريلز آنذاك من تحديد ترتيب المهيئ الخاص بك.
  
ستشتغل المهيئات المعرّفة باستخدام تابع initializer بالترتيب الذي تم تعريفها فيه، باستثناء تلك التي تستخدم توابع :before و:after.
+
يعتبر معامل الكتلة للتابع <code>initializer</code> هو نسخة من التطبيق نفسه، ولذا يمكننا الوصول إلى ضبطه باستخدام التابع <code>config</code> كما في المثال.
  
تحذير: يمكنك وضع المهيئ الخاص بك قبل أو بعد أي مهيئ آخر في السلسلة، طالما أنه منطقي، لنفترض أن لديك 4 مهيئات تسمى من "one" إلى "four" (معرّفة بهذا الترتيب) ولقد عرّفت "four" لتعمل قبل "four" لكن بعد "three" وهذا ليس منطقيًا ولن يتمكن Rails من تحديد ترتيب المهيئ الخاص بك.
+
بما أن <code>Rails::Application</code> يرث من <code>Rails::Railtie</code> (بشكل غير مباشر)، يمكنك استخدام التابع <code>initializer</code> في config/application.rb لتعريف المهيئات للتطبيق.
  
يعتبر معامل الكتلة لتابع initializer هو مثيل من التطبيق نفسه، ولذا يمكنن الوصول إلى ضبطه باستخدام تابع config كما في المثال.
+
=== المهيئات ===
 
+
فيما يلي قائمة شاملة لجميع المهيئات الموجودة في ريلز بالترتيب الذي تم تعريفها فيه (وبالتالي تشغيلها ما لم يُنص على خلاف ذلك).
بما أن Rails::Application يرث من Rails::Railtie (بشكل غير مباشر)، يمكنك استخدام تابع initializer فيconfig/application.rb لتعريف المهيئات للتطبيق.
+
* <code>load_environment_hook</code>: يعمل كعنصر نائب (placeholder) بحيث يمكن تعريف <code>:load_environment_config</code> ليعمل قبله.
 
+
* <code>load_active_support</code>: يتطلّب active_support/dependencies الذي يعد الأساس للسجل الفعال، وهو يتطلّب اختياريًا active_support/all إذا كان <code>config.active_support.bare</code> غير صحيح (un-truthful) وهو الإعداد الافتراضي.
== المهيئات ==
+
* <code>initialize_logger</code>: يهيئ المسجّل (الكائن <code>ActiveSupport::Logger</code>) للتطبيق ويجعل من الممكن الوصول إليه في <code>Rails.logger</code>، بشرط أن لا يوجود مهيئ مدرج قبل هذه النقطة التي عرّف فيها <code>Rails.logger</code>.
فيما يلي قائمة شاملة لجميع المهيئات الموجودة في Rails بالترتيب الذي تم تعريفهم (وبالتالي تشغيلها ما لم يُنص على خلاف ذلك).
+
* <code>initialize_cache</code>: إذا لم يعيَّن <code>Rails.cache</code> بعد، فهيئ ذاكرة التخزين المؤقت بالرجوع إلى القيمة الموجودة في <code>config.cache_store</code> وخزّن النتائج على أنها <code>Rails.cache</code>. إذا كان الكائن يستجيب للتابع <code>middleware</code>، إذ يُدرج الوسيط الخاص به قبل <code>Rack::Runtime</code> في كومة الوسيط (middleware stack).
* Load_environment_hook: يعمل كماسك للمكان (placeholder) بحيث يمكن تعريف :load_environment_config ليشتغل قبله.
+
* <code>set_clear_dependencies_hook</code>: هذا المهيئ - الذي يعمل فقط في حالة كان <code>cache_classes</code> يساوي <code>false</code> - يستخدم <code>ActionDispatch::Callbacks.after</code> لإزالة الثوابت المشار إليها أثناء الطلب من مساحة الكائن بحيث يعاد تحميلها أثناء الطلب التالي.
* Load_active_support: يتطلّب active_support/dependencies الذي يعد الأساس لـ Active Support، وهو يتطلّب اخياريًا active_support/all إذا كان config.active_support.bare غير صادق (un-truthful) وهو الإعداد الافتراضي.
+
* <code>initialize_dependency_mechanism</code>: إذا كان <code>config.cache_classes</code> يساوي <code>true</code>، اضبط <code>ActiveSupport::Dependencies.mechanism</code> ليطلب التبعيات عبر <code>require</code> بدلًا من تحميلها.
* Initialize_logger: يهيئ المسجّل (كائن ActiveSupport::Logger) للتطبيق ويجعله يمكن الوصول إليه في Rails.logger، بشرط أن لا يوجود مهيئ مدرج قبل هذه النقطة عرّف Rails.logger.
+
* <code>bootstrap_hook</code>: يُنفِّذ جميع كتل <code>before_initialize</code> المهيئة.
* Initialize_cache: إذا لم يعّد Rails.cache بعد فهيئ ذاكرة التخزين المؤقت بالرجوع إلى القيمة الموجودة في config.cache_store وخزّن النتائج كـ Rails.cache، إذا كان الكائن يستجيب لتابع الوسيط، يُدرج الوسيط الخاص به قبل Rack::Runtime في كومة الوسيط.
+
* <code>i18n.callbacks</code>: في بيئة التطوير، عيّن رد النداء <code>to_prepare</code> الذي سيستدعي <code>I18n.reload!‎</code> إذا تغيّرت أي من المحليات منذ آخر طلب. وفي وضع الإنتاج، سيشتغل هذا الاستدعاء فقط عند الطلب الأول.
* Set_clear_dependencies_hook: هذا المهيئ - الذي يعمل فقط في حالة كان cache_classes يساوي false - يستخدم ActionDispatch::Callbacks.after لإزالة الثوابت المشار إليها أثناء الطلب من مساحة الكائن بحيث يعاد تحميلها أثناء الطلب التالي.
+
* <code>active_support.deprecation_behavior</code>: يهيئ تقارير الإهمال للبيئات، وهو بشكل افتراضي <code>:log</code> للتطوير و ‎<code>:notify</code> للإنتاج و <code>:stderr</code> للإختبار. وإذا لم تعيّن قيمة للضبط <code>config.active_support.deprecation</code>، فسيطالب هذا المهيئ المستخدم بضبط هذا السطر في الملف config/environments الخاص بالبيئة الحالية. يمكن ضبطه إلى مصفوفة من القيم.
* Initialize_dependency_mechanism: إذا كان config.cache_classes يساوي true، يكوّن ActiveSupport::Dependencies.mechanism لتطلب التبعيات بدلًا من تحميلها.
+
* <code>active_support.initialize_time_zone</code>: يعيّن المنطقة الزمنيّة الافتراضيّة للتطبيق استنادًا إلى الضبط <code>config.time_zone</code> والذي يساوي افتراضيًا "UTC".
* Bootstrap_hook: يشغّل جميع كتل before_initialize المكوّنة.
+
* <code>active_support.initialize_beginning_of_week</code>: يعيّن بداية الأسبوع للتطبيق استنادًا إلى الضبط <code>config.beginning_of_week</code> والذي يساوي افتراضيًا <code>:monday</code>.
* I18n.callbacks: في بيئة التطوير، عيّن رد نظام to_prepare الذي سيستدعي I18n.reload! إذا تغيّرت أي من المحليات منذ آخر طلب، وفي وضع الإنتاج، سيشتغل هذا الاستدعاء فقط عند الطلب الأول.
+
* <code>active_support.set_configs</code>: يهيئ السجل الفعال باستخدام الإعدادت الموجودة في <code>config.active_support</code> عن طريق إرسال أسماء التوابع على أنها ضابطة (setters) للسجل الفعال (ActiveSupport) وتمرير القيم من خلالها.
* Active_support.deprecation_behavior: يُعدّ تقارير الإهمال للبيئات، وهو بشكل افتراضي :log للتطوير و:notify للإنتاج و :stderr للإختبار، وإذا لم تعيّن قيمة لـ config.active_support.deprecation فسيطالب هذا المهيئ المستخدم بضبط هذا السطر في ملف config/environments الخاص بالبيئة الحالية. يمكن ضبطه إلى مصفوفة من القيم.
+
* <code>action_dispatch.configure</code>: يضبط <code>ActionDispatch::Http::URL.tld_length</code> لتعيين قيمة <code>config.action_dispatch.tld_length</code>.
* Active_support.initialize_time_zone: يعيّن المنطقة الزمنيّة الافتراضيّة للتطبيق استنادًا إلى إعداد config.time_zone والذي يساوي افتراضيًا "UTC".
+
* <code>action_view.set_configs</code>: إعداد [[Rails/action view overview|إجراء العرض]] عن طريق استخدام الإعدادات الموجودة في <code>config.action_view</code> عن طريق إرسال أسماء التوابع على أنها ضابطة (setters) إلى <code>ActionView::Base</code> وتمرير القيم من خلالها.
* Active_support.initialize_beginning_of_week: يعيّن بداية الأسبوع للتطبيق استنادًا إلى إعداد config.beginning_of_week والذي يساوي افتراضيًا :monday.
+
* <code>action_controller.assets_config</code>: تهيئة <code>config.actions_controller.assets_dir</code> إلى مجلّد التطبيق العام إذا لم يُضبَط بشكل صريح.
* Active_support.set_configs: يُعد Active Support باستخدام الإعدادت الموجودة في config.active_support عن طريق إرسال أسماء التوابع كـ setters إلى ActiveSupport وتمرير القيم من خلالها.
+
* <code>action_controller.set_helpers_path</code>: يعيّن <code>helpers_path</code> الخاص [[Rails/action controller overview|بوحدة التحكم]] إلى <code>helpers_path</code> الخاص بالتطبيق.
* Action_dispatch.configure: ضبط ActionDispatch::Http::URL.tld_length لتعيين قيمة config.action_dispatch.tld_length.
+
* <code>action_controller.parameters_config</code>: يضبط خيارات معاملات قويّة لـ <code>ActionController::Parameters</code>.
* Action_view.set_configs: إعداد Action View عن طريق استخدام الإعدادات الموجودة في config.action_view عن طريق إرسال أسماء التوابع كـ setters إلى ActionView::Base وتمرير القيم من خلالها.
+
* <code>action_controller.set_configs</code>: يعّد [[Rails/action controller overview|متحكم الحدث]] عن طريق استخدام الإعدادات الموجودة في <code>config.action_controller</code> عن طريق إرسال أسماء التوابع على أنها ضابطة (setters) إلى <code>ActionController::Base</code> وتمرير القيم من خلالها.
* Action_controller.assets_config: تهيئة config.actions_controller.assets_dir إلى مجلّد التطبيق العام إذا لم يكوّن بشكل صريح.
+
* <code>action_controller.compile_config_methods</code>: يهيئ التوابع لإعدادات الضبط المحددة بحيث تكون أسرع في الوصول.
* Action_controller.set_helpers_path: يعيّن helpers_path الخاص بـ Action Controller إلى helpers_path الخاص بالتطبيق.
+
* <code>active_record.initialize_timezone</code>: يعيّن <code>ActiveRecord::Base.time_zone_aware_attributes</code> إلى <code>true</code> بالإضافة إلى ضبط <code>ActiveRecord::Base.default_timezone</code> إلى UTC. عند قراءة الخاصيات من قاعدة البيانات، ستحوّل إلى المنطقة الزمنيّة المحددة بواسطة <code>Time.zone</code>.
* Action_controller.parameters_config: يكوّن خيارات معاملات قويّة لـ ActionController::Parameters.
+
* <code>active_record.logger</code>: يعيّن <code>ActiveRecord::Base.logger</code> - إذا لم يُعيّن بالفعل - إلى <code>Rails.logger</code>.
* Action_controller.set_configs: يعّد Action Controller عن طريق استخدام الإعدادات الموجودة في config.action_controller عن طريق إرسال أسماء التوابع كـ setters إلى ActionController::Base وتمرير القيم من خلالها.
+
* <code>active_record.migration_error</code>: يضبط الوسيطات (middleware) للتأكد من وجود عمليات تهجير معلّقة.
* Action_controller.compile_config_methods: يهيئ التوابع لإعدادات config المحددة بحيث تكون أسرع في الوصول.
+
* <code>active_record.check_schema_cache_dump</code>: يحمّل ملف تفريغ التخزين المؤقت للمخطّط إذا هيئ بالفعل وكان متاحًا.
* Active_record.initialize_timezone: يعيّن ActiveRecord::Base.time_zone_aware_attributes إلى true كما يعّد ActiveRecord::Base.default_timezone إلى UTC. عند قراءة السمات من قاعدة البيانات، ستحوّل إلى المنطقة الزمنيّة المحددة بواسطة Time.zone.
+
* <code>active_record.warn_on_records_fetched_greater_than</code>: يُمكّن التحذيرات عند تُرجع الاستعلامات عدد كبير من السجلات.
* Active_record.logger: يعيّن ActiveRecord::Base.logger - إذا لم يُعيّن بالفعل - إلى Rails.logger.
+
* <code>active_record.set_configs</code>: يضبط [[Rails/active record basics|السجل الفعال]] عن طريق استخدام الإعدادات الموجودة في <code>config.active_record</code> وذلك عن طريق ارسال أسماء التوابع على أنها ضابطة (setters) إلى <code>ActiveRecord::Base</code> وتمرير القيم من خلالها.
* Active_record.migration_error: يعد الوسيطات للتأكد من وجود عمليات تهجير معلّقة.
+
* <code>active_record.initialize_database</code>: يحمّل إعدادات قاعدة البيانات (افتراضيًا) من config/database.yml ويُنشئ اتصال للبيئة الحاليّة.
* Active_record.check_schema_cache_dump: يحمّل ملف تفريغ التخزين المؤقت للمخطّط إذا هيئ بالفعل وكان متاحًا.
+
* <code>active_record.log_runtime</code>: يضمّن <code>ActiveRecord::Railties::ControllerRuntime</code> الذي هو المسؤول عن الإبلاغ عن الوقت الذي يستغرقه استدعاءات السجل الفعال وحتى عودة الطلب إلى المسجل (logger).
* Active_record.warn_on_records_fetched_greater_than: يُمكّن التحذيرات عند تُرجع الاستعلامات عدد كبير من السجلات.
+
* <code>active_record.set_reloader_hooks</code>: يعيد تعيين جميع الاتصالات القابلة لإعادة التحميل إلى قاعدة البيانات في حالة تعيين <code>config.cache_classes</code> إلى القيمة <code>false</code>.
* Active_record.set_configs: يُعّد Active Record عن طريق استخدام الإعدادات الموجودة في config.active_record عن طريق ارسال أسماء التوابع كـ setters إلى ActiveRecord::Base وتمرير القيم من خلالها.
+
* <code>active_record.add_watchable_files</code>: يضيف ملفات schema.rb و structure.sql إلى الملفات المراقبة.
* Active_record.initialize_database: يحمّل إعدادات قاعدة البيانات (افتراضيًا) من config/database.yml ويُنشئ اتصال للبيئة الحاليّة.
+
* <code>active_job.logger</code>: يعيّن <code>ActiveJob::Base.logger</code> - إذا لم تضبط بالفعل - إلى <code>Rails.logger</code>.
* Active_record.log_runtime: يضمّن ActiveRecord::Railties::ControllerRuntime الذي هو المسؤول عن الإبلاغ عن الوقت الذي يستغرقه استدعاءات Active Record  لعودة الطلب إلى logger.
+
* <code>active_job.set_configs</code>: يهيئ [[Rails/active job basics|الوظفية الفعالة]] عن طريق استخدام الإعدادات الموجودة في <code>config.active_job</code> عن طريق ارسال أسماء التوابع على أنها ضابطة (setters) إلى <code>ActiveJob::Base</code> وتمرير القيم من خلالها.
* Active_record.set_reloader_hooks: يعيد تعيين جميع الاتصالات القابلة لإعادة التحميل إلى قاعدة البيانات في حالة تعيين config.cache_classes كـ false.
+
* <code>action_mailer.logger</code>: يعيّن <code>ActionMailer::Base.logger</code> - إذا لم تضبط بالفعل - إلى <code>Rails.logger</code>.
* Active_record.add_watchable_files: يضيف ملفات schema.rb و structure.sql إلى الملفات المراقبة.
+
* <code>action_mailer.set_configs</code>: يعد [[Rails/action mailer basics|إجراء المراسلة]] عن طريق استخدام الإعدادات الموجودة في <code>config.action_mailer</code> عن طريق ارسال أسماء التوابع على أنها ضابطة (setters) إلى <code>ActionMailer::Base</code> وتمرير القيم من خلالها.
* Active_job.logger: يعيّن ActiveJob::Base.logger - إذا لم تضبط بالفعل - إلى Rails.logger.
+
* <code>action_mailer.compile_config_methods</code>: يهيئ التوابع لإعدادات الضبط المحددة بحيث يكون الوصول إليها أسرع.
* Active_job.set_configs: يُعّد Active Job عن طريق استخدام الإعدادات الموجودة في config.active_job عن طريق ارسال أسماء التوابع كـ setters إلى ActiveJob::Base وتمرير القيم من خلالها.
+
* <code>set_load_path</code>: يعمل هذا المهيئ قبل <code>bootstrap_hook</code> ويضيف المسارات المحددة بواسطة <code>config.load_paths</code> وجميع مسارات التحميل التلقائي إلى ‎<code>$LOAD_PATH</code>.
* Action_mailer.logger: يعيّن ActionMailer::Base.logger - إذا لم تضبط بالفعل - إلى Rails.logger.
+
* <code>set_autoload_paths</code>: يعمل هذا المهيئ قبل <code>bootstrap_hook</code> ويضيف جميع مجلدات app الفرعية والمسارات المحددة بواسطة <code>config.autoload_paths</code> و <code>config.eager_load_paths</code> و <code>config.autoload_once_paths</code> إلى <code>ActiveSupport::Dependencies.autoload_paths</code>.
* Action_mailer.set_configs: يعد Action Mailer عن طريق استخدام الإعدادات الموجودة في config.action_mailer عن طريق ارسال أسماء التوابع كـ setters إلى ActionMailer::Base وتمرير القيم من خلالها.
+
* <code>add_routing_paths</code>: تحميل (بشكل افتراضي) جميع ملفات config/routes.rb (في التطبيق و railties بما في ذلك المحركات) وإعداد المسارات للتطبيق.
* Action_mailer.compile_config_methods: يهيئ التوابع لإعدادات config المحددة بحيث يكون الوصول إليها أسرع.
+
* <code>add_locales</code>: يضيف الملفات في config/locales (من التطبيق و railties والمحركات) إلى <code>I18n.load_path</code> مما يتيح الترجمات في هذه الملفات.
* Set_load_path: يعمل هذا المهيئ قبل bootstrap_hook ويضيف المسارات المحددة بواسطة config.load_paths وجميع مسارات التحميل التلقائي إلى $LOAD_PATH.
+
* <code>add_view_paths</code>: يضيف المجلد app/views من التطبيق و railties والمحركات إلى مسار البحث لملفات العرض للتطبيق.
* Set_autoload_paths: يعمل هذا المهيئ قبل bootstrap_hook ويضيف جميع مجلدات app الفرعية والمسارات المحددة بواسطة config.autoload_paths وconfig.eager_load_paths وconfig.autoload_once_paths إلى ActiveSupport::Dependencies.autoload_paths.
+
* <code>load_environment_config</code>: تحميل الملف config/environments للبيئة الحاليّة.
* Add_routing_paths: تحميل (بشكل افتراضي) جميع ملفات config/routes.rb (في التطبيق و railties بما في ذلك المحركات) وإعداد المسارات للتطبيق.
+
* Prepend_helpers_path: يضيف المجلّد app/helpers من التطبيق و railties والمحركات إلى مسار البحث للمساعدين للتطبيق.
* Add_locales: يضيف الملفات في config/locales (من التطبيق وrailties والمحركات) إلى I18n.load_path مما يتيح الترجمات في هذه الملفات.
+
* <code>load_config_initializers</code>: تحميل جميع ملفات روبي من config/initializers في التطبيق و railties والمحركات. يمكن استخدام الملفات الموجودة في هذا المجلّد لاستيعاب إعدادات الضبط التي يجب إجراؤها بعد تحميل جميع إطارات العمل.
* Add_view_paths: يضيف مجلد app/views من التطبيق وrailties والمحركات إلى مسار البحث لملفات العرض للتطبيق.
+
* <code>engines_blank_point</code>: يوفر نقطة في التهيئة (point-in-initialization) للربط إذا كنت ترغب في القيام بأي شيء قبل تحميل المحركات. بعد هذه النقطة، ستشتغل جميع مهيئات railtie والمحرك.
* Load_environment_config: تحميل ملف config/environments للبيئة الحاليّة.
+
* <code>add_generator_templates</code>: إيجاد القوالب للمولدات في lib/templates للتطبيق، railties والمحركات ويضيف هذه إلى الضبط <code>config.generators.templates</code> الذي سيجّعل القوالب متاحة لجميع المولدات للإشارة إليها.
* Prepend_helpers_path: يضيف مجلّد app/helpers من التطبيق وrailties والمحركات إلى مسار البحث للمساعدين للتطبيق.
+
* <code>ensure_autoload_once_paths_as_subset</code>: التأكد أن الضبط <code>config.autoload_once_paths</code> لا يحتوي إلا على مسارات من <code>config.autoload_paths</code>. وإذا كان يحتوي على مسارات إضافيّة، فسيرفع استثناء.
* Load_config_initializers: تحميل جميع ملفات روبي من config/initializers في التطبيق وrailties والمحركات، يمكن استخدام الملفات الموجودة في هذا المجلّد لاستيعاب إعدادات الضبط التي يجب إجراؤها بعد تحميل جميع إطارات العمل.
+
* <code>add_to_prepare_blocks</code>: تضاف الكتلة لجميع استدعاءات <code>config.to_prepare</code> في التطبيق أو railtie أو المحرك إلى ردود النداء <code>to_prepare</code> لإجراء الإرسال (Action Dispatch) والتي ستشتغل لكل طلب في التطوير أو قبل أول طلب في الإنتاج.
* Engines_blank_point: يوفر نقطة في التهيئة (point-in-initialization) للربط إذا كنت ترغب في القيام بأي شيء قبل تحميل المحركات، بعد هذه النقطة، ستشتغل جميع مهيئات railtie والمحرك.
+
* <code>add_builtin_route</code>: إذا كان التطبيق قيد التشغيل في بيئة التطوير، فسيؤدي ذلك إلى إلحاق مسار لـ rails/info/properties إلى مسارات التطبيق، ويوفّر هذا المسار معلومات تفصيليّة مثل إصدار ريلز وروبي لـ public/index.html في تطبيق ريلز الافتراضي.
* Add_generator_templates: إيجاد القوالب للمولدات في lib/templates للتطبيق، railties والمحركات ويضيف هذه إلى إعداد config.generators.templates الذي سيجّعل القوالب متاحة لجميع المولدات للإشارة إليها.
+
* <code>build_middleware_stack</code>: بناء كومة وسيط (middleware stack) للتطبيق، ويرّجع كائن يملك التابع <code>call</code> الذي يأخذ كائن بيئة Rack للطلب.
* Ensure_autoload_once_paths_as_subset: التأكد أن config.autoload_once_paths لا يحتوي إلا على مسارات من config.autoload_paths وإذا كان يحتوي على مسارات إضافيّة، فسيرفع استثناء.
+
* <code>eager_load!‎</code>: إذا كان <code>config.eager_load</code> يساوي <code>true</code>، فنفِّذ خطافات <code>config.before_eager_load</code> ومن ثم استدعي <code>eager_load!‎</code> الذي سيحمّل جميع <code>config.eager_load_namespaces</code>.
* Add_to_prepare_blocks: تضاف الكتلة لجميع استدعاءات config.to_prepare في التطبيق أو railtie أو المحرك إلى ردود النداء to_prepare لـ Action Dispatch والتي ستشتغل لكل طلب في التطوير أو قبل أول طلب في الإنتاج.
+
* <code>finisher_hook</code>: يوفّر خطافًا بعد اكتمال تهيئة عملية التطبيق، بالإضافة إلى تشغيل جميع كتل <code>config.after_initialize</code> للتطبيق و railties والمحركات.
* Add_builtin_route: إذا كان التطبيق قيد التشغيل في بيئة التطوير، فسيؤدي ذلك إلى إلحاق مسار لـ rails/info/properties إلى مسارات التطبيق، ويوفّر هذا المسار معلومات تفصيليّة مثل إصدار Rails وروبي لـ public/index.html في تطبيق Rails الافتراضي.
+
* <code>set_routes_reloader_hook</code>: يضبط إجراء الإرسال (Action Dispatch) لإعادة تحميل ملف المسارات باستخدام <code>ActiveSupport::Callbacks.to_run</code>.
* Build_middleware_stack: بناء كومة وسيط للتطبيق، ويرّجع كائن يملك تابع call التي تأخذ كائن بيئة Rack للطلب.
+
* <code>disable_dependency_loading</code>: يعطّل تحميل التبعيّة التلقائي إذا لم يعيّن <code>config.eager_load</code> إلى القيمة <code>true</code>.
* Eager_load!: إذا كان config.eager_load يساوي true، فستشتغل خطافات config.before_eager_load ومن ثم استدعاءات eager_load! التي ستحمّل جميع config.eager_load_namespaces.
 
* Finisher_hook: يوفّر خطافًا بعد اكتمال تهيئة عملية التطبيق، بالإضافة إلى تشغيل جميع كتل config.after_initialize للتطبيق وrailties والمحركات.
 
* Set_routes_reloader_hook: يكوّن Action Dispatch لإعادة تحميل ملف المسارات باستخدام ActiveSupport::Callbacks.to_run.
 
* Disable_dependency_loading: يعطّل تحميل التبعيّة التلقائي إذا لم يعيّن config.eager_load على true.
 
 
 
= تجميع قواعد البيانات =
 
تدار اتصالات قواعد بيانات Active Record عن طريق ActiveRecord::ConnectionAdapters::ConnectionPool الذي يضمن تزامن مجمع الاتصالات كميّة الوصول الخيوط إلى عدد محدود من اتصالات قاعدة البيانات، الحد الافتراضي لهذا هو 5 ويمكن ضبطه في database.yml.
 
  
 +
== تجميع قواعد البيانات ==
 +
تدار اتصالات قواعد بيانات [[Rails/active record basics|السجل الفعال]] عن طريق <code>ActiveRecord::ConnectionAdapters::ConnectionPool</code> الذي يضمن تزامن مجمع الاتصالات كميّة الوصول الخيوط إلى عدد محدود من اتصالات قاعدة البيانات. الحد الافتراضي لهذا هو 5 ويمكن ضبطه في database.yml.<syntaxhighlight lang="text">
 
development:
 
development:
 +
  adapter: sqlite3
 +
  database: db/development.sqlite3
 +
  pool: 5
 +
  timeout: 5000
 +
</syntaxhighlight>نظرًا لأنه يتعامل مع تجمع الاتصالات داخل [[Rails/active record basics|السجل الفعال]] افتراضيًا، يجب أن تعمل جميع خوادم التطبيقات (Thin، Puma، Unicorn …إلخ) بنفس الطريقة. إن قاعدة بيانات مجمع الاتصالات فارغ افتراضيًا. كلما زاد الطلب على الاتصالات، سيؤدي إلى ضبطها حتى تصل إلى حد مجمع الاتصالات.
  
 adapter: sqlite3
+
أي طلب سيتحقق من الاتصال المطلوب إلى قاعدة البيانات في المرة الأولى. وفي نهاية الطلب، سيتحقق من إرجاع الاتصال، وهذا يعني أن منفذ الاتصال الإضافي سيتوفّر مرة أخرى للطلب التالي في قائمة الانتظار.
 
 
 database: db/development.sqlite3
 
 
 
 pool: 5
 
 
 
 timeout: 5000
 
 
 
نظرًا لأنه يتعامل مع تجمع الاتصالات داخل Active Record افتراضيًا، يجب أن تعمل جميع خوادم التطبيقات (Thin، Puma، Unicorn ….) بنفس الطريقة، إن قاعدة بيانات مجمع الاتصالات فارغ افتراضيًا، كلما زاد الطلب على الاتصالات، سيؤدي إلى ضبطها حتى تصل إلى حد مجمع الاتصالات.
 
 
 
أي طلب سيتحقق من الاتصال المطلوب إلى قاعدة البيانات في المرة الأولى  وفي نهاية الطلب، سيتحقق من إرجاع الاتصال، وهذا يعني أن فتحة الاتصال الإضافية ستتوفّر مرة أخرى للطلب التالي في قائمة الانتظار.
 
 
 
إذا حاولت استخدام اتصالات أكثر من تلك المتاحة، فسيحظرك Active Record وسينتظر اتصال من المجمع، وإذا لم يتمكن من الحصول على اتصال، فسيرمي خطأ انتهاء المهلة تشبه لتلك الموجودة أدناه.
 
  
 +
إذا حاولت استخدام اتصالات أكثر من تلك المتاحة، فسيحظرك [[Rails/active record basics|السجل الفعال]] وسينتظر اتصالًا من المجمع. وإذا لم يتمكن من الحصول على اتصال، فسيرمي خطأ عند انتهاء المهلة الزمنية مثل الخطأ التالي.<syntaxhighlight lang="text">
 
ActiveRecord::ConnectionTimeoutError - could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)
 
ActiveRecord::ConnectionTimeoutError - could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)
 +
</syntaxhighlight>إذا حصلت على الخطأ أعلاه، فقد ترغب في زيادة حجم مجمع الاتصال عن طريق زيادة الخيار <code>pool</code> في database.yml.
  
إذا حصلت على الخطأ أعلاه، فقد ترغب في زيادة حجم مجمع الاتصال عن طريق زيادة خيار pool في database.yml.
+
'''ملاحظة''': إذا كنت تعمل في بيئة متعددة [[Ruby/Thread|الخيوط]]، فقد تكون هنالك فرصة لأن العديد من الخيوط قد تصل إلى عدة اتصالات في نفس الوقت. وبناءًا على تحميل الطلب الحالي، قد يكون لديك العديد من الخيوط التي تتنافس على عدد محدود من الاتصالات.
 
 
ملاحظة: إذا كنت تعمل في بيئة متعددة الخيوط، فقد تكون هنالك فرصة لأن العديد من الخيوط قد تصل إلى عدة اتصالات في نفس الوقت، وبناءًا على تحميل الطلب الحالي، قد يكون لديك العديد من الخيوط التي تتنافس على عدد محدود من الاتصالات.
 
 
 
= الضبط المخصًص =
 
يمكنك ضبط الشيفرة البرمجية الخاصة بك من خلال كائن ضبط Rails مع ضبط مخصص تحت إما مساحة الاسم config.x أو config مباشرةً، والفرق الرئيسي بين هذيّن هو أنه يجب أن تستخدم config.x إذا كنت تعرّف ضبط متداخل (مثلًا: config.x.nested.nested.hi) وconfig لضبط مستوى واحد (مثلًا: config.hello).
 
  
 +
== الضبط المخصص ==
 +
يمكنك ضبط الشيفرة البرمجية الخاصة بك من خلال كائن ضبط ريلز مع ضبط مخصص تحت إما مجال الاسم <code>config.x</code> أو <code>config</code> مباشرةً؛ والفرق الرئيسي بينهما هو أنه يجب أن تستخدم <code>config.x</code> إذا كنت تعرّف ضبطًا متداخلًا (مثل <code>config.x.nested.nested.hi</code>) و <code>config</code> لضبط ذي مستوى واحد (مثل <code>config.hello</code>).<syntaxhighlight lang="rails">
 
config.x.payment_processing.schedule = :daily
 
config.x.payment_processing.schedule = :daily
 
+
config.x.payment_processing.retries = 3
config.x.payment_processing.retries  = 3
 
 
 
 
config.super_debugger = true
 
config.super_debugger = true
 
+
</syntaxhighlight>نقاط الضبط التالية متاحة بعد ذلك من خلال كائن الضبط:<syntaxhighlight lang="rails">
هذه نقاط الضبط متاحة بعد ذلك من خلال كائن الضبط:
 
 
 
 
Rails.configuration.x.payment_processing.schedule # => :daily
 
Rails.configuration.x.payment_processing.schedule # => :daily
 
+
Rails.configuration.x.payment_processing.retries # => 3
Rails.configuration.x.payment_processing.retries  # => 3
+
Rails.configuration.x.payment_processing.not_set # => nil
 
+
Rails.configuration.super_debugger               # => true
Rails.configuration.x.payment_processing.not_set  # => nil
+
</syntaxhighlight>يمكنك أيضًا استخدام <code>Rails::Application.config_for</code> لتحميل ملفات الضبط بأكملها:<syntaxhighlight lang="rails">
 
+
# config/payment.yml:
Rails.configuration.super_debugger             # => true
 
 
 
يمكنك أيضًا استخدام Rails::Application.config_for لتحميل ملفات الضبط بأكملها:
 
 
 
<nowiki>#</nowiki> config/payment.yml:
 
 
 
 
production:
 
production:
 
+
  environment: production
 environment: production
+
  merchant_id: production_merchant_id
 
+
  public_key: production_public_key
 merchant_id: production_merchant_id
+
  private_key: production_private_key
 
 
 public_key:  production_public_key
 
 
 
 private_key: production_private_key
 
 
 
 
development:
 
development:
 
+
  environment: sandbox
 environment: sandbox
+
  merchant_id: development_merchant_id
 
+
  public_key: development_public_key
 merchant_id: development_merchant_id
+
  private_key: development_private_key
 
+
 public_key:  development_public_key
+
# config/application.rb
 
 
 private_key: development_private_key
 
 
 
<nowiki>#</nowiki> config/application.rb
 
 
 
 
module MyApp
 
module MyApp
 
+
  class Application < Rails::Application
 class Application < Rails::Application
+
    config.payment = config_for(:payment)
 
+
  end
config.payment = config_for(:payment)
+
end
 
+
</syntaxhighlight><syntaxhighlight lang="rails">
 end
 
 
 
End
 
 
 
 
Rails.configuration.payment['merchant_id'] # => production_merchant_id or development_merchant_id
 
Rails.configuration.payment['merchant_id'] # => production_merchant_id or development_merchant_id
 +
</syntaxhighlight>
  
= فهرسة محركات البحث =
+
== فهرسة محركات البحث ==
في بعض الأحيان، قد ترغب في منع ظهور بعض صفحات تطبيقك على مواقع البحث من Google أو Bing أو Yahoo أو Duck Duck Go، تعمل برامج الروبوتات التي تفهرس هذه المواقع أولًأ على تحليل ملف <nowiki>http://your-site.com/robots.txt</nowiki> لمعرفة الصفحات التي يُسمح لها بفهرستها.
+
في بعض الأحيان، قد ترغب في منع ظهور بعض صفحات تطبيقك على مواقع البحث مثل Google أو Bing أو Yahoo أو Duck Duck Go. تعمل البرامج الآلية التي تفهرس هذه المواقع أولًا على تحليل الملف <nowiki>http://your-site.com/robots.txt</nowiki> لمعرفة الصفحات التي يُسمَح لها بفهرستها.
 
 
ينشئ Rails هذا الملف داخل مجلد /public وافتراضيًا، يسمح لمحركات البحث بفهرسة جميع صفحات تطبيقك، وإذا كنت ترغب في حظر فهرسة في جميع صفحات تطبيقك، فاستخدم هذا:
 
  
 +
ينشئ ريلز هذا الملف داخل المجلد ‎/public. وافتراضيًا، يسمح لمحركات البحث بفهرسة جميع صفحات تطبيقك، وإذا كنت ترغب في حظر فهرسة جميع صفحات تطبيقك، فاستخدم ما يلي:<syntaxhighlight lang="text">
 
User-agent: *
 
User-agent: *
 
 
Disallow: /
 
Disallow: /
 +
</syntaxhighlight>لحظر فهرسة صفحات محدّدة فقط، فمن الضروري استخدام صياغة أكثر تعقيدًا. تعلّم كيفية القيام بذلك من [http://www.robotstxt.org/robotstxt.html التوثيق الرسمي].
  
لحظر فهرسة صفحات محدّدة فقط، فمن الضروري استخدام صياغة أكثر تعقيدًا، تعلّم ذلك على الوثائق الرسميّة.
+
== مراقب نظام الملفات الحدثي ==
 
+
عند تحميل الجوهرة listen، فإن ريلز يستخدم مراقب نظام الملفات الحدثي (evented file system monitor) للكشف على التغييرات عندما يكون <code>config.cache_classes</code> مساويًا إلى القيمة <code>false</code>:<syntaxhighlight lang="rails">
= رصد نظام الملفات المنفذة =
 
عند تحميل  gem الاستماع، فإن Rails يستخدم مراقب نظام الملفات منفذة للكشف على التغييرات عندما يكون config.cache_classes يساوي false:
 
 
 
 
group :development do
 
group :development do
 
+
  gem 'listen', '>= 3.0.5', '< 3.2'
 gem 'listen', '>= 3.0.5', '< 3.2'
 
 
 
 
end
 
end
 +
</syntaxhighlight>خلاف ذلك، في كل طلب، يمر ريلز على شجرة التطبيق للتأكد ما إذا قد تغيّر أي شيء.
  
خلاف ذلك، في كل طلب، يمر Rails على شجرة التطبيق للتأكد ما إذا قد تغيّر أي شيء.
+
لا توجد حاجة إلى جوهرة إضافيّة في لينكس وماك، ولكن بعضها مطلوب لأنظمة *BSD وويندوز.
 
 
لا توجد حاجة إلى gem إضافيّة في لينكس وماك، ولكن بعضها مطلوب لـ *BSD و ويندوز.
 
  
لاحظ أن بعض أجهزة الإعداد غير مدعومة.
+
لاحظ أن [https://github.com/guard/listen#issues--limitations بعض الإعدادات غير مدعومة].
  
<nowiki>https://guides.rubyonrails.org/configuring.html</nowiki>
+
== مصادر ==
 +
* [https://guides.rubyonrails.org/configuring.html صفحة Configuring Rails Applications في توثيق Ruby On Rails الرسمي.]
 +
[[تصنيف:Rails]]
 +
[[تصنيف:Rails Digging Deeper]]

مراجعة 14:30، 10 مارس 2019

يغطي هذا الدليل ميزات الضبط والتهيئة المتاحة لتطبيقات ريلز. بعد قراءة هذا الدليل، ستتعلم:

  • كيفية ضبط سلوك تطبيقات ريلز.
  • كيفية إضافة شيفرة مصدريّة إضافية لتنفيذها وقت بدء تشغيل التطبيق.

مواقع شيفرة التهيئة والضبط

يوفر ريلز أربعة مواضع رئيسيّة لوضع الشيفرة المصدريّة للتهيئة:

  • config/application.rb
  • ملفات الضبط (configuration) الخاصة بالبيئة
  • المهيآت (Initializers)
  • ما بعد المهيآت (After-initializers)

تشغيل شيفرة برمجية قبل ريلز

في أحيان نادرة، يحتاج تطبيقك لتشغيل بعض الشيفرات البرمجية قبل تحميل ريلز نفسه، ذا ضعها آنذاك قبل استدعاء require 'rails/all'‎ في config/application.rb.

ضبط مكونات ريلز

بشكل عام، تعني مهمة ضبط ريلز إعداد مكونات ريلز بالإضافة إلى ريلز نفسه. يسمح لك ملف الضبط config/application.rb وملفات الضبط الخاصة بالبيئة (مثل الملف config/environments/production.rb) بتحديد الإعدادات المتنوّعة التي تريد تمريرها إلى كافة المكونات.

على سبيل المثال، يمكنك إضافة هذا الإعداد إلى الملف config/application.rb:

config.time_zone = 'Central Time (US & Canada)'

هذه إعدادات لريلز نفسه، إذا كنت ترغب في تمرير الإعدادات إلى مكونات ريلز فرديّة، فيمكنك القيام بذلك عبر نفس كائن الضبط في config/application.rb:

config.active_record.schema_format = :ruby

سيستخدم ريلز هذا الإعداد لضبط السجل الفعال.

إعدادات ريلز العامة

ستُستدعى توابع الإعدادات هذه على الكائن Rails::Railtie مثل صنف فرعي من Rails::Engine أو Rails::Application.

  • config.after_initialize: يأخذ الكتلة التي سيتم تنفيذها بعدما ينتهي ريلز من تهيئة التطبيق، ويتضمّن هذا تهيئة الإطار نفسه، والمحركات، وجميع مهيئات التطبيق في config/initializers، لاحظ أن هذه الكتلة ستُنفَّذ لمهام البداية، وهي مفيدة لضبط القيم المعدّة بواسطة مهيئات أخرى:
config.after_initialize do
  ActionView::Base.sanitized_allowed_tags.delete 'div'
end
  • config.asset_host: يعيّن المضيف للأصول (assets)، وهو مفيدة عندما يُستخدم CDN لاستضافة الأصول أو عندما تريد العمل حول قيود التزامن المضمنة في المتصفحات باستخدام أسماء النطاقات المستعارة المختلفة. وهي نسخة مختصرة لـ config.action_controller.asset_host.
  • config.autoload_once_paths: يقبل مصفوفة من المسارات التي سيحمل ريلز تلقائيًّا الثوابت منها التي لن تمسح لكل طلب، وهي مناسبة إذا كان config.cache_classes يساوي false، والتي هي الحالة الافتراضيّة لوضع التطوير. وخلاف ذلك، يحدث كل التحميل التلقائي مرّة واحدة فقط، ويجب أن تكون جميع عناصر هذه المصفوفة في autoload_paths. بشكل افتراضي هي مصفوفة فارغة.
  • config.autoload_paths: يقبل مصفوفة من المسارات التي يحمل ريلز بشكل تلقائي الثوابت منها، وبشكل افتراضي هي جميع المجلدات داخل app، ولم يعد من المستحسن ضبط هذا. راجع الثوابت المحملة والمعاد تحميلها تلقائيًّا.
  • config.cache_classes: يتحكم ما إذا كان يجب إعادة تحميل أصناف التطبيق والوحدات في كل طلب، وبشكل افتراضي تكون قيمتها false في وضع التطوير و true  في أوضاع الاختبار والإنتاج.
  • config.beginning_of_week: يعيّن بداية الأسبوع الافتراضيّة للتطبيق، وهو يقبل رمزًا يمثِّل يوم أسبوع صحيح (على سبيل المثال ‎:monday).
  • config.cache_store: يضبط أي تخزين مؤقت يراد استخدامه في ريلز. تتضمن الخيارات أحد الرموز التالية: ‎:memory_store، أو ‎:file_store، أو ‎:mem_cache_store، أو ‎:null_store أو كائن يطبّق واجهة برمجة التطبيقات لذاكرة التخزين المؤقت، ويكون افتراضيًا مساويًا إلى ‎:file_store.
  • config.colorize_logging: يحدد استخدام رموز ألوان ANSI أو لا عند تسجيل المعلومات، وقيمته الافتراضية هي true.
  • config.consider_all_requests_local: هو راية. إذا كان مساوي للقيمة true، فأي خطأ سيؤدي إلى تفريغ معلومات التنقيح في استجابة HTTP، وسيعّرض متحكم Rails::Info سياق وقت التشغيل للتطبيق في ‎/rails/info/properties. وقيمته true بشكل افتراضي في وضع التطوير والاختبار، و false في وضع الإنتاج. وللتحكم به بشكل دقيق، اضبط هذه الراية إلى القيمة false ونفّذ local_request?‎ في المتحكم لتحديد أي طلبات يجب توفير معلومات التنقيح على الأخطاء.
  • config.console: يسمح لك بتعيين الصنف الذي سيُستخدم كطرفية عند تنفيذ rails console، ومن الأفضل تنفيذه في الكتلة console.
console do
  # فقط console تستدعى هذه الكتلة عند تنفيذ
  # هنا pry وبذلك يمكننا بأمان طلب
  require "pry"
  config.console = Pry
end
  • config.eager_load: عندما تكون قيمته true، ستحمّل جميع تسجيلات config.eager_load_namespaces بشكل حثيث. ويتضمن هذا تطبيقك، والمحركات، وأطر ريلز وأي مجالات أسماء مسجلة (registered namespace) أخرى.
  • config.eager_load_namespaces: يسّجل مجالات الأسماء التي ستحمّل بشكل حثيث عندما يكون config.eager_load مساويًا إلى القيمة true. يجب أن تستجيب جميع مجالات الأسماء إلى التابع eager_load!‎.
  • config.eager_load_paths: يقبل مصفوفة من المسارات التي سيحمّل ريلز منها عند بدء التشغيل بشكل حثيث إذا كانت أصناف ذاكرة التخزين المؤقت مفعّلة. تُعيَّن قيمته الافتراضية إلى كل مجلد في المجلد app الخاصة بالتطبيق.
  • config.enable_dependency_loading: عندما يكون true، فسيُفعَّل التحميل التلقائي، حتى إذا كان التطبيق محمل بشكل حثيث وكان config.cache_classes مضبوطًا إلى القيمة true. قيمته الافتراضية هي false.
  • config.encoding: تعمل على إعداد الترميز على مستوى التطبيق، وهي بشكل افتراضي تساوي UTF-8.
  • config.exceptions_app: تعيّن استثناءات التطبيق المستدعية بواسطة الوسيط ShowException عند حدوث الاستثناء. قيمته الافتراضية هي ActionDispatch::PublicExceptions.new(Rails.public_path)‎.
  • config.debug_exception_response_format: تعيّن التنسيق المستخدم في الاستجابات عند حدوث الأخطاء في وضع التطوير. قيمته الافتراضية هي: ‎:api لتطبيقات ذات الواجهة البرمجية فقط و ‎:default للتطبيقات العادية.
  • config.file_watcher: هو الصنف المستخدم للكشف عن تحديثات الملف في نظام الملفات عندما يكون config.reload_classes_only_on_change مضبوطًا إلى القيمة true. ويأتي ريلز مع ActiveSupport::FileUpdateChecker - الافتراضي -، و ActiveSupport::EventedFileUpdateChecker (يعتمد هذا على الجوهرة listen) ويجب أن تتوافق الأصناف المخصصة مع واجهة برمجة التطبيقات ActiveSupport::FileUpdateChecker.
  • config.filter_parameters: يُستخدم لتصفيّة المعاملات التي لا تريد عرضها في السجلات، مثل كلمات المرور وأرقام بطاقات الائتمان. وبشكل افتراضي، يصفي ريلز كلمات المرور عن طريق إضافة Rails.application.config.filter_parameters += [:password]‎ في config/initializers/filter_parameter_logging.rb. وتعمل عملية ترشيح المعاملات من خلال مطابقة التعبير النمطي بشكل جزئي.
  • config.force_ssl: يجبر جميع الطلبات أن تُخدم عبر HTTPS عن طريق استخدام الوسيط ActionDispatch::SSL، ويعيّن config.action_mailer.default_url_options ليكون { protocol: 'https'‎ }. ويمكن ضبط ذلك عن طريق الإعداد config.ssl_options، - يمكنك مراجعة توثيق ActionDispatch::SSL لمزيد من المعلومات.
  • config.log_formatter: يعّرف منسّق مسجّل ريلز، وهذا الخيار الافتراضي لنسخة ActiveSupport::Logger::SimpleFormatter لجميع الأوضاع، وإذا عيّنت قيمة للإعداد config.logger، فيجب عليك أن تمرر قيمة المنسّق (formatter) إلى المسجّل قبل تغليفه في النسخة ActiveSupport::TaggedLogging، ولن يفعل ريلز ذلك بالنيابة عنك.
  • config.log_level: يعرّف مستوى تفصيل مسجّل ريلز. القيمة الافتراضية هي ‎:debug لجميع البيئات، ومستويات السجل المتوافرة هي: ‎:debug، و ‎:info، و ‎:warn، و ‎:error، و ‎:fatal، و ‎:unknown.
  • config.log_tags: يقبل قائمة من: التوابع التي يستجيب لها كائن الطلب request، أو كائن من النوع Proc يقبل كائن الطلب request، أو شيئًا يستجيب إلى to_s. هذا يجعل من وضع علامة على أسطر السجل أسهل مع تنقيح المعلومات مثل النطاق الفرعي و معرّف الطلب - وكلاهما مفيد للغاية في تنقيح تطبيقات متعددة المستخدمين في بيئة الإنتاج.
  • config.logger: هو السجل الذي سيُستخدم لـ Rails.logger وأي تسجيل ريلز ذا صلة مثل ActiveRecord::Base.logger. القيمة الافتراضية له هي نسخة من ActiveSupport::TaggedLogging الذي يغلف نسخة من ActiveSupport::Logger والتي ستُسجَّل مخرجاته في المجلد log/. يمكنك توفير مسجّل مخصّص، وللحصول على التوافق الكامل، يجب عليك اتباع هذه الإرشادات:
    • لإعتماد منسّق، يجب عليك تعيين منسّق بشكل يدوي من قيمة الضبط config.log_formatter إلى المُسجّل.
    • لدعم السجلات الموسومة (tagged logs)، يجب تغليف النسخة log مع ActiveSupport::TaggedLogging.
    • لدعم الوضه الصامت (silencing)، يجب أن يتضمّن المسجّل الوحدات LoggerSilence و ActiveSupport::LoggerThreadSafeLevel. الصنف ActiveSupport::Logger متضمن بالفعل في هذه الوحدات.
class MyLogger < ::Logger
  include ActiveSupport::LoggerThreadSafeLevel
  include LoggerSilence
end
 
mylogger           = MyLogger.new(STDOUT)
mylogger.formatter = config.log_formatter
config.logger      = ActiveSupport::TaggedLogging.new(mylogger)
  • config.middleware: يسمح لك بتهيئة وسيط التطبيق، ولقد غطيّنا هذا بالتفصيل في قسم ضبط الوسيط في الأسفل.
  • config.reload_classes_only_on_change: يتيح لك تفعيل أو تعطيل إعادة تحميل الأصناف فقط عندما تتغيّر الملفات المتعقبة. وهو بشكل افتراضي يتعقّب كل شيء على مسارات إعادة التحميل ويُعيّن إلى القيمة true، وإذا كان config.cache_classes هو true، فسيُتجاهل هذا الخيار.
  • secret_key_base: يُستخدَم لتحديد المفتاح الذي يسمح بالتحقق من جلسات التطبيق ضد المفتاح الآمن المعروف لمنع التلاعب. يحصل التطبيق على مفتاح تم إنشاؤه عشوائيًا في بيئات الاختبار والتطوير، ويجب على البيئات الاخرى تعيين واحد في config/credentials.yml.enc.
  • config.public_file_server.enabled: يضبط ريلز لخدمة ملفات ثابتة من المجلّد العام، وتكون قيمته true بشكل افتراضي، لكن في بيئة الإنتاج تكون false لأنه  يجب على البرنامج الخادم (على سبيل المثال Apache أو NGINX) الذي يُستخدَم لتشغيل التطبيق أن يخدّم الملفات الثابتة بدلًا من ذلك. فإذا كنت تشغّل أو تجرّب التطبيق في وضع الإنتاج باستخدام WEBrick (لا يوصى باستخدام WEBrick في الإنتاج)، عين القيمة true لهذا الخيار، وإلا، فلن تتمكّن من استخدام التخزين المؤقت للصفحة وطلب الملفات الموجودة ضمن الدليل العام.
  • config.session_store: يعيّن الصنف الذي يجب استخدامه لتخزين الجلسة، والقيم المحتملة له هي ‎:cookie_store (القيمة الافتراضية)، و ‎:mem_cache_store و ‎:disabled. وهذا الأخير يخبر ريلز بعدم التعامل مع الجلسات. بشكل افتراضي مخزن ملفات تعريف الارتباط مع اسم التطبيق كمفتاح للجلّسة، ويمكن تحديد مخازن الجلسات المخصّصة:
config.session_store :my_custom_store

يجب تعرف هذا المخزن كـ ActionDispatch::Session::MyCustomStore.

  • config.time_zone: يعيّن المنطقة الزمنيّة الافتراضيّة للتطبيق ويفعّل المنطقة الزمنيّة للسجل الفعال.

ضبط الأصول (Assets)

  • config.assets.enabled: هو راية تتحكّم في تمكين خط الأنابيب (pipeline) الخاص بالأصول، وقيمته true بشكل افتراضي.
  • config.assets.css_compressor: يعرّف ضاغط شيفرة CSS المراد استعماله، ويكون sass-rails بشكل افتراضي، والقيمة البديلة الفريدة في الوقت الحالي هي ‎:yui والتي تستخدم الجوهرة yui-compressor.
  • config.assets.js_compressor: يعرّف ضاغط شيفرة JavaScript المراد استخدامه، والقيم المحتملة له هي ‎:closure، و ‎:uglifier، و ‎:yui والتي تتطلّب استخدام الجواهر closure-compiler أو uglifier أو yui-compressor على التوالي.
  • config.assets.gzip: هو راية تمكّن من إنشاء إصدار نسخة مضغوطة بملف gzip من الأصول المترّجمة جنبًا إلى جنب مع الأصول الغير مضغوطة (non-gzipped). قيمته الافتراضية هي true.
  • config.assets.paths: يحتوي على المسارات المستخدمة للبحث عن الأصول، سيؤدي إضافة المسارات إلى خيار الضبط هذا إلى استخدام هذه المسارات في البحث عن الأصول.
  • config.assets.precompile: يسمح لك بتحديد أصول إضافيّة (بخلاف application.css و application.js) والتي يجب تحويلها إلى أصول مفسرة مسبقًا (precompiled) عند تنفيذ الأمر rake assets:precompile.
  • config.assets.unknown_asset_fallback: يتيح لك تعديل سلوك خط أنابيب الأصول عندما لا يكون الأصل في خط الأنابيب، إذا كنت تستخدم sprockets-rails 3.2.0 أو إصدار أحدث منه. القيمة الافتراضية هي false.
  • config.assets.prefix: يعرّف البادئة حيث تكون الأصول موجودة فيه، وهي ‎/assets بشكل افتراضي.
  • config.assets.manifest: تعرّف المسار الكامل ليُستخدم في ملف بيان (precompiler) للأصول. وهو بشكل افتراضي ملف يسمى manifest-<random>.json في مجلّد config.assets.prefix ضمن المجلد العام.
  • config.assets.digest: يتيح لك استخدام بصمات SHA256 في أسماء الأصول، وهو true بشكل افتراضي.
  • config.assets.debug: يعطّل سَلسَلة وضغط الأصول، وهو true بشكل افتراضي في development.rb.
  • config.assets.version: عبارة على سلسلة نصيّة اختياريّة تُستخدم في توليد SHA256 hash، ويمكن تغيير هذا لإجبار جميع الملفات على أن تكون معاد تصريفها (recompiled).
  • config.assets.compile: هو متغير منطقي يمكن استخدامه لتشغيل تجميع الحي لـ Sprockets في الإنتاج.
  • config.assets.logger: يقبل مسجلًا يتطابق مع واجهة Log4r أو مع صنف روبي Logger الافتراضي، وهو بشكل افتراضي يملك نفس ضبطات في config.logger، وعندما تكون قيمة config.assets.logger تساوي false، فسيتوقّف تسجيل الأصول.
  • config.assets.quiet: يعطّل تسجيل طلبات الأصول، وهو true بشكل افتراضي في development.rb.

ضبط المولدات

يسمح لك ريلز بتغيير المولدات التي تُستخدم مع أسلوب config.generators، ويأخذ هذا الأسلوب كتلةً مثل:

config.generators do |g|
  g.orm :active_record
  g.test_framework :test_unit
end

هذه هي المجموعة الكاملة من الأساليب التي يمكن استخدامها في هذه الكتلة كالتالي:

  • assets: تسمح لك بإنشاء الأصول عند توليد السقالة (scaffold)، وهي true بشكل افتراضي.
  • force_plural: يسمح لك بوضع أسماء النموذج بصيغة الجمع، وهي false بشكل افتراضي.
  • helper: يعرّف ما إذا كان سيتم توليد المساعدين، وهو true بشكل افتراضي.
  • integration_tool: تعرّف ما هي أداة التكامل التي يمكن استخدامها لإنشاء اختبارات التكامل، وهي ‎:test_unit بشكل افتراضي.
  • system_tests: يعرّف الأداة التي يجب استخدامها لتوليد اختبارات النظام، وهي ‎:test_unit بشكل افتراضي.
  • javascripts: يشغّل الخطاف (hook) لملفات JavaScript في المولدات. ويُستخدم في ريلز عند عمل المولّد scaffold. قيمته الافتراضية هي: true.
  • javascript_engine: يضبط المحرّك المراد استخدامه (على سبيل المثال coffee) عند توليد الأصول، وهو بشكل افتراضي ‎:js.
  • orm: يعرّف أي تقنية ORM يراد استعمالها. القيمة الافتراضية هي false وسيستخدم بذلك السجل الفعال.
  • resource_controller: يعرّف المولّد الذي سيُستخدم لتوليد المتحكم عند استخدام rails generate resource ويساوي ‎:controller بشكل افتراضي.
  • resource_route: يعرّف ما إذا كان يجب توليد تعريف مسار المورد (resource) أو لا، وهو true بشكل افتراضي.
  • scaffold_controller: يختلف عن resource_controller، إذ يحدّد أي من المولدات سيُستخدم لتوليد متحكم ذي سقالة (scaffolded controller) عند استخدام rails generate scaffold وهو ‎:scaffold_controller بشكل افتراضي.
  • stylesheets: يشغّل الخطاف (hook) لأوراق الأنماط (stylesheets) في المولدات، ويُستخدم في ريلز عند عمل المولّد scaffold، لكن يمكن استخدام هذا الخطاف في مولدات أخرى كذلك، وهو true بشكل افتراضي.
  • stylesheet_engine: يضبط محرّك أوراق الأنماط (مثل sass) الذي يجب استخدامه عند توليد الأصول، وهو ‎:css بشكل افتراضي.
  • scaffold_stylesheet: ينشئ scaffold.css عند توليد مورد ذي سقالة (scaffolded controller)، وهو true بشكل افتراضي.
  • test_framework: يعرّف أي إطار اختبار يجب استخدامه، وهو false وسيستخدم Minitest بشكل افتراضي.
  • template_engine: يعرّف محرك القوالب المراد استخدامه، مثل ERB أو Haml، وهو ‎:erb بشكل افتراضي.

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

يأتي كل تطبيق ريلز مع مجموعة قياسيّة من البرامج الوسيطة (middleware) التي تُستخدم في هذا الترتيب في بيئة التطوير:

  • ActionDispatch::SSL: يفرض أن يُخدم كل طلب باستخدام HTTPS، وهو مفعّل إذا كان config.force_ssl يساوي true، ويمكن ضبط الخيارات الممرّرت إلى هذا عن طريق تعيين config.ssl_options.
  • ActionDispatch::Static: يُستخدم لخدمة الأصول الثابتة، وهو معطّل إذا كان config.public_file_server.enabled يساوي false. عيّن config.public_file_server.index_name إذا أردت تخديم ملف فهرس مجلد ثابت لا يسمى index، فعل سبيل المثال، لتخديم main.html بدلًا من index.html لطلبات المجلد. اضبط config.public_file_server.index_name إلى "main".
  • ActionDispatch::Executor: يسمح بإعادة تحميل شيفرة البرمجية الخاصة بالخيط، وهو معطّل إذا كان config.allow_concurrency يساوي false، مما يؤدي إلى تحميل Rack::Lock، ويلف هذا الأخير التطبيق في كائن المزامنة بحيث يمكن الاتصال به فقط بواسطة خيط واحد في كل مرّة.
  • ActiveSupport::Cache::Strategy::LocalCac يعمل كذاكرة تخزين أساسيّة لدعم ذاكرة التخزين المؤقت، وهذه الذاكرة ليست خيطًا آمنًا، وتعمل كذاكرة تخزين مؤقت للخيط الواحدة.
  • Rack::Runtime: يعيّن الترويسة X-Runtime التي تحتوي على الوقت (بالثواني) المنقضى لتنفيذ الطلب.
  • Rails::Rack::Logger: يخطر السجلات بأن الطلب قد بدأ. وبعد اكتمال الطلب، تُمسَح جميع السجلات.
  • ActionDispatch::ShowExceptions: ينقذ (rescues) أي استثناء يعاد من خلال التطبيق ويعرض صفحات استثناء لطيفة إذا كان الطلب محليًا أو إذا كان config.consider_all_requests_local يساوي true. وإذا كان الضبط config.action_dispatch.show_exceptions يساوي false، فسترمى الاستثناءات بصرف النظر عن ذلك.
  • ActionDispatch::RequestId: يجعل الترويسة X-Request-Id الفريدة متاحة إلى الاستجابة ويفعّل التابع ActionDispatch::Request.uuid.
  • ActionDispatch::RemoteIp يتحقق من هجمات انتحال IP ويحصل على client_ip صالح من ترويسات الطلبات، وهو قابل للضبط باستخدام الخيارين config.action_dispatch.ip_spoofing_check و config.action_dispatch.trusted_proxies.
  • Rack::Sendfile: يعالج الاستجابات التي يُخدَّم نصفها من ملف ويستبدله بالترويسة X-Sendfile الخاصة بالخادم. وهو قابل للضبط باستخدام config.action_dispatch.x_sendfile_header.
  • ActionDispatch::Callbacks يشغّل ردود النداء (callbacks) للتحضير قبل تخديم الطلب.
  • ActionDispatch::Cookies: يعيّن ملفات تعريف الإرتباط للطلب.
  • ActionDispatch::Session::CookieStore: هو المسؤول عن تخزين جلسة العمل في ملفات تعريف الارتباط، ويمكن استخدام وسيط بديل لهذا من خلال تغيير config.action_controller.session_store إلى قيمة بديلة. وبالإضافة إلى ذلك، يمكن تكون الخيارات الممرّرت باستخدام config.action_controller.session_options.
  • ActionDispatch::Flash: يُعدّ مفاتيح الوصول اللحظي (flash keys)، وهو متاح فقط في حالة تعيين config.action_controller.session_store إلى قيمة.
  • Rack::MethodOverride يسمح للأسلوب بإعادة كتابته (overridden) إذا عيّن params[:_method]‎، وتدعم هذه الوسيطة أنواع التوابع HTTP و PATCH وPUT و DELETE.
  • Rack::Head يحوّل طلبات HEAD إلى طلبات GET ويخدّمهم.

إلى جانب هذه البرمجيات الوسيطة المعتادة، يمكنك إضافة البرمجيات الوسيطة الخاصة بك باستخدام التابع config.middleware.use:

config.middleware.use Magical::Unicorns

سيضع هذا وسيطة Magical::Unicorns في نهاية المكدّس، يمكنك استخدام insert_before إذا كنت ترغب في إضافة برامج وسيطة قبل الأخرى.

config.middleware.insert_before Rack::Head, Magical::Unicorns

أو يمكنك إدراج وسيطة في موقع محدد باستخدام الفهارس، فعلى سبيل المثال، إذا كنت تريد إدراج وسيطة Magical::Unicorns في أعلى المكدّس، فيمكنك القيام بذلك كالتالي:

config.middleware.insert_before 0, Magical::Unicorns

هنالك أيضًا insert_after والتي تدرج الوسيطة بعد الأخرى:

config.middleware.insert_after Rack::Head, Magical::Unicorns

يمكن أيضًا تبديل الوسائط واستبدالها:

config.middleware.swap ActionController::Failsafe, Lifo::Failsafe

يمكنك أيضًا إزالتها من المكدس تمامًا:

config.middleware.delete Rack::MethodOverride

ضبط الواجهة البرمجية لتدويل ريلز (i18n)

يتم تفويض جميع خيارات الضبط إلى المكتبة I18n.

  • config.i18n.available_locales: تعرض القوائم البيضاء للمحليات (locale) المتوفّرة للتطبيق. وهي بشكل افتراضي لجميع مفاتيح المحليّة الموجودة في الملفات المحليّة، وهي في لاعادة ‎:en في التطبيق الجديد.
  • config.i18n.default_locale: تعيّن المحلي الافتراضي للتطبيق المستخدم في I18n، وهي بشكل افتراضي تساوي ‎:en.
  • config.i18n.enforce_available_locales: يضمن أن جميع المحليات التي مرّت عبر I18n قد أُعلن عنها في قائمة available_locales، وسيرمي الاستثناء I18n::InvalidLocale عند إعداد محلي غير متوفّر. وهي بشكل افتراضي true، ومن المستحسن عدم تعطيل هذا الخيار ما لم يكن مطلوبًا بشدّة، حيث يعمل هذا كمقياس أمان ضد تعيين أي محلي غير صالح من المدخلات المستخدم.
  • config.i18n.load_path: يعيّن المسار الذي يستخدمه ريلز للبحث عن الملفات المحليّة. وهي بشكل افتراضي تساوي config/locales/*.{yml,rb}‎.
  • config.i18n.fallbacks: يعيّن السلوك الاحتياطي للترجمات المفقودة. إليك ثلاثة أمثلة استخدام لهذا الخيار:
    • يمكنك تعيين الخيار على true لاستخدام المحلي الافتراضي:
config.i18n.fallbacks = true
    • أو يمكنك تعيين مجموعة من المحليات، كالتالي:
config.i18n.fallbacks = [:tr, :en]
    • أو يمكنك تعيين محليات اللجوء بشكل فردي، فعلى سبيل المثال، إذا أردت استخدام ‎:tr لـ ‎:az و ‎:de، و ‎:en لـ ‎:da كلجوء، فيمكنك فعل ذلك على طريق:
config.i18n.fallbacks = { az: :tr, da: [:de, :en] }
# أو
config.i18n.fallbacks.map = { az: :tr, da: [:de, :en] }

ضبط السجل الفعال

يتضمّن config.active_record مجموعة متنوّعة من خيارات الضبط:

  • config.active_record.logger: يقبل مسجلًا يتطابق مع الواجهة Log4r أو الصنف Logger الافتراضي الذي يخص روبي، والذي يمرر بعد ذلك إلى أي اتصالات قاعدة بيانات جديدة تم إنشاؤها. يمكنك استرداد هذا السجل من خلال استدعاء logger إما في صنف نموذج السجل الفعال أو في نسخة نموذج السجل الفعال. ويمكنك تعيينه إلى القيمة nil لتعطيل التسجيل.
  • config.active_record.primary_key_prefix_type: يتيح لك ضبط تسمية أعمدة المفاتيح الأساسيّة، افتراضيًا، يفترض ريلز أن أعمدة المفاتيح الأساسيّة تسمى id (وليس هنالك حاجة لتعيين هذا الخيار)، ويوجد خيارات آخران:
    • ‎:table_name: سيجعل المفتاح الرئيسي للصنف Customer هو customerid.
    • :table_name_with_underscore: سيجعل المفتاح الأساسي للصنف Customer هو customer_id.
  • config.active_record.table_name_prefix: يتيح لك تعيين سلسلة عامة (global) لارفاقها بأسماء الجداول. إذا قمت تعيين هذا الضبط إلى northwest_‎، فإن الصنف Customer سيبحث عن northwest_customers كجدول له. وبشكل افتراضي يساوي سلسلة نصيّة فارغة.
  • config.active_record.table_name_suffix: يتيح لك تعيين سلسلة عامة (global) لإلحاقها بأسماء الجداول. إذا قمت تعيين هذا الضبط إلى _northwest فإن الصنف Customer سيبحث عن customers_northwest كجدول له. وبشكل افتراضي يساوي سلسلة نصيّة فارغة.
  • config.active_record.schema_migrations_table_name: يتيح لك تعيين سلسلة نصيّة لاستخدامها كاسم جدول تهجيرات المخطط (schema migrations table).
  • config.active_record.internal_metadata_table_name: يتيح لك تعيين سلسلة نصيّة لاستخدامها كاسم جدول البيانات الأوليّة الداخلية.
  • config.active_record.protected_environments: يتيح لك تعيين مصفوفة من أسماء البيئات التي ينبعي فيها حظر الإجراءات المدمرة (destructive actions).
  • config.active_record.pluralize_table_names: يحدد ما إذا كان ريلز سيبحث عن أسماء الجداول المفردة أو الجمع في قاعدة البيانات. إذا تم تعيينه على true (الافتراضي)، فسيستخدم الصنف Customer الجدول customers وإذا كانت false، فسيستخدم الصنف Customer الجدول customer.
  • config.active_record.default_timezone: يحدد ما إذا كان سيُستخدم Time.local (إذا عيّن إلى القيمة :local) أو Time.utc (إذا عيّن إلى القيمة ‎:utc) عند سحب التواريخ والأوقات من قاعدة البيانات. القيمة الافتراضية لهذا الخيار هي ‎:utc.
  • config.active_record.schema_format: يتحكم في التنسيق من أجل تفريغ مخطط قاعدة البيانات إلى ملف. والخيارات هي ‎:ruby (الافتراضي) لإصدار مستقل لقاعدة البيانات يعتمد على عمليات التهجير، أو ‎:sql لمجموعة من تعليمات SQL (التي يمكن أن تعتمد على قاعدة البيانات).
  • config.active_record.error_on_ignored_order: يحدد ما إذا كان ينبغي رفع الخطأ إذا تم تجاهل ترتيب الاستعلام أثناء استعلام مجموعة واحدة. الخيارات هي true (رفع خطأ) أو false (تحذير)، وبشكل افتراضي تساوي false.
  • config.active_record.timestamped_migrations: تتحكم ما إذا كان يتم ترقيم عمليات التهجير باستخدام أرقام مسلسلة أو مع طوابع زمنيّة (timestamps). بشكل افتراضي تساوي true لاستخدام الطوابع الزمنية، والتي يفضل استخدامها إذا كان هنالك العديد من المطورين الذي يعملون على نفس التطبيق.
  • config.active_record.lock_optimistically: يتحكم ما إذا كان السجل الفعال سيستخدم القفل المستبشر (optimistic locking) أم لا. وهو true بشكل افتراضي.
  • config.active_record.cache_timestamp_format: يتحكم في تنسيق قيمة البصمة الزمنية (timestamp) في مفتاح ذاكرة التخزين المؤقت. وبشكل افتراضي يساوي :nsec.
  • config.active_record.record_timestamps: هو قيمة منطقيّة تتحكّم في ما إذا كان هنالك طابع زمني على عمليات الإنشاء والتحديث في نموذج. وهو بشكل افتراضي true.
  • config.active_record.partial_writes: هو قيمة منطقيّة وتتحكّم ما إذا كانت تُستخدم عمليات الكتابة الجزئية أم لا (بمعنى ما إذا كانت التحديثات تعيّن الخاصيات المتسخة [dirty]). لاحظ أنه عند استخدام عمليات الكتابة الجزئية، يجب عليك استخدام القفل المستبشر config.active_record.lock_optimistically نظرًا لأن التحديثات المتزامنة قد تكتب الخاصيات استنادًا إلى حالة قراءة تالفة. بشكل افتراضي يساوي true.
  • config.active_record.maintain_test_schema: هي قيمة منطقيّة تتحكم في ما إذا كان السجل الفعال يجب أن يحاول تحديث مخطط قاعدة بيانات الاختبار (test database schema) مع db/schema.rb (أو db/structure.sql) عند تشغيل الاختبارات. بشكل افتراضي يساوي true.
  • config.active_record.dump_schema_after_migration: هو راية تتحكّم في ما إذا كان يجب أن يحدث تفريغ المخطّط (db/schema.rb أو db/structure.sql) عند تشغيل عمليات التهجير. ويعيّن هذه الراية إلى القيمة false في config/environments/production.rb المنشئ بواسطة ريلز. والقيمة الافتراضيّة هي true إذا لم يعيّن هذا الضبط.
  • config.active_record.dump_schemas: يتحكّم في ما هي مخططات قاعدة البيانات التي ستفرّغ عند استدعاء db:structure:dump. الخيارات هي: :schema_search_path (وهو الافتراضي) والذي يفرّغ أي مخططات مدرجة في schema_search_path، :all الذي يفرّغ دائمًا جميع المخططات بغض النظر عن schema_search_path أو سلسلة نصيّة من المخططات المفصولة بفواصل.
  • config.active_record.belongs_to_required_by_default: هي قيمة منطقيّة تتحكّم في ما إذا كان السجل يفشل في التحقق (validation) إذا لم يكن هنالك ارتباط من النوع belongs_to (ارتباط انتماء).
  • config.active_record.warn_on_records_fetched_greater_than: يتيح تعيين حدًّا للتحذير من أجل حجم نتيجة الاستعلام. إذا تجاوز عدد السجلات التي تم إرجاعها بواسطة استعلام الحد المسموح، فسيُسجّل تحذير. ويمكن استخدام هذا الضبط لتحديد الاستعلامات التي تتسبب في حدوث تضخم في الذاكرة.
  • config.active_record.index_nested_attribute_errors: يسمح للأخطاء في الارتباطات has_many المتداخلة أن تُعرض مع فهرس بالإضافة إلى الخطأ. بشكل افتراضي يساوي false.
  • config.active_record.use_schema_cache_dump: يتيح للمستخدمين الحصول على معلومات التخزين المؤقت للمخطط من db/schema_cache.yml (المنشئ بواسطة bin/rails db:schema:cache:dump) بدلًا من الاضطرار إلى إرسال استعلام إلى قاعدة البيانات للحصول على هذه المعلومات. بشكل افتراضي يساوي true.

يضيف محوّل MySQL خيار ضبط إضافي آخر:

  • ActiveRecord::ConnectionAdapters::Mysql2Adapter.emulate_booleans: يتحكّم ما إذا السجل الفعال سيَعُدُّ جميع الأعمدة tinyint(1)‎ كقيم منطقيّة. بشكل افتراضي يساوي true.

يضيف محوّل SQLite3Adapter خيار ضبط إضافي آخر:

  • ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer: يشير ما إذا ما إذا كانت القيم المنطقية المخزنة في قواعد بيانات sqlite3 ستُمثَّل بالشكل 1 و 0 أو 't' و 'f'. ترك الضبط ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer معيَّنًا للقيمة false قد أُهمِل. لقد استخدمت قواعد بيانات SQLite التمثيل 't' و 'f' لسلسلة القيم المنطقيّة ويجب أن تحتوي على البيانات القديمة بعد تحويلها إلى 1 و0 (التسلسل المنطقي الأصلي) وقبل تعيين هذه الراية إلى true. ويمكن التحويل عن طريق إعداد مهمة Rake التي تشغّل:
ExampleModel.where("boolean_column = 't'").update_all(boolean_column: 1)
ExampleModel.where("boolean_column = 'f'").update_all(boolean_column: 0)

لجميع النماذج وجميع الأعمدة المنطقيّة، يجب بعدها تعيين هذه الراية إلى القيمة true بإضافة ما يلي إلى الملف application.rb:

```ruby
Rails.application.config.active_record.sqlite3.represent_boolean_as_integer = true
```

يضيف مفرّغ المخطط (schema dumper) خيار ضبط إضافي آخر:

  • ActiveRecord::SchemaDumper.ignore_tables: يقبل مصفوفة من الجداول التي لا يجب تضمينها في أي ملف مخطط تم إنشاؤه.

ضبط إجراء التحكم (Action Controller)

يتضمّن config.action_controller عددًا من إعدادات الضبط هي:

  • config.action_controller.asset_host: يعيّن المضيف للأصول، وهو مفيد عند استخدام CDN لاستضافة الأصول بدلًا من خادم التطبيق نفسه.
  • config.action_controller.perform_caching: يضبط ما إذا كان يجب أن ينفذ التطبيق ميزات التخزين المؤقت التي يوفرها مكون متحكم الإجراء أو لا. وقيمته false في وضع التطوير و true في وضع الإنتاج.
  • config.action_controller.default_static_extension: يضبط اللاحقة المستخدمة في صفحات التخزين المؤقت. وهي بشكل افتراضي ‎.html.
  • config.action_controller.include_all_helpers: يضبط ما إذا كان جميع مساعدي العروض متوفرين في كل مكان أو تحديد نطاقها إلى المتحكم المقابل. في حالة تعيين هذا الضبط إلى القيمة false، فستكون توابع UsersHelper متوفّرة فقط لعروض المصيَّرة كجزء من المتحكم UsersController. وإذا كان true، فإن توابع UsersHelper ستكون متوفّرة في كل مكان، وإن سلوك الضبط الافتراضي (عندما لا يعيّن هذا الخيار بشكل صريح كـ true أو false) هو أن كافة مساعدي العروض متوفّرة لكل متحكّم.
  • config.action_controller.logger: يقبل مسجلًا مطابقًا للواجهة Log4r أو صنف روبي Logger الافتراضي، والذي يُستخدم بعد ذلك لتسجيل المعلومات من متحكم الإجراء. اضبطه إلى nil لتعطيل التسجيل.
  • config.action_controller.request_forgery_protection_token: يعيّن اسم معامل الرمز (token parameter name) من أجل RequestForgery. وإن استدعاء protect_from_forgery يعيّن هذا الضبط إلى :authenticity_token بشكل افتراضي.
  • config.action_controller.allow_forgery_protection: يفعّل أو يعطّل حماية CSRF. وهو بشكل افتراضي false في وضع الاختبار و true في جميع الأوضاع الأخرى.
  • config.action_controller.forgery_protection_origin_check: يضبط ما إذا كان يجب التحقق من الترويسة Origin في طلبيات HTTP ضد أصل الموقع (site's origin) كدفاع إضافي من هجمات CSRF.
  • config.action_controller.per_form_csrf_tokens: يضبط ما إذا كانت رموز CSRF صالحة فقط للتابع/الإجراء الذي تم إنشاؤه له.
  • config.action_controller.default_protect_from_forgery: يحدد إضافة حماية التزوير على ActionController:Base، وهو false بشكل افتراضي، ولكنه مفعّل عند تحميل الإعدادات الافتراضيّة للإصدار 5.2 من ريلز.
  • config.action_controller.relative_url_root: يمكن استخدامه لإخبار ريلز أنك تنشر تطبيقك إلى مجلد فرعي. بشكل افتراضي يساوي ENV['RAILS_RELATIVE_URL_ROOT']‎.
  • config.action_controller.permit_all_parameters: يعيّن السماح لجميع المعاملات بالتعيين الشامل بشكل افتراضي. القيمة الافتراضية هي false.
  • config.action_controller.action_on_unpermitted_parameters: يفعّل التسجيل أو رفع استثناء إذا تم العثور على معاملات غير مسموح بها بشكل صريح. استعمل ‎:log أو ‎:raise لكل حالة على التوالي. القيمة الافتراضيّة هي ‎:log في أوضاع التطوير والاختبار، و false في جميع الأوضاع الأخرى.
  • config.action_controller.always_permitted_parameters: تعيّن قائمة بالمعاملات المسموح بها بشكل افتراضي. القيم الافتراضيّة هي ['controller', 'action']
  • config.action_controller.enable_fragment_cache_logging: يحدد ما إذا كان سيتم تسجيل أجزاء القراءة والكتابة لذاكرة التخزين المؤقت بشكل مفصل كالتالي:
Read fragment views/v1/2914079/v1/2914079/recordings/70182313-20160225015037000000/d0bdf2974e1ef6d31685c3b392ad0b74 (0.6ms)
Rendered messages/_message.html.erb in 1.2 ms [cache hit]
Write fragment views/v1/2914079/v1/2914079/recordings/70182313-20160225015037000000/3b4e249ac9d168c617e32e84b99218b5 (1.1ms)
Rendered recordings/threads/_thread.html.erb in 1.5 ms [cache miss]

افتراضيًا، يتم تعيينه إلى القيمة false مما ينتج عنه المخرجات التالية:

```
Rendered messages/_message.html.erb in 1.2 ms [cache hit]
Rendered recordings/threads/_thread.html.erb in 1.5 ms [cache miss]
```

ضبط إجراء الإرسال (Action Dispatch)

  • config.action_dispatch.session_store: يعيّن اسم المخزن المراد تخزين بيانات الجلسة فيه. وهو بشكل افتراضي :cookie_store وتتضمن الخيارات الصالحة الأخرى :active_record_store أو :mem_cache_store أو اسم الصنف المخصص الخاص بك.
  • config.action_dispatch.default_headers: هو جدول Hash مع ترويسات HTTP التي تم تعيينها بشكل افتراضي في كل استجابة. بشكل افتراضي، معرّفة على أنها:
config.action_dispatch.default_headers = {
  'X-Frame-Options' => 'SAMEORIGIN',
  'X-XSS-Protection' => '1; mode=block',
  'X-Content-Type-Options' => 'nosniff',
  'X-Download-Options' => 'noopen',
  'X-Permitted-Cross-Domain-Policies' => 'none',
  'Referrer-Policy' => 'strict-origin-when-cross-origin'
}
  • config.action_dispatch.default_charset: يحدد مجموعة المحارف الافتراضيّة لكافة عمليات التصيير. يساوي nil بشكل افتراضي.
  • config.action_dispatch.tld_length: يعيّن طول TLD (نطاق المستوى الأعلى [top-level domain]) للتطبيق، وهو 1 بشكل افتراضي.
  • config.action_dispatch.ignore_accept_header: يُستخدم لتحديد ما إذا كان ستتجاهل قبول ترويسات من الطلب، وهو بشكل افتراضي false.
  • config.action_dispatch.x_sendfile_header: يحدد الترويسة X-Sendfile المخصصة لخادم معين. وهو مفيد لتسريع إرسال الملفات من الخادم، على سبيل المثال، يمكن تعيينه إلى القيمة 'X-Sendfile' لخادم أباتشي.
  • config.action_dispatch.http_auth_salt: يحدد القيمة الزائدة (salt value) لمصادقة طلبيات HTTP. وهي بشكل افتراضي 'http authentication'.
  • config.action_dispatch.signed_cookie_salt: يعيّن القيمة الزائدة (salt value) لملفات تعريف الارتباط الموقعة، وهو يساوي بشكل افتراضي 'signed cookie'.
  • config.action_dispatch.encrypted_cookie_salt: يعيّن القيمة الزائدة (salt value) لملفات تعريف الارتباط المشفّرة. وهو يساوي بشكل افتراضي 'encrypted cookie'.
  • config.action_dispatch.encrypted_signed_cookie_salt: يعيّن القيمة الزائدة (salt value) لملفات تعريف الارتباط الموقعة والمشفّرة. وهو يساوي بشكل افتراضي 'signed encrypted cookie'.
  • config.action_dispatch.authenticated_encrypted_cookie_salt: يعيّن القيمة الزائدة لملفات تعريف الارتباط المصادق عليها والمشفّرة. وهو يساوي بشكل افتراضي 'authenticated encrypted cookie'.
  • config.action_dispatch.encrypted_cookie_cipher: يعيّن التشفير المراد استخدامه في ملفات تعريف الارتباط المشفّرة. وهو بشكل افتراضي "aes-256-gcm".
  • config.action_dispatch.signed_cookie_digest: يعيّن خوارزمية التشفير للقيم المختصرة المشفرة (digest) المراد استخدامها في ملفات تعريف الارتباط الموقعة. وهو "SHA1" بشكل افتراضي.
  • config.action_dispatch.cookies_rotations: يسمح بتدوير الأسرار، والتشفيرات، والقيم المشفرة المختصرة لملفات تعريف الارتباط المشفّرة والموقعة.
  • config.action_dispatch.use_authenticated_cookie_encryption: يتحكّم ما إذا كانت ملفات تعريف الارتباط المشفّرة والموقعة تستخدم التشفير AES-256-GCM أو التشفير AES-256-CBC القديم. وهو true بشكل افتراضي.
  • config.action_dispatch.perform_deep_munge: يضبط ما إذا كان يجب تنفيذ التابع deep_munge على المعاملات. انظر دليل الأمن لمزيد من المعلومات. القيمة الافتراضية لهذا الضبط هي true.
  • config.action_dispatch.rescue_responses: يضبط الاستثناءات التي عيّنت لحالة HTTP، وهي تقبل جدول hash ويمكنك تحديد أزواج من استثناء/حالة. وهو بشكل افتراضي معرّف على أنه:
config.action_dispatch.rescue_responses = {
  'ActionController::RoutingError'               => :not_found,
  'AbstractController::ActionNotFound'           => :not_found,
  'ActionController::MethodNotAllowed'           => :method_not_allowed,
  'ActionController::UnknownHttpMethod'          => :method_not_allowed,
  'ActionController::NotImplemented'             => :not_implemented,
  'ActionController::UnknownFormat'              => :not_acceptable,
  'ActionController::InvalidAuthenticityToken'   => :unprocessable_entity,
  'ActionController::InvalidCrossOriginRequest'  => :unprocessable_entity,
  'ActionDispatch::Http::Parameters::ParseError' => :bad_request,
  'ActionController::BadRequest'                 => :bad_request,
  'ActionController::ParameterMissing'           => :bad_request,
  'Rack::QueryParser::ParameterTypeError'        => :bad_request,
  'Rack::QueryParser::InvalidParameterError'     => :bad_request,
  'ActiveRecord::RecordNotFound'                 => :not_found,
  'ActiveRecord::StaleObjectError'               => :conflict,
  'ActiveRecord::RecordInvalid'                  => :unprocessable_entity,
  'ActiveRecord::RecordNotSaved'                 => :unprocessable_entity
}

سيُعيّن أي استثناء لم يُضبَط إلى الخطأ 500 الداخلي في الخادم (Internal Server Error).

  • ActionDispatch::Callbacks.before: تأخذ كتلة من التعليمات البرمجيّة لتشغيلها قبل الطلب.
  • ActionDispatch::Callbacks.after: تأخذ كتلة من التعليمات البرمجيّة لتشغيلها بعد الطلب.

ضبط إجراء العرض

يتضمن config.action_view مجموعة صغيرة من إعدادات الضبط:

  • config.action_view.cache_template_loading: يتحكّم في ما إذا كان يجب إعادة تحميل القوالب في كل طلب أو لا. القيمة الافتراضية لهذا الضبط هي نفس القيمة التي ضُبَط في config.cache_classes.
  • config.action_view.field_error_proc: يوفّر مولّد HTML لعرض الأخطاء التي تأتي من نموذج فعال (Active Model)، وهو بشكل افتراضي:
Proc.new do |html_tag, instance|
  %Q(<div class="field_with_errors">#{html_tag}</div>).html_safe
end
  • config.action_view.default_form_builder: يخبر ريلز أي باني نموذج يراد استخدامه بشكل افتراضي. القيمة الافتراضية له هي ActionView::Helpers::FormBuilder. إذا أردت تحميل صنف باني النموذج بعد التهيئة (لكي يعاد تحميله على كل طلب قيّد التطوير)، يمكنك تمريره كسلسة نصيّة.
  • config.action_view.logger: يقبل مسجل يتطابق مع الواجهة Log4r أو صنف روبي Logger الافتراضي، والذي يُستخدَم بعد ذلك لتسجيل المعلومات من إجراء العرض. اضبطه إلى القيمة nil لتعطيل التسجيل.
  • config.action_view.erb_trim_mode: يسمح باستخدام الوضع trim من قبل ERB. وهو بشكل افتراضي "-"، والذي يعمل على تشذيب مسافات التذييل والسطر الجديد عند استخدام <‎%= -%‎> أو <%= =%>. راجع توثيق Erubis لمزيد من المعلومات.
  • config.action_view.embed_authenticity_token_in_remote_forms: يسمح لك بتعيين السلوك الافتراضي لـ authenticity_token في النماذج مع remote:true. وهو false بشكل افتراضي، مما يعني أن النماذج البعيدة لن تتضمن authenticity_token وهو أمر مفيد عندما تخزّن أجزاء النموذج بشكل مؤقت في الذاكرة. تحصل النماذج البعيدة على المصادقة من الوسم <meta>، لذلك لا يكون الدمج ضروريًا إلا إذا رغبت بدعم المتصفحات بدون JavaScript. وفي مثل هذه الحالة، يمكنك تمرير authenticity_token: true كخيار النموذج أو تعيين خيار الضبط هذا إلى القيمة true.
  • config.action_view.prefix_partial_path_with_controller_namespace: يحدَّد ما إذا كان يتم البحث عن أجزاء من مجلد فرعي أم لا في القوالب المصيَّرة من متحكمات مجالات الأسماء. فعلى سبيل المثال، افترض وجود متحكم يسمى Admin::ArticlesController الذي يصيِّر هذا القالب:
<%= render @article %>

الإعداد الافتراضي هو true، والذي يستخدم الجزئية الموجودة في ‎/admin/articles/_article.erb، وعند تعيين القيمة إلى false فسيُصيَّر ‎/articles/_article.erb والذي هو نفس السلوك التصيير من متحكم ليس من مجال الاسم مثل ArticlesController.

  • config.action_view.raise_on_missing_translations: يحدد ما إذا كان يجب رفع خطأ للتحويلات المفقودة.
  • config.action_view.automatically_disable_submit_tag: يحدد ما إذا كان يجب تعطيل submit_tag (وسم الإرسال) عند النقر. وهو بشكل افتراضي true.
  • config.action_view.debug_missing_translation: يحدد ما إذا كان سيغلف مفتاح التحويلات المفقودة في الوسم <span> أو لا. وهو true بشكل افتراضي.
  • config.action_view.form_with_generates_remote_forms: يحدد ما إذا كان form_with يولّد نماذج عن بعد أم لا، وهو true بشكل افتراضي.
  • config.action_view.form_with_generates_ids: يحدد ما إذا كان form_with يولد معرفات على المدخلات، وهو true بشكل افتراضي.

ضبط إجراء المراسلة

هنالك عدد من الإعدادات المتاحة في الضبط config.action_mailer:

  • config.action_mailer.logger: يقبل مسجلًا مطابقًا للواجهة Log4r أو صنف روبي Logger الافتراضي، والذي يُستخدم بعد ذلك لتسجيل المعلومات من إجراء المراسلة. اضبطه إلى القيمة nil لتعطيل التسجيل.
  • config.action_mailer.smtp_settings: يتيح ضبط تابع التسليم :smtp ضبطًا تفصيليًّا. وهو يقبل جدول hash من الخيارات، والتي يمكن أن تشمل أي من الخيارات التالية:
    • ‎:address - يسمح لك باستخدام خادم بريد بعيد. كل ما عليك فعله هو تغيير إعداد "localhost" الافتراضي.
    • ‎:port - في حالة عدم عمل خادم البريد الخاص على المنفذ 25، يمكنك تغييره.
    • :domain - إذا أردت تحديد نطاق HELO، فيمكنك القيام بذلك هنا.
    • ‎:user_name - إذا كان خادم البريد الخاص بك يتطلّب الاستيثاق، فعيّن اسم المستخدم في هذا الخيار.
    • ‎:password - إذا كان خادم البريد الخاص بك يتطلّب المصادقة، فعيّن كلمة المرور في هذا الإعداد.
    • ‎:authentication - إذا كان خادم البريد الخاص بك يتطلّب الاستيثاق، فعليك تحديد نوع الاستيثاق هنا. وهو رمز ويأخذ إحدى القيم التالية: :plain، :login، :cram_md5.
    • ‎‎:enable_starttls_auto - يكتشف ما إذا تم تمكين STARTTLS في خادم SMTP الخاص بك ويبدأ في استخدامه. وهو true بشكل افتراضي.
    • ‎:openssl_verify_mode - عند استخدام TLS، يمكنك ضبط كيفية قيام OpenSSL بالتحقق من الشهادة، وهذا مفيد إذا أردت التحقق من صحة شهادة self-signed أو/و wildcard. يمكن أن يكون هذا أحد ثوابت التحقق من OpenSSL وهي :none أو :peer أو الثابت OpenSSL::SSL::VERIFY_NONE أو OpenSSL::SSL::VERIFY_PEER على التوالي.
    • ‎:ssl/:tls - لتمكين اتصال SMTP ليستخدم SMTP/TLS (أي SMTPS: SMTP عبر اتصال TLS مباشر).
  • config.action_mailer.sendmail_settings: يسمح بضبط مفصّل لتابع التسليم sendmail، وهو تقبل جدول Hash من الخيارات، والذي يمكن أن يحوي أي من الخيارات التالية:
    • ‎:location - موقع sendmail التنفيذي، وهو بشكل افتراضي ‎/usr/sbin/sendmail.
    • :arguments - معاملات سطر الأوامر، بشكل افتراضي يساوي ‎-i.
  • config.action_mailer.raise_delivery_errors: يحدد ما إذا كان سيُرفع خطأ في تعذّر إكمال تسليم البريد الإلكتروني، وهو true بشكل افتراضي.
  • config.action_mailer.delivery_method: يحدد تابع التسليم وهو :smtp بشكل افتراضي. راجع قسم الضبط في دليل إجراء المراسلة للمزيد من المعلومات.
  • config.action_mailer.perform_deliveries: يحدد إذا كان البريد سيُسلّم بالفعل وهو true بشكل افتراضي. ومن المستحسن تعيينه إلى القيمة false للاختبار.
  • config.action_mailer.default_options: يضبط الإعدادات الافتراضيّة لإجراء المراسلة بشكل افتراضي، ويُستخدم لتعيين خيارات مثل from أو reply_to لكل إجراء مراسلة، وهو افتراضي إلى:
mime_version:  "1.0",
charset:       "UTF-8",
content_type: "text/plain",
parts_order:  ["text/plain", "text/enriched", "text/html"]

أسند إليه جدول hash لتعيين خيارات إضافيّة:

config.action_mailer.default_options = {
  from: "noreply@example.com"
}
  • config.action_mailer.observers: مراقبي السجل الذين سيتم إبلاغهم عند تسليم البريد.
config.action_mailer.observers = ["MailObserver"]
  • config.action_mailer.interceptors: معترضات السجل والتي سيتم استدعاؤها قبل ارسال البريد.
config.action_mailer.interceptors = ["MailInterceptor"]
  • config.action_mailer.preview_path: يحدد موقع معاينات البريد الالكتروني.
config.action_mailer.preview_path = "#{Rails.root}/lib/mailer_previews"
  • config.action_mailer.show_previews: يفعّل أو يعطّل معاينات البريد، وهو true بشكل افتراضي في وضع التطوير.
config.action_mailer.show_previews = false
  • config.action_mailer.deliver_later_queue_name: يحدد اسم الطابور (queue) للمرسلين، وهو بشكل افتراضي mailers.
  • config.action_mailer.perform_caching: يحدد ما إذا كان يجب أن تقوم قوالب الإرسال بإجراء تخزين مؤقت للأجزاء أو لا. وهو false بشكل افتراضي في جميع البيئات.

ضبط الدعم الفعال

هنالك عدة خيارات ضبط متاحة في الدعم الفعال:

  • config.active_support.bare: يفعّل أو يعطّل تحميل active_support/all عند تشغيل ريلز. وهو nil بشكل افتراضي، مما يعني أن active_support/all ستكون مُحمَّلَة.
  • config.active_support.test_order: يعيّن الترتيب الذي من خلاله تنفّذ حالات الاختبار. القيم المحتملة هي :random و ‎:sorted. قيمته الافتراضية هي :random.
  • config.active_support.escape_html_entities_in_json: يفعّل أو يعطّل تهريب كيانات HTML في سَلسَلة JSON. وهو true بشكل افتراضي.
  • config.active_support.use_standard_json_time_format: يفعّل أو يعطّل سلسلة التواريخ إلى تنسيق ISO 8601. وهو true افتراضيًا.
  • config.active_support.time_precision: يعيّن دقة قيمة الوقت التي تم ترميزها. وهو 3 افتراضيًا.
  • config.active_support.use_sha1_digests: يحدد ما إذا كنت ستستخدم الخوارزمية SHA-1 بدلًا من MD5 لتوليد القيم المختصرة المشفرة غير الحساسة، مثل الترويسة ETag. القيمة الافتراضية هي false.
  • config.active_support.use_authenticated_message_encryption: يحدد ما إذا كان سيُستخدم تشفير الاستيثاق AES-256-GCM كتشفير افتراضي لتشفير الرسائل بدلًا من AES-256-CBC. هو false افتراضيًا لكنه يصبح true عند تحميل الإعدادات الافتراضيّة من أجل الإصدار 5.2 من ريلز.
  • ActiveSupport::Logger.silencer: يعيّن false لتعطيل القدرة على إسكات التسجيل في كتلة، وهو true افتراضيًا.
  • ActiveSupport::Cache::Store.logger: يحدد المسجل لاستخدامه داخل عمليات التخزين في ذاكرة التخزين المؤقتة.
  • ActiveSupport::Deprecation.behavior: أداة ضبط بديلة لـ config.active_support.deprecation الذي يضبط سلوك تحذيرات الإهمال في ريلز.
  • ActiveSupport::Deprecation.silence: يأخذ كتلة يتم فيها إسكات كافة تحذيرات الإهمال.
  • ActiveSupport::Deprecation.silenced: يعيّن ما إذا كان ستعرض تحذيرات الإهمال أو لا.

ضبط الوظيفة الفعالة

يوفّر config.active_job خيارات الضبط التاليّة:

  • config.active_job.queue_adapter: يعيّن المحوّل لواجهة الطابور الخلفية (queueing backend). إن المحوّل الافتراضي هو :async. للحصول على قائمة محدّثة من المحولات المضمنة، راجع وثائق واجهة برمجة التطبيقات لـ ActiveJob::QueueAdapters.
# Gemfile تأكد من تضمين جوهرة المحول في الملف
# واتبع خطوات تثبيت المحول المحددة وتعليمات
# النشر
config.active_job.queue_adapter = :sidekiq
  • config.active_job.default_queue_name: يمكن استخدامه لتغيير اسم قائمة الطابور الافتراضيّة والذي هو "default" افتراضيًا.
config.active_job.default_queue_name = :medium_priority
  • config.active_job.queue_name_prefix: يسمح لك بتعيين بادئة اسم اختياريّة غير فارغة للطابور من أجل جميع الوظائف. القيمة الافتراضية فارغة وغير مستعملة.

يعمل الضبط التالي على ترتيب وظيفة محددة في طابور production_high_priority عند تشغيله في الإنتاج:

config.active_job.queue_name_prefix = Rails.env
class GuestsCleanupJob < ActiveJob::Base
  queue_as :high_priority
  #....
end
  • config.active_job.queue_name_delimiter: يملك القيمة الافتراضيّة '_'. إذا عُيّنَت قيمة للخيار queue_name_prefix، فإن queue_name_delimiter سيرتبط باسم الطابور الذي يملك بادئة والذي لا يملكها.

سيضع الضبط التالي الوظيفة المعروضة في الطابور video_server.low_priority:

# لكي تُستخدَم delimiter يجب ضبط السابقة من أجل المحدد
config.active_job.queue_name_prefix = 'video_server'
config.active_job.queue_name_delimiter = '.'
class EncoderJob < ActiveJob::Base
  queue_as :low_priority
  #....
end
  • config.active_job.logger: يقبل مسجلًا مطابقًا للواجهة Log4r أو صنف روبي Logger الافتراضي، والذي سيُستخدم بعد ذلك لتسجيل المعلومات من الوظيفة الفعالة. يمكنك استرداد هذا السجل عن طريق استدعاء logger على أي صنف وظيفة فعالة أو نسخة من الوظيفة الفعالة. اضبطه إلى القيمة nil لتعطيل التسجيل.

ضبط إجراء الربط

  • config.action_cable.url: يقبل سلسلة نصيّة للعنوان URL الخاص بالمكان الذي تستضيف فيه خادم إجراء الربط. يمكنك استخدام هذا الخيار إذا كنت تشغّل خوادم إجراء الربط المنفصلة عن التطبيق الرئيسي.
  • config.action_cable.mount_path: يقبل سلسلة نصيّة لمكان وصل إجراء الربط، كجزء من عملية الخادم الرئيسيّة. وهو يساوي بشكل افتراضي ‎/cable ويمكنك تعيينه إلى القيمة nil حتى لا يوصل (mount) إجراء الربط كجزء من خادم ريلز العادي.

ضبط التخزين الفعال

يوفّر config.active_storage خيارات الضبط التالية:

  • config.active_storage.analyzers: يقبل مصفوفة من الأصناف التي تشير إلى المحللات (analyzers) المتاحة من أجل كائنات البيانات الثنائية للتخزين الفعال (Active Storage blobs). يساوي افتراضيًّا إلى [ActiveStorage::Analyzer::ImageAnalyzer, ActiveStorage::Analyzer::VideoAnalyzer]. هذا الأول يمكنه استخراج عرض وارتفاع لكائن بيانات ثنائية لفيديو (image blob)، ويمكن للأخير استخلاص العرض والارتفاع والمدة والزاوية ونسبة العرض إلى الإرتفاع لكائن بيانات ثنائية لفيديو (video blob).
  • config.active_storage.previewers: يقبل مصفوفة من الأصناف التي تشير إلى معاينات الصور المتوفرة في كائنات البيانات الثنائية للتخزين الفعال. وهو بشكل افتراضي [ActiveStorage::Previewer::PDFPreviewer, ActiveStorage::Previewer::VideoPreviewer]. يمكن للأول أن يولّد صورة مصغّرة من الصفحة الأولى من كائن بيانات ثنائية لملف PDF (أي PDF blob) وأما الأخير فمن الإطار المناسب لكائن بيانات ثنائية لفيديو (video blob).
  • config.active_storage.paths: يقبل جدول hash من الخيارات التي تشير إلى مواقع أوامر previewer/analyzer. وهو يساوي بشكل افتراضي إلى {}، مما يعني أنه سيبحث عن الاوامر في المسار الافتراضي. ويمكن أن يتضمّن أيًا من هذه الخيارات:
    • :ffprobe - موقع الملف ffprobe التنفيذي.
    • :mutool - موقع الملف mutool التنفيذي.
    • :ffmpeg - موقع الملف ffmpeg التنفيذي.
config.active_storage.paths[:ffprobe] = '/usr/local/bin/ffprobe'
  • config.active_storage.variable_content_types: يقبل مصفوفة من السلاسل النصيّة التي تشير إلى أنواع المحتوى التي يمكن للتخزين الفعال تحويلها من خلال ImageMagick. وهو بشكل افتراضي يساوي %w(image/png image/gif image/jpg image/jpeg image/vnd.adobe.photoshop image/vnd.microsoft.icon)‎.
  • config.active_storage.content_types_to_serve_as_binary: يقبل مصفوفة من السلاسل النصية التي تشير إلى أنواع المحتوى التي سيخدمها التخزين الفعال دائمًا كمُرفق (attachment)، بدلًا من مضمَّن (inline). وهو بشكل افتراضي يساوي %w(text/html text/javascript image/svg+xml application/postscript application/x-shockwave-flash text/xml application/xml application/xhtml+xml)‎.
  • config.active_storage.queue: يمكن أن يُستخدم لتعيين اسم طابور الوظيفة الفعالة المستخدمة لأداء مهام مثل تحليل محتوى كائن بيانات ثنائية أو تطهير مدوّنة.
config.active_storage.queue = :low_priority
  • config.active_storage.logger: يمكن أن يُستخدم لتعيين أداة التسجيل التي يستخدمها السجل الفعال، وهو يقبل مسجلًا يتطابق مع الواجهة Log4r أو مع صنف روبي Logger الافتراضي.
config.active_storage.logger = ActiveSupport::Logger.new(STDOUT)

ضبط قاعدة البيانات

بما أن كل تطبيق ريلز تقريبًا سيتصل بقاعدة بيانات، فيمكنك الاتصال بقاعدة البيانات عن طريق تحديد متغيّر البيئة ENV['DATABASE_URL']‎ أو باستخدام ملف ضبط يسمى config/database.yml.

ويمكنك باستخدام الملف config/database.yml تحديد جميع المعلومات اللازمة للوصول إلى قاعدة بياناتك:

development:
  adapter: postgresql
  database: blog_development
  pool: 5

سيتصل هذا بقاعدة بيانات تدعى blog_development باستخدام المحوّل postgresql، ويمكن تخزين هذه المعلومات نفسها في عنوان URL وتوفيرها عبر متغير البيئة كالتالي:

> puts ENV['DATABASE_URL']
postgresql://localhost/blog_development?pool=5

يحتوي الملف config/database.yml على أقسام لثلاث بيئات مختلفة يمكن تشغيل ريلز فيها افتراضيًا:

  • تُستخدم بيئة التطوير في الموقع development/local في حاسوبك أثناء تفاعلك يدويًا مع التطبيق.
  • تُستخدم بيئة الاختبار عند تشغيل الاختبارات التلقائيّة.
  • تُستخدم بيئة الإنتاج عند نشر التطبيق الخاص بك حتى يستخدمه الجميع.

إذا أردت، فيمكنك تحديد عنوان URL داخل الملف config/database.yml.

development:
  url: postgresql://localhost/blog_development?pool=5

يمكن أن يحتوي الملف config/database.yml على وسوم ERB مثل <‎%= %‎> وسيقيّم أي شيء داخل هذه الوسوم على أنه شيفرة روبي، ويمكنك استخدام هذا لسحب البيانات من متغيّر بيئة أو لإجراء العمليات الحسابيّة لإنشاء معلومة الاتصال المطلوبة.

تنبيه: لا تحتاج إلى تحديث ضبط قاعدة البيانات يدويًا. إذا نظرّت إلى خيارات مولّد التطبيق، سترى أن أحد هذه الخيارات يدعى ‎--database، ويسمح لك هذا باختيار محوّل من قائمة قواعد البيانات العلائقيّة الأكثر استخدامًا، ويمكنك حتى تشغيل المولّد بشكل متكرّر: cd .. && rails new blog --database=mysql. وعند تأكيد الكتابة فوق الملف config/database.yml، سيُضبَط التطبيق من أجل MySQL بدلًا من SQLite وستجد في ما يلي أمثلة تفصيليّة لاتصالات قواعد البيانات الشائعة.

تفضيلات الاتصال

نظرًا لوجود طريقتين لضبط الاتصال (باستخدام config/database.yml أو باستخدام متغيّر البيئة)، فمن المهم فهم كيفية تفاعلهما.

إذا كان لديك الملف config/database.yml وكان فارغًا لكن كان متغير البيئة ENV['DATABASE_URL']‎ موجودًا، فسيتصل ريلز بقاعدة البيانات عبر متغيّر البيئة الخاص بك:

$ cat config/database.yml
 
$ echo $DATABASE_URL
postgresql://localhost/my_database

إذا كان لديك الملف config/database.yml ولم يكن لديك متغير البيئة ENV['DATABASE_URL']‎، فسيُستخدم هذا الملف للاتصال بقاعدة البيانات الخاصة بك:

$ cat config/database.yml
development:
  adapter: postgresql
  database: my_database
  host: localhost
 
$ echo $DATABASE_URL

إذا كان لديك كلًا من الملف config/database.yml ومتغير البيئة ENV['DATABASE_URL']‎ المضبوطين، فسيدمج ريلز الضبط معًا. ولفهم هذا بشكل أفضل، يجب أن نرى بعض الأمثلة. عندما تتكرر معلومات الاتصال، سيأخذ متغيّر البيئة الأولويّة:

$ cat config/database.yml
development:
  adapter: sqlite3
  database: NOT_my_database
  host: localhost
 
$ echo $DATABASE_URL
postgresql://localhost/my_database
 
$ bin/rails runner 'puts ActiveRecord::Base.configurations'
{"development"=>{"adapter"=>"postgresql", "host"=>"localhost", "database"=>"my_database"}}

هنا يتطابق adapter و host و database مع المعلومات المتوفّرة في ENV['DATABASE_URL']‎. إذا تم توفير معلومات غير مكرّرة، فستُؤخَذ جميع القيم الفريدة بالحسبان، وسيأخذ متغيّر البيئة الأسبقيّة في حالة حدوث أي تعارضات.

$ cat config/database.yml
development:
  adapter: sqlite3
  pool: 5
 
$ echo $DATABASE_URL
postgresql://localhost/my_database
 
$ bin/rails runner 'puts ActiveRecord::Base.configurations'
{"development"=>{"adapter"=>"postgresql", "host"=>"localhost", "database"=>"my_database", "pool"=>5}}

بما أن pool ليس في المعلومات المقدمّة في ENV['DATABASE_URL']‎، فستدمج معلوماته، وبما أن adapter مكرّر، فستُؤخَذ معلومات اتصال من ENV['DATABASE_URL']‎. تتمثّل الطريقة الوحيدة لعدم استخدام معلومات الاتصال بشكل صريح في ENV['DATABASE_URL']‎ في تحديد اتصال URL صريح باستخدم المفتاح الفرعي "url":

$ cat config/database.yml
development:
  adapter: sqlite3
  pool: 5
 
$ echo $DATABASE_URL
postgresql://localhost/my_database
 
$ bin/rails runner 'puts ActiveRecord::Base.configurations'
{"development"=>{"adapter"=>"postgresql", "host"=>"localhost", "database"=>"my_database", "pool"=>5}}

يجري هنا تجاهل معلومات الاتصال في ENV['DATABASE_URL']‎، لاحظ اختلاف adapter واسم قاعدة البيانات database. نظرًا لأنه من الممكن تضمين ERB في config/database.yml، فمن الأفضل أن تظهر بوضوح أنك تستخدم ENV['DATABASE_URL']‎ للاتصال بقاعدة البيانات، وهذا مفيد بشكل خاص في بيئة الإنتاج لأنه يجب أن لا تودع الأسرار مثل كلمة مرور قاعدة البيانات في متحكّم المصدر الخاص بك (مثل Git).

$ cat config/database.yml
production:
  url: <%= ENV['DATABASE_URL'] %>

أصبح السلوك الآن واضح، إذ أننا لا نستخدم سوى معلومات الاتصال في ENV['DATABASE_URL']‎.

ضبط قاعدة بيانات SQLite3

يأتي ريلز مع دعم مضمّن لـ SQLite3، وهو تطبيق قاعدة بيانات خفيف بدون خوادم. وبما أن بيئة الإنتاج المزدحمة قد تفرط في تحميل SQLite، فإنه يعمل بشكل جيّد في بيئة التطوير والاختبار. ويفترض ريلز استخدام قاعدة بيانات SQLite عند إنشاء مشروع جديد، لكن يمكنك دائمًا تغييره لاحقًا.

في ما يلي قسم ملف الضبط الافتراضي (config/database.yml) مع معلومات الاتصال لبيئة التطوير:

development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000

ملاحظة: يستخدم ريلز قواعد بيانات SQLite3 لتخزين البيانات بشكل افتراضي لأن قاعدة البيانات لا تحتاج إلى ضبط. ويدعم ريلز MySQL (بما في ذلك MariaDB) أيضًا و PostgreSQL "خارج الصندوق" ولديه ملحقات للعديد من أنظمة قواعد البيانات. وإذا كنت تستخدم قاعدة البيانات في بيئة الإنتاج، فغالبا ما يملك ريلز محوّلًا لها.

ضبط قاعدة بيانات MySQL أو MariaDB

إذا اخترّت استخدام MySQL أو MariaDB بدلًا من SQLite3،  فسيبدو الملف config/database.yml مختلفًا قليلًا. إليك كيف سيبدو:

development:
  adapter: mysql2
  encoding: utf8
  database: blog_development
  pool: 5
  username: root
  password:
  socket: /tmp/mysql.sock

إذا كانت قاعدة بياناتك تملك مستخدم جذر مع كلمة مرور فارغ، فسيعّمل هذا الضبط لك. وخلاف ذلك، يجب عليك تغيير اسم المستخدم وكلمة المرور في القسم development إلى تلك التي حددتها أنت.

ضبط قاعدة بيانات PostgreSQL

إذا اخترت استخدام PostgreSQL، فيجب تخصيص الملف config/database.yml لاستخدام قواعد بيانات PostgreSQL:

development:
  adapter: postgresql
  encoding: unicode
  database: blog_development
  pool: 5

يتم تمكين البيانات المعدّة (Prepared Statements) بشكل افتراضي في PostgreSQL، ويمكنك تعطيل ذلك عن طريق تعيين prepared_statements إلى false:

production:
  adapter: postgresql
  prepared_statements: false

إذا كان مفعّلًا، سيُنشئ السجل الفعال ما يصل إلى 1000 تعبير مهيَّئ (prepared_statements) لكل اتصال قاعدة البيانات بشكل افتراضي. ولتعديل هذا السلوك، يمكنك تعيين statement_limit إلى قيمة مختلفة مثل:

production:
  adapter: postgresql
  statement_limit: 200

كلما زادت البيانات المهيَّأة لوضعها قيد الاستخدام، زدات الذاكرة التي تتطلّبها قاعدة البيانات الخاص لك. وإذا أدت قاعدة بيانات PostgreSQl إلى امتلاء الذاكرة، فجرّب تقليل statement_limit أو عطلها.

ضبط قاعدة بيانات SQLite3 لمنصة JRuby

إذا اخترت استخدام SQLite3 وأنت تستخدم JRuby، فسيبدو الملف config/database.yml مختلفًا قليلًا. سيبدو القسم development بالشكل التالي:

development:
  adapter: jdbcsqlite3
  database: db/development.sqlite3

ضبط قاعدة بيانات MySQL أو MariaDB لمنصة JRuby

إذا اخترت استخدام MySQL أو MariaDB  وأنت تستخدم JRuby، فسيبدو الملف config/database.yml مختلفًا قليلًا:

development:
  adapter: jdbcmysql
  database: blog_development
  username: root
  password:

ضبط قاعدة بيانات PostgreSQL لمنصة JRuby

إذا اخترت استخدام PostgreSQL وأنت تستخدم JRuby، فسيبدو الملف config/database.yml مختلفًا قليلًا. سيبدو القسم development بالشكل التالي:

development:
  adapter: jdbcpostgresql
  encoding: unicode
  database: blog_development
  username: blog
  password:

غيّر اسم المستخدم وكلمة المرور بالشكل المناسب.

إنشاء بيئات ريلز

يأتي ريلز مع ثلاث بيئات: "التطوير" و "الاختبار" و "الإنتاج". وفي حين أن هذه البيئات كافية لمعظم حالات الاستخدام، فهنالك ظروف تحتاج فيها إلى المزيد من البيئات.

تخيّل أن لديك خادمًا يشبه بيئة الإنتاج لكنه يُستخدَم فقط للاختبار، يطلق على هذا الخادم اسم «خادم التحضير للإطلاق» (staging server). ولتعريف بيئة تسمى "staging" لهذا الخادم، أنشئ ملفًا باسم config/environments/staging.rb ويرجى استخدام محتويات أي ملف موجود في config/environments كنقطة بداية وعدّل بعدها المحتوى كما تريد.

هذه البيئة لا تختلف عن البيئة الافتراضيّة، ابدأ خادمًا جديدًا باستخدام rails server -e staging، وطرفية باستخدام rails console -e staging، وتأكد من البيئة عبر Rails.env.staging?‎ …إلخ.

النشر إلى مجلد فرعي (جذر url نسبي)

يفترض ريلز بشكل افتراضي أن التطبيق يعمل في الجذر (على سبيل المثال /) ويشرح لك هذا القسم كيفيّة تشغيل التطبيق الخاص بك داخل مجلّد.

لنفترض أننا نريد نشر تطبيقنا على "‎/app1"، يحتاج ريلز إلى معرفة هذا المجلّد لإنشاء المسارات المناسبة:

config.relative_url_root = "/app1"

وبدلًا من ذلك، يمكنك ضبط متغيّر البيئة RAILS_RELATIVE_URL_ROOT.

سيضيف ريلز الآن "‎/app1" عند إنشاء الروابط.

استخدام Passenger

يسهّل Passenger هذه العمليّة، ويمكنك العثور على الضبط المناسب في دليل Passenger.

استخدام وكيل عكسي

يتمتع نشر تطبيقك باستخدام وكيل عكسي (Reverse Proxy) بمزايا كثيرة، فهي تسمح لك بمزيد من التحكم في الخادم الخاص بك عن طريق وضع المكونات المطلوبة في تطبيقك في طبقات.

يمكن استخدام العديد من خوادم الويب الحديثة كخادم وكيل لتحقيق التوازن بين عناصر الجهات الخارجيّة مثل خوادم التخزين المؤقت أو خوادم التطبيقات.

وأحد هذه التطبيقات التي يمكنك تشغيلها خلف الخادم العكسي هو Unicorn.

في هذه الحالة، ستحتاج إلى ضبط خادم الوكيل (مثل NGINX، أو Apache ...إلخ) إلى قبول الاتصالات من تطبيق الخادم (Unicorn)، وبشكل افتراضي سيستمع Unicorn إلى اتصالات TCP على المنفذ 8080، لكن يمكنك تغيير المنفذ أو ضبطة لاستخدام المقابس بدلًا من ذلك.

يمكنك العثور على المزيد من المعلومات في ملف اقرأني الذي يخص Unicorn وفهم الفلسفة الكامنة وراء ذلك.

بمجرّد ضبط خادم التطبيق، يجب عليك توجيه طلبات الوكيل إليه عن طريق ضبط خادم الويب بشكل مناسب. على سبيل المثال، قد يتضمّن الخادم NGINX الخاص بك التالي:

upstream application_server {
  server 0.0.0.0:8080;
}
 
server {
  listen 80;
  server_name localhost;
 
  root /root/path/to/your_app/public;
 
  try_files $uri/index.html $uri.html @app;
 
  location @app {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://application_server;
  }
 
  # ضبط آخر
  # ...
}

تأكد من قراءة توثيق NGINX للحصول على أحدث المعلومات.

إعدادات بيئة ريلز

يمكن أيضًا ضبط بعض أجزاء ريلز خارجيًا من خلال توفير متغيرات البيئة، ويتعرّف على المتغيرات البيئة التالية من خلال أجزاء مختلفة من ريلز:

  • ENV["RAILS_ENV"]‎: تعرّف بيئة ريلز (التطوير، أو الإنتاج، أو الاختبار ...إلخ.) والتي سيعمل ريلز فيها.
  • ENV["RAILS_RELATIVE_URL_ROOT"]‎: يستخدم بواسطة رمز التوجيه للتعرّف على عناوين URL عند نشر تطبيقك إلى مجلّد فرعي.
  • ENV["RAILS_CACHE_ID"]‎ و ENV["RAILS_APP_VERSION"]‎: يُستخدمان لإنشاء مفاتيح ذاكرة تخزين مؤقت موسّعة في شيفرة التخزين المؤقت لريلز، ويسمح هذا لك بأن يكون لديك عدة مخازن منفصلة من نفس التطبيق.

استخدام ملفات المهيئ (Initializer)

بعد تحميل الإطار وبقية الجواهر في تطبيقك، يتحوّل ريلز لتحميل المهيئات (Initializers)، تتجه روبي لتحميل المهيئات. المهيئ هو أي ملف روبي مخزّن في المجلد config/initializers في تطبيقك، ويمكنك استخدام المهيئات (Initializers)، للاحتفاظ بإعدادات الضبط التي يجب إجراؤها بعد تحميل جميع الأطر والجواهر، مثل خيارات الإعداد لهذه الأجزاء.

ملاحظة: يمكنك استخدام المجلدات الفرعيّة لتنظيم المهيئات الخاصة بك إذا أردت ذلك، لأن ريلز سينظر إلى التسلسل الهرمي بأكملة من المجلد Initializers إلى الداخل.

تنبيه: بينما يدعم ريلز ترقيم أسماء ملفات Initializers لأغراضي ترتيب التحميل، فإن الأسلوب الأفضل هو وضع أي شيفرة برمجية مطلوبة للتحميل بترتيب معيّن داخل نفس الملف. ويقلل هذا انحسار اسم الملف (file name churn)، ويجعل التبعيات أكثر وضوحًا، ويمكن أن يساعد في طرح مفاهيم جديدة داخل تطبيقك.

أحداث التهيئة

يحتوي ريلز على خمسة أحداث تهيئة يمكن ربطها (مدرجة بالترتيب الذي تعمل به):

  • before_configuration: يُنفَّذ هذا بمجرّد أن يرث ثابت التطبيق من Rails::Application، وتقيّم استدعاءات config قبل حدوث ذلك.
  • before_initialize: يُنفَّذ هذا مباشرةً قبل حدوث عملية التهيئة الخاصة بالتطبيق باستخدام :bootstrap_hook initializer بالقرب من بداية عملية تهيئة ريلز.
  • to_prepare: يُنفَّذ بعد تشغيل المهيئ لجميع Railties (بما في ذلك التطبيق نفسه)، لكن قبل التحميل الحثيث (eager loading) وبناء كومة البرمجيات الوسيطة (middleware stack). الأهم من ذلك، سيُنفَّذ على كل طلب في التطوير، لكن مرة واحدة (أثناء التشغيل) في الإنتاج والاختبار.
  • before_eager_load: يُنفَّذ هذا مباشرةً قبل حدوث التحميل الحثيث (eager loading)، والذي هو السلوك الافتراضي لبيئة الإنتاج وليس لبيئة التطوير.
  • after_initialize: يُنفَّذ مباشرةً بعد تهيئة التطبيق، وبعد تشغيل مهئيات التطبيق في config/initializers.

لتعريف حدث لهذه الخطافات، استخدم صياغة الكتلة داخل الصنف الفرعي Rails::Application أو Rails::Railtie أو Rails::Engine:

module YourApp
  class Application < Rails::Application
    config.before_initialize do
      # تجري عملية تهيئة الشيفرة هنا
    end
  end
end

بدلًا من ذلك، يمكنك إجراء ذلك من خلال التابع config في الكائن Rails.application:

Rails.application.config.before_initialize do
  # تجري عملية تهيئة الشيفرة هنا
end

تحذير: لا يجري إعداد بعض أجزاء تطبيقك، ولا سيما التوجيه، في النقطة التي تُستدعَى فيها الكتلة after_initialize.

Rails::Railtie.initializer

يحتوي ريلز على العديد من المهيئات (initializers) التي تعمل عند بدء التشغيل والتي تم تعريفها كافة باستخدام التابع initializer من Rails::Railtie. وهذا مثال على المهيئ set_helpers_path من وحدة التحكم:

initializer "action_controller.set_helpers_path" do |app|
  ActionController::Helpers.helpers_path = app.helpers_paths
end

يأخذ التابع initializer ثلاثة معاملات؛ الأول هو اسم المهيئ والثاني هو جدول hash اختياري (غير معروض هنا) والثالث هو كتلة. يمكن تحديد المفتاح :before في جدول الخيارات hash لتحديد المهيئ الجديد الذي يجب تشغيله أولًا، والمفتاح :after لتحديد المهيئ المراد تشغيله فيما بعد.

ستشتغل المهيئات المعرّفة باستخدام التابع initializer بالترتيب الذي تم تعريفها فيه، باستثناء تلك التي تستخدم التابعين :before و ‎:after.

تحذير: يمكنك وضع المهيئ الخاص بك قبل أو بعد أي مهيئ آخر في السلسلة، طالما أنه منطقي. لنفترض أن لديك 4 مهيئات تسمى من "one" إلى "four" (معرّفة بهذا الترتيب) ولقد عرّفت "four" ليعمل قبل "four" -المعرف مسبقًا - ولكن بعد "three" وهذا ليس منطقيًا؛ لن يتمكن ريلز آنذاك من تحديد ترتيب المهيئ الخاص بك.

يعتبر معامل الكتلة للتابع initializer هو نسخة من التطبيق نفسه، ولذا يمكننا الوصول إلى ضبطه باستخدام التابع config كما في المثال.

بما أن Rails::Application يرث من Rails::Railtie (بشكل غير مباشر)، يمكنك استخدام التابع initializer في config/application.rb لتعريف المهيئات للتطبيق.

المهيئات

فيما يلي قائمة شاملة لجميع المهيئات الموجودة في ريلز بالترتيب الذي تم تعريفها فيه (وبالتالي تشغيلها ما لم يُنص على خلاف ذلك).

  • load_environment_hook: يعمل كعنصر نائب (placeholder) بحيث يمكن تعريف :load_environment_config ليعمل قبله.
  • load_active_support: يتطلّب active_support/dependencies الذي يعد الأساس للسجل الفعال، وهو يتطلّب اختياريًا active_support/all إذا كان config.active_support.bare غير صحيح (un-truthful) وهو الإعداد الافتراضي.
  • initialize_logger: يهيئ المسجّل (الكائن ActiveSupport::Logger) للتطبيق ويجعل من الممكن الوصول إليه في Rails.logger، بشرط أن لا يوجود مهيئ مدرج قبل هذه النقطة التي عرّف فيها Rails.logger.
  • initialize_cache: إذا لم يعيَّن Rails.cache بعد، فهيئ ذاكرة التخزين المؤقت بالرجوع إلى القيمة الموجودة في config.cache_store وخزّن النتائج على أنها Rails.cache. إذا كان الكائن يستجيب للتابع middleware، إذ يُدرج الوسيط الخاص به قبل Rack::Runtime في كومة الوسيط (middleware stack).
  • set_clear_dependencies_hook: هذا المهيئ - الذي يعمل فقط في حالة كان cache_classes يساوي false - يستخدم ActionDispatch::Callbacks.after لإزالة الثوابت المشار إليها أثناء الطلب من مساحة الكائن بحيث يعاد تحميلها أثناء الطلب التالي.
  • initialize_dependency_mechanism: إذا كان config.cache_classes يساوي true، اضبط ActiveSupport::Dependencies.mechanism ليطلب التبعيات عبر require بدلًا من تحميلها.
  • bootstrap_hook: يُنفِّذ جميع كتل before_initialize المهيئة.
  • i18n.callbacks: في بيئة التطوير، عيّن رد النداء to_prepare الذي سيستدعي I18n.reload!‎ إذا تغيّرت أي من المحليات منذ آخر طلب. وفي وضع الإنتاج، سيشتغل هذا الاستدعاء فقط عند الطلب الأول.
  • active_support.deprecation_behavior: يهيئ تقارير الإهمال للبيئات، وهو بشكل افتراضي :log للتطوير و ‎:notify للإنتاج و :stderr للإختبار. وإذا لم تعيّن قيمة للضبط config.active_support.deprecation، فسيطالب هذا المهيئ المستخدم بضبط هذا السطر في الملف config/environments الخاص بالبيئة الحالية. يمكن ضبطه إلى مصفوفة من القيم.
  • active_support.initialize_time_zone: يعيّن المنطقة الزمنيّة الافتراضيّة للتطبيق استنادًا إلى الضبط config.time_zone والذي يساوي افتراضيًا "UTC".
  • active_support.initialize_beginning_of_week: يعيّن بداية الأسبوع للتطبيق استنادًا إلى الضبط config.beginning_of_week والذي يساوي افتراضيًا :monday.
  • active_support.set_configs: يهيئ السجل الفعال باستخدام الإعدادت الموجودة في config.active_support عن طريق إرسال أسماء التوابع على أنها ضابطة (setters) للسجل الفعال (ActiveSupport) وتمرير القيم من خلالها.
  • action_dispatch.configure: يضبط ActionDispatch::Http::URL.tld_length لتعيين قيمة config.action_dispatch.tld_length.
  • action_view.set_configs: إعداد إجراء العرض عن طريق استخدام الإعدادات الموجودة في config.action_view عن طريق إرسال أسماء التوابع على أنها ضابطة (setters) إلى ActionView::Base وتمرير القيم من خلالها.
  • action_controller.assets_config: تهيئة config.actions_controller.assets_dir إلى مجلّد التطبيق العام إذا لم يُضبَط بشكل صريح.
  • action_controller.set_helpers_path: يعيّن helpers_path الخاص بوحدة التحكم إلى helpers_path الخاص بالتطبيق.
  • action_controller.parameters_config: يضبط خيارات معاملات قويّة لـ ActionController::Parameters.
  • action_controller.set_configs: يعّد متحكم الحدث عن طريق استخدام الإعدادات الموجودة في config.action_controller عن طريق إرسال أسماء التوابع على أنها ضابطة (setters) إلى ActionController::Base وتمرير القيم من خلالها.
  • action_controller.compile_config_methods: يهيئ التوابع لإعدادات الضبط المحددة بحيث تكون أسرع في الوصول.
  • active_record.initialize_timezone: يعيّن ActiveRecord::Base.time_zone_aware_attributes إلى true بالإضافة إلى ضبط ActiveRecord::Base.default_timezone إلى UTC. عند قراءة الخاصيات من قاعدة البيانات، ستحوّل إلى المنطقة الزمنيّة المحددة بواسطة Time.zone.
  • active_record.logger: يعيّن ActiveRecord::Base.logger - إذا لم يُعيّن بالفعل - إلى Rails.logger.
  • active_record.migration_error: يضبط الوسيطات (middleware) للتأكد من وجود عمليات تهجير معلّقة.
  • active_record.check_schema_cache_dump: يحمّل ملف تفريغ التخزين المؤقت للمخطّط إذا هيئ بالفعل وكان متاحًا.
  • active_record.warn_on_records_fetched_greater_than: يُمكّن التحذيرات عند تُرجع الاستعلامات عدد كبير من السجلات.
  • active_record.set_configs: يضبط السجل الفعال عن طريق استخدام الإعدادات الموجودة في config.active_record وذلك عن طريق ارسال أسماء التوابع على أنها ضابطة (setters) إلى ActiveRecord::Base وتمرير القيم من خلالها.
  • active_record.initialize_database: يحمّل إعدادات قاعدة البيانات (افتراضيًا) من config/database.yml ويُنشئ اتصال للبيئة الحاليّة.
  • active_record.log_runtime: يضمّن ActiveRecord::Railties::ControllerRuntime الذي هو المسؤول عن الإبلاغ عن الوقت الذي يستغرقه استدعاءات السجل الفعال وحتى عودة الطلب إلى المسجل (logger).
  • active_record.set_reloader_hooks: يعيد تعيين جميع الاتصالات القابلة لإعادة التحميل إلى قاعدة البيانات في حالة تعيين config.cache_classes إلى القيمة false.
  • active_record.add_watchable_files: يضيف ملفات schema.rb و structure.sql إلى الملفات المراقبة.
  • active_job.logger: يعيّن ActiveJob::Base.logger - إذا لم تضبط بالفعل - إلى Rails.logger.
  • active_job.set_configs: يهيئ الوظفية الفعالة عن طريق استخدام الإعدادات الموجودة في config.active_job عن طريق ارسال أسماء التوابع على أنها ضابطة (setters) إلى ActiveJob::Base وتمرير القيم من خلالها.
  • action_mailer.logger: يعيّن ActionMailer::Base.logger - إذا لم تضبط بالفعل - إلى Rails.logger.
  • action_mailer.set_configs: يعد إجراء المراسلة عن طريق استخدام الإعدادات الموجودة في config.action_mailer عن طريق ارسال أسماء التوابع على أنها ضابطة (setters) إلى ActionMailer::Base وتمرير القيم من خلالها.
  • action_mailer.compile_config_methods: يهيئ التوابع لإعدادات الضبط المحددة بحيث يكون الوصول إليها أسرع.
  • set_load_path: يعمل هذا المهيئ قبل bootstrap_hook ويضيف المسارات المحددة بواسطة config.load_paths وجميع مسارات التحميل التلقائي إلى ‎$LOAD_PATH.
  • set_autoload_paths: يعمل هذا المهيئ قبل bootstrap_hook ويضيف جميع مجلدات app الفرعية والمسارات المحددة بواسطة config.autoload_paths و config.eager_load_paths و config.autoload_once_paths إلى ActiveSupport::Dependencies.autoload_paths.
  • add_routing_paths: تحميل (بشكل افتراضي) جميع ملفات config/routes.rb (في التطبيق و railties بما في ذلك المحركات) وإعداد المسارات للتطبيق.
  • add_locales: يضيف الملفات في config/locales (من التطبيق و railties والمحركات) إلى I18n.load_path مما يتيح الترجمات في هذه الملفات.
  • add_view_paths: يضيف المجلد app/views من التطبيق و railties والمحركات إلى مسار البحث لملفات العرض للتطبيق.
  • load_environment_config: تحميل الملف config/environments للبيئة الحاليّة.
  • Prepend_helpers_path: يضيف المجلّد app/helpers من التطبيق و railties والمحركات إلى مسار البحث للمساعدين للتطبيق.
  • load_config_initializers: تحميل جميع ملفات روبي من config/initializers في التطبيق و railties والمحركات. يمكن استخدام الملفات الموجودة في هذا المجلّد لاستيعاب إعدادات الضبط التي يجب إجراؤها بعد تحميل جميع إطارات العمل.
  • engines_blank_point: يوفر نقطة في التهيئة (point-in-initialization) للربط إذا كنت ترغب في القيام بأي شيء قبل تحميل المحركات. بعد هذه النقطة، ستشتغل جميع مهيئات railtie والمحرك.
  • add_generator_templates: إيجاد القوالب للمولدات في lib/templates للتطبيق، railties والمحركات ويضيف هذه إلى الضبط config.generators.templates الذي سيجّعل القوالب متاحة لجميع المولدات للإشارة إليها.
  • ensure_autoload_once_paths_as_subset: التأكد أن الضبط config.autoload_once_paths لا يحتوي إلا على مسارات من config.autoload_paths. وإذا كان يحتوي على مسارات إضافيّة، فسيرفع استثناء.
  • add_to_prepare_blocks: تضاف الكتلة لجميع استدعاءات config.to_prepare في التطبيق أو railtie أو المحرك إلى ردود النداء to_prepare لإجراء الإرسال (Action Dispatch) والتي ستشتغل لكل طلب في التطوير أو قبل أول طلب في الإنتاج.
  • add_builtin_route: إذا كان التطبيق قيد التشغيل في بيئة التطوير، فسيؤدي ذلك إلى إلحاق مسار لـ rails/info/properties إلى مسارات التطبيق، ويوفّر هذا المسار معلومات تفصيليّة مثل إصدار ريلز وروبي لـ public/index.html في تطبيق ريلز الافتراضي.
  • build_middleware_stack: بناء كومة وسيط (middleware stack) للتطبيق، ويرّجع كائن يملك التابع call الذي يأخذ كائن بيئة Rack للطلب.
  • eager_load!‎: إذا كان config.eager_load يساوي true، فنفِّذ خطافات config.before_eager_load ومن ثم استدعي eager_load!‎ الذي سيحمّل جميع config.eager_load_namespaces.
  • finisher_hook: يوفّر خطافًا بعد اكتمال تهيئة عملية التطبيق، بالإضافة إلى تشغيل جميع كتل config.after_initialize للتطبيق و railties والمحركات.
  • set_routes_reloader_hook: يضبط إجراء الإرسال (Action Dispatch) لإعادة تحميل ملف المسارات باستخدام ActiveSupport::Callbacks.to_run.
  • disable_dependency_loading: يعطّل تحميل التبعيّة التلقائي إذا لم يعيّن config.eager_load إلى القيمة true.

تجميع قواعد البيانات

تدار اتصالات قواعد بيانات السجل الفعال عن طريق ActiveRecord::ConnectionAdapters::ConnectionPool الذي يضمن تزامن مجمع الاتصالات كميّة الوصول الخيوط إلى عدد محدود من اتصالات قاعدة البيانات. الحد الافتراضي لهذا هو 5 ويمكن ضبطه في database.yml.

development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000

نظرًا لأنه يتعامل مع تجمع الاتصالات داخل السجل الفعال افتراضيًا، يجب أن تعمل جميع خوادم التطبيقات (Thin، Puma، Unicorn …إلخ) بنفس الطريقة. إن قاعدة بيانات مجمع الاتصالات فارغ افتراضيًا. كلما زاد الطلب على الاتصالات، سيؤدي إلى ضبطها حتى تصل إلى حد مجمع الاتصالات.

أي طلب سيتحقق من الاتصال المطلوب إلى قاعدة البيانات في المرة الأولى. وفي نهاية الطلب، سيتحقق من إرجاع الاتصال، وهذا يعني أن منفذ الاتصال الإضافي سيتوفّر مرة أخرى للطلب التالي في قائمة الانتظار.

إذا حاولت استخدام اتصالات أكثر من تلك المتاحة، فسيحظرك السجل الفعال وسينتظر اتصالًا من المجمع. وإذا لم يتمكن من الحصول على اتصال، فسيرمي خطأ عند انتهاء المهلة الزمنية مثل الخطأ التالي.

ActiveRecord::ConnectionTimeoutError - could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)

إذا حصلت على الخطأ أعلاه، فقد ترغب في زيادة حجم مجمع الاتصال عن طريق زيادة الخيار pool في database.yml.

ملاحظة: إذا كنت تعمل في بيئة متعددة الخيوط، فقد تكون هنالك فرصة لأن العديد من الخيوط قد تصل إلى عدة اتصالات في نفس الوقت. وبناءًا على تحميل الطلب الحالي، قد يكون لديك العديد من الخيوط التي تتنافس على عدد محدود من الاتصالات.

الضبط المخصص

يمكنك ضبط الشيفرة البرمجية الخاصة بك من خلال كائن ضبط ريلز مع ضبط مخصص تحت إما مجال الاسم config.x أو config مباشرةً؛ والفرق الرئيسي بينهما هو أنه يجب أن تستخدم config.x إذا كنت تعرّف ضبطًا متداخلًا (مثل config.x.nested.nested.hi) و config لضبط ذي مستوى واحد (مثل config.hello).

config.x.payment_processing.schedule = :daily
config.x.payment_processing.retries  = 3
config.super_debugger = true

نقاط الضبط التالية متاحة بعد ذلك من خلال كائن الضبط:

Rails.configuration.x.payment_processing.schedule # => :daily
Rails.configuration.x.payment_processing.retries  # => 3
Rails.configuration.x.payment_processing.not_set  # => nil
Rails.configuration.super_debugger                # => true

يمكنك أيضًا استخدام Rails::Application.config_for لتحميل ملفات الضبط بأكملها:

# config/payment.yml:
production:
  environment: production
  merchant_id: production_merchant_id
  public_key:  production_public_key
  private_key: production_private_key
development:
  environment: sandbox
  merchant_id: development_merchant_id
  public_key:  development_public_key
  private_key: development_private_key
 
# config/application.rb
module MyApp
  class Application < Rails::Application
    config.payment = config_for(:payment)
  end
end
Rails.configuration.payment['merchant_id'] # => production_merchant_id or development_merchant_id

فهرسة محركات البحث

في بعض الأحيان، قد ترغب في منع ظهور بعض صفحات تطبيقك على مواقع البحث مثل Google أو Bing أو Yahoo أو Duck Duck Go. تعمل البرامج الآلية التي تفهرس هذه المواقع أولًا على تحليل الملف http://your-site.com/robots.txt لمعرفة الصفحات التي يُسمَح لها بفهرستها.

ينشئ ريلز هذا الملف داخل المجلد ‎/public. وافتراضيًا، يسمح لمحركات البحث بفهرسة جميع صفحات تطبيقك، وإذا كنت ترغب في حظر فهرسة جميع صفحات تطبيقك، فاستخدم ما يلي:

User-agent: *
Disallow: /

لحظر فهرسة صفحات محدّدة فقط، فمن الضروري استخدام صياغة أكثر تعقيدًا. تعلّم كيفية القيام بذلك من التوثيق الرسمي.

مراقب نظام الملفات الحدثي

عند تحميل الجوهرة listen، فإن ريلز يستخدم مراقب نظام الملفات الحدثي (evented file system monitor) للكشف على التغييرات عندما يكون config.cache_classes مساويًا إلى القيمة false:

group :development do
  gem 'listen', '>= 3.0.5', '< 3.2'
end

خلاف ذلك، في كل طلب، يمر ريلز على شجرة التطبيق للتأكد ما إذا قد تغيّر أي شيء.

لا توجد حاجة إلى جوهرة إضافيّة في لينكس وماك، ولكن بعضها مطلوب لأنظمة *BSD وويندوز.

لاحظ أن بعض الإعدادات غير مدعومة.

مصادر