<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x625;&#x637;&#x627;&#x631; &#x627;&#x644;&#x639;&#x645;&#x644; Ruby on Rails</title><link>https://academy.hsoub.com/programming/ruby/rails/page/2/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x625;&#x637;&#x627;&#x631; &#x627;&#x644;&#x639;&#x645;&#x644; Ruby on Rails</description><language>ar</language><item><title>&#x627;&#x644;&#x646;&#x645;&#x627;&#x630;&#x62C; Models &#x641;&#x64A; Rails - &#x625;&#x646;&#x634;&#x627;&#x624;&#x647;&#x627; &#x648;&#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639;&#x647;&#x627; - &#x62D;&#x641;&#x638; &#x627;&#x644;&#x645;&#x642;&#x627;&#x644;&#x627;&#x62A; &#x641;&#x64A; &#x642;&#x648;&#x627;&#x639;&#x62F; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A;</title><link>https://academy.hsoub.com/programming/ruby/rails/%D8%A7%D9%84%D9%86%D9%85%D8%A7%D8%B0%D8%AC-models-%D9%81%D9%8A-rails-%D8%A5%D9%86%D8%B4%D8%A7%D8%A4%D9%87%D8%A7-%D9%88%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9%D9%87%D8%A7-%D8%AD%D9%81%D8%B8-%D8%A7%D9%84%D9%85%D9%82%D8%A7%D9%84%D8%A7%D8%AA-%D9%81%D9%8A-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r531/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_09/59bd42eeeddaf_main2(4).png.23ac8fb2be123961ad80bda872b77e9e.png" /></p>

<p id="النماذج-models-في-rails-الجزء-الأول">
	تعرّفنا في <a href="https://academy.hsoub.com/programming/ruby/rails/%D8%A7%D9%84%D9%85%D8%AA%D8%AD%D9%83%D9%91%D9%85%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%B9%D8%B1%D9%88%D8%B6-%D9%81%D9%8A-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-rails-r530/" rel="">الدرس السابق</a> بإيجاز على طريقة عمل إطار العمل Ruby on Rails حيث تعرّفنا على المتحكّمات والعروض وبدأنا بإنشاء تطبيق المدوّنة البسيطة وأنشأنا في الدرس السابق الاستمارة الخاصة بإضافة مقالة جديدة، ولكن وصلنا إلى النقطة التي نحتاج فيها إلى تخزين المقالة في قاعدة البيانات، وهنا يأتي دور النماذج Models.
</p>

<p>
	تحمل النماذج في Rails اسمًا بصيغة المفرد في حين يحمل الجدول المرتبط بها في قاعدة البيانات اسمًا بصيغة الجمع. تتيح أداة المولّد generator في Rails إنشاء النماذج ويلجأ أغلب المطوّرين إلى هذه الأداة لإنشاء النماذج.
</p>

<p>
	لإنشاء نموذج جديد استخدم الأمر التالي في سطر الأوامر:
</p>

<pre class="ipsCode" id="ips_uid_7047_12">
$ bin/rails generate model Article title:string text:text</pre>

<p>
	من خلال هذه الأمر نخبر Rails بأننا نرغب في إنشاء نموذج باسم <code>Article</code> إلى جانب خاصّية <code>title</code> من نوع <code>string</code>، وخاصّية <code>text</code> من نوع <code>text</code>. تضاف هذه الخواص بصورة تلقائية إلى جدول المقالات في قاعدة البيانات ويتم ربطها بنموذج <code>Article</code>.
</p>

<p>
	ويستجيب Rails لهذا الأمر بإنشاء عدد من الملفات، وما يهمّنا منها الآن هما <code>app/models/article.rb</code> و <code>db/migrate/20140120191729_create_articles.rb</code> (لاحظ أن اسم الملف الثاني يختلف قليلًا عن هذا الاسم). الملف الثاني مسؤول عن إنشاء بنية قاعدة البيانات، وهو ما سنتحدث عنه بعد قليل.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Quote
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة:</strong><br>
			التسجيلة النشطة Active Reord ذكية بما فيه الكفاية لتربط اسم العمود بخاصية النموذج المقابلة، وهذا يعني أنّك لست بحاجة إلى الإعلان عن الخصائص داخل نموذج Rails، إذ ستقوم التسجيلة النشطة بذلك نيابة عنك.
		</p>
	</div>
</blockquote>

<h3 id="إجراء-عملية-التهجير-migration">
	إجراء عملية التهجير Migration
</h3>

<p>
	كما لاحظنا فإن الأمر <code>bin/rails generate model</code> قد أنشأ ملف تهجير لقاعدة البيانات داخل المجلد <code>db/migrate</code>. والتهجيرات هي عبارة عن أصناف مصمّمة لتسهيل عملية إنشاء الجداول في قواعد البيانات والتعديل عليها. يستخدم Rails أوامر <code>rake</code> لإجراء التهجيرات، ويمكن التراجع عن عملية التجهير بعد إجرائها على قاعدة البيانات. تتضمّن أسماء ملفات التهجير ختمًا زمنيًا لضمان معالجة هذه الملفات حسب التسلسل الزمني لإنشائها.
</p>

<p>
	لو ألقينا نظرة في ملف <code>db/migrate/YYYYMMDDHHMMSS_create_articles.rb</code> (تذكّر أن الملف عندك يحمل ختمًا زمنيًّا مختلفًا) فسنجد التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">CreateArticles</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="typ">ActiveRecord</span><span class="pun">::</span><span class="typ">Migration</span><span class="pun">[</span><span class="lit">5.0</span><span class="pun">]</span><span class="pln">
  </span><span class="kwd">def</span><span class="pln"> change
    create_table </span><span class="pun">:</span><span class="pln">articles </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">t</span><span class="pun">|</span><span class="pln">
      t</span><span class="pun">.</span><span class="pln">string </span><span class="pun">:</span><span class="pln">title
      t</span><span class="pun">.</span><span class="pln">text </span><span class="pun">:</span><span class="pln">text

      t</span><span class="pun">.</span><span class="pln">timestamps
    </span><span class="kwd">end</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">
</span><span class="kwd">end</span></pre>

<p>
	ستنشئ عملية التهجير أعلاه تابعًا يحمل اسم `change` والذي يتم استدعاؤه عند إجراء عملية التهجير. حتى الحدث المُعرّف ضمن التابع قابل للتراجع، ما يعني أن Rails قادر على التراجع عن التغييرات الحاصلة من إجراء عملية التهجير في حال أردت ذلك في وقت لاحق. عند إجراء عملية التهجير هذه سيتم إنشاء جدول باسم `articles` يتضمن عمودًا من نوع `string` وآخر من نوع `text`، إضافة إلى عمودين للختم الزمني يمكن لـ Rails من خلالهما متابعة تواريخ إنشاء وتعديل المقالات. لتنفيذ عمية التهجير توجّه إلى سطر الأوامر ونفذ الأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_7047_10">
$ bin/rails db:migrate</pre>

<p>
	سينفّذ Rails أمر التهجير التالي وسيخبرك بإنشاء جدول Articles.
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<code class="hljs asciidoc"><span class="hljs-header"><span class="pun">==</span><span class="pln">  </span><span class="typ">CreateArticles</span><span class="pun">:</span><span class="pln"> migrating </span><span class="pun">==================================================</span></span><span class="pln">
</span><span class="hljs-bullet"><span class="pun">--</span><span class="pln"> </span></span><span class="pln">create</span><span class="hljs-emphasis"><span class="pln">_table</span><span class="pun">(:</span><span class="pln">articles</span><span class="pun">)</span><span class="pln">
   </span><span class="pun">-&gt;</span><span class="pln"> </span><span class="lit">0.0019s</span><span class="pln">
</span><span class="pun">==</span><span class="pln">  </span><span class="typ">CreateArticles</span><span class="pun">:</span><span class="pln"> migrated </span><span class="pun">(</span><span class="lit">0.0020s</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=========================================</span></span></code></pre>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Quote
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة:</strong><br>
			نظرًا لكوننا نعمل في بيئة التطوير Development Environment بصورة افتراضية، سيتم تنفيذ الأمر السابق على قاعدة البيانات المعرّفة في قسم التطوير في ملف الإعدادات <code>config/database.yml</code>. أما لو أردت تنفيذ عملية التهجير في بيئة أخرى، كبيئة الإنتاج Production Environment مثلًا، فيجب التصريح عن ذلك أثناء تنفيذ أمر التهجير وكما يلي:
		</p>

		<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">

<code class="hljs fix"><span class="hljs-attribute"><span class="pln">bin</span><span class="pun">/</span><span class="pln">rails db</span><span class="pun">:</span><span class="pln">migrate RAILS_ENV</span></span><span class="pun">=</span><span class="hljs-string"><span class="pln">production</span><span class="pun">.</span></span></code></pre>
	</div>
</blockquote>

<h3 id="حفظ-البيانات-بواسطة-المتحكم">
	حفظ البيانات بواسطة المتحكّم
</h3>

<p>
	سنعود الآن إلى المتحكّم <code>ArticlesController</code>، حيث سنعمل على تعديل الحدث <code>create</code> ليستخدم النموذج الجديد <code>Article</code> لحفظ البيانات في قاعدة البيانات. افتح الملف <code>app/controllers/articles_controller.rb</code> وعدّله بالصورة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<code class="hljs ruby"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="pln">create
  </span><span class="hljs-variable"><span class="lit">@article</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-constant"><span class="typ">Article</span></span><span class="pun">.</span><span class="kwd">new</span><span class="pun">(</span><span class="kwd">params</span><span class="pun">[</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">article</span></span><span class="pun">])</span><span class="pln">

  </span><span class="hljs-variable"><span class="lit">@article</span></span><span class="pun">.</span><span class="pln">save
  redirect_to </span><span class="hljs-variable"><span class="lit">@article</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span></code></pre>

<p>
	يمكن استحداث initialize كل نموذج في Rails مع الخصائص Attributes المرتبطة به، والتي يتم ربطها تلقائيًا مع الأعمدة المقابلة في قاعدة البيانات. وقد قمنا بذلك في السطر الأول في الحدث <code>create</code> (هل تذكر <code>params[:article]</code> والذي يضمّ الخصائص التي نريدها). بعد ذلك يمكن حفظ النموذج في قاعدة البيانات من خلال الدالة <code>@article.save</code>. وفي النهاية نعيد توجيه المستخدم إلى الحدث <code>show</code> الذي سنعرّفه في وقت لاحق.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Quote
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة:</strong><br>
			قد يخطر على بالك السؤال التالي: لماذا استخدمنا الحرف <code>A</code> في الدالة <code>Article.new</code> في حين أن جميع المتغيّرات التي تشير إلى المقالات كانت تبدأ بحرف صغير؟ في هذا السياق نحن نشير إلى صنف يحمل اسم <code>Article</code> والمعرّف في الملف <code>app/models/article.rb</code>، وفي لغة Ruby يجب أن تحمل الأصناف أسماء تبدأ بأحرف كبيرة.
		</p>
	</div>
</blockquote>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Quote
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة:</strong><br>
			سنرى فيما بعد أن الدالّة <code>@article.save</code> تُرجع قيمة منطقية تشير إلى أن المقالة قد حُفظت أم لا.
		</p>
	</div>
</blockquote>

<p>
	توجّه الآن إلى العنوان <code><a href="http://localhost:3000/articles/new" ipsnoembed="false" rel="external nofollow">http://localhost:3000/articles/new</a></code> وستتلقّى الخطأ التالي:
</p>

<p style="text-align: center;">
	<img alt="forbidden_attributes_for_new_article.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24990" data-unique="3ihughvf3" src="https://academy.hsoub.com/uploads/monthly_2017_09/forbidden_attributes_for_new_article.png.6d712708b9a827c37a6c6457a69040ba.png"></p>

<p>
	يدعم Rails العديد من مزايا الأمان التي تساعد في كتابة تطبيقات أمينة، ونحن الآن نتعامل مع إحدى هذه المزايا. تدعى هذه الميزة بالمعاملات القوية strong parameters والتي تجبرنا على تحديد المعاملات المسموح بها في الأحداث الموجودة ضمن المتحكم.
</p>

<p>
	ما الفائدة من ذلك؟ صحيح أن القدرة على إضافة جميع المعاملات إلى النموذج دفعة واحدة وبصورة تلقائية يختصر الكثير من الجهد بالنسبة للمبرمج، إلا أنّ البرنامج يكون في هذه الحالة عرضة للاستخدامات الخبيثة. فماذا لو تمّ إنشاء طلب إلى الخادوم يتضمن استمارة إنشاء مقالة جديدة إضافة إلى حقول أخرى تحتوي على معلومات تضرّ بالتطبيق؟ سيتم إسناد المعلومات الإضافية بصورة شاملة “Mass Assignment” إلى النموذج ثم إلى قاعدة البيانات جنبًا إلى جنب مع البيانات الأصلية، وهذا قد يتسبب في تعطيل عمل برنامجك أو قد يحدث ما هو أسوأ من ذلك بكثير.
</p>

<p>
	يجب علينا إذًا تحديد المعاملات المسموح بإدخالها إلى النموذج، وفي حالتنا هذه سنسمح بإدراج معاملي <code>title</code> و <code>text</code> ونطلب توفّر قيم لهما. وللقيام بذلك عدّل السطر الأول من حدث <code>create</code> بالصورة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<code class="hljs ruby"><span class="hljs-variable"><span class="lit">@article</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-constant"><span class="typ">Article</span></span><span class="pun">.</span><span class="kwd">new</span><span class="pun">(</span><span class="kwd">params</span><span class="pun">.</span><span class="hljs-keyword"><span class="kwd">require</span></span><span class="pun">(</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">article</span></span><span class="pun">).</span><span class="pln">permit</span><span class="pun">(</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">title</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">text</span></span><span class="pun">))</span></code></pre>

<p>
	غالبًا ما يتمّ تحديد المعاملات المسموح بإدخالها إلى النموذج في تابع خاص ليصبح بالإمكان إعادة استخدامها بواسطة عدة أحداث في المتحكّم نفسه مثل حدثي <code>create</code> و <code>update</code>، إضافة إلى ذلك يكون هذا التابع خاصًّا وذلك باستخدام المحدّد <code>private</code> لضمان عدم إمكانية استدعائه من خارج السياق المقرّر له، وبالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<code class="hljs ruby"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="pln">create
  </span><span class="hljs-variable"><span class="lit">@article</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-constant"><span class="typ">Article</span></span><span class="pun">.</span><span class="kwd">new</span><span class="pun">(</span><span class="pln">article_params</span><span class="pun">)</span><span class="pln">

  </span><span class="hljs-variable"><span class="lit">@article</span></span><span class="pun">.</span><span class="pln">save
  redirect_to </span><span class="hljs-variable"><span class="lit">@article</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

</span><span class="kwd">private</span><span class="pln">
  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="pln">article_params
    </span><span class="kwd">params</span><span class="pun">.</span><span class="hljs-keyword"><span class="kwd">require</span></span><span class="pun">(</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">article</span></span><span class="pun">).</span><span class="pln">permit</span><span class="pun">(</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">title</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">text</span></span><span class="pun">)</span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">end</span></span></code></pre>

<h3 id="عرض-المقالات">
	عرض المقالات
</h3>

<p>
	إن قمت بتعبئة استمارة المقالة الجديدة وإرسالها فستتلقّى خطأ مفاده عدم عثور Rails على الحدث <code>show</code>، لذا سنقوم بإنشاء هذا الحدث الآن.
</p>

<p>
	كما رأينا سابقًا في مخرجات الأمر <code>bin/rails routes</code> فإن مسار الحدث <code>show</code> هو:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<code class="hljs ruby"><span class="pln">article </span><span class="hljs-constant"><span class="pln">GET</span></span><span class="pln">    </span><span class="pun">/</span><span class="pln">articles</span><span class="pun">/</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">id</span></span><span class="pun">(.</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">format</span></span><span class="pun">)</span><span class="pln">      articles</span><span class="hljs-comment"><span class="com">#show</span></span></code></pre>

<p>
	تعني الصيغة الخاصة <code>:id</code> أن هذا المسار يطلب وجود معامل <code>:id</code> والذي يمثّل في حالتنا هذه معرّف المقالة.
</p>

<p>
	وكما فعلنا سابقًا، يجب علينا إضافة الحدث <code>show</code> إلى ملف المتحكّم <code>app/controllers/articles_controller.rb</code> وتحديد العرض المرتبط به.
</p>

<p>
	عادة ما تأخذ أحداث CRUD في المتحكّمات الترتيب التالي: <code>index, show, new, edit, create, update, destroy</code>. ويمكن اتّباع الترتيب الذي يعجبك، ولكن تذكّر أن هذه التوابع هي توابع عامّة <code>public</code>، ويجب الإعلان عنها قبل الإعلان عن التوابع الخاصّة.
</p>

<p>
	سنضيف الآن الحدث <code>show</code> آخذين ما سبق بعين الاعتبار:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<code class="hljs ruby"><span class="hljs-class"><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-title"><span class="typ">ArticlesController</span></span><span class="pln"> </span><span class="hljs-inheritance"><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-parent"><span class="typ">ApplicationController</span></span></span></span><span class="pln">

  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="pln">show
    </span><span class="hljs-variable"><span class="lit">@article</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-constant"><span class="typ">Article</span></span><span class="pun">.</span><span class="pln">find</span><span class="pun">(</span><span class="kwd">params</span><span class="pun">[</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">id</span></span><span class="pun">])</span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="kwd">new</span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

  </span><span class="hljs-comment"><span class="com"># بقيّة الشيفرة .....</span></span></code></pre>

<p>
	استخدمنا الدالة <code>Article.find</code> للبحث عن المقالة المطلوبة، وذلك بتمرير المعامل <code>params[:id]</code> للحصول على قيمة المعرّف من الطلب الذي أرسلته صفحة إنشاء مقالة جديدة. كذلك استخدمنا متغيّرًا من نوع <code>instance</code> (مسبوقًا بعلامة @) ليكون مرجعًا لكائن المقالة، وذلك لأنّ Rails يمرّر هذا النوع من المتغيّرات إلى العرض.
</p>

<p>
	أنشئ الآن ملفًّا جديدًا باسم <code>show.html.erb</code> في المسار <code>app/views/articles/</code> وأضف إليه الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<code class="hljs xml"><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">
  </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">strong</span></span><span class="tag">&gt;</span></span><span class="pln">Title:</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">strong</span></span><span class="tag">&gt;</span></span><span class="pln">
  </span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> </span><span class="lit">@article</span><span class="pun">.</span><span class="pln">title %&gt;</span></span><span class="pln">
</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">

</span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">
  </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">strong</span></span><span class="tag">&gt;</span></span><span class="pln">Text:</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">strong</span></span><span class="tag">&gt;</span></span><span class="pln">
  </span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> </span><span class="lit">@article</span><span class="pun">.</span><span class="pln">text %&gt;</span></span><span class="pln">
</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span>
</code></pre>

<p>
	ستكون الآن قادرًا على إنشاء مقالة جديدة؛ لذا توجّه إلى العنوان <code><a href="http://localhost:3000/articles/new" ipsnoembed="false" rel="external nofollow">http://localhost:3000/articles/new</a></code> وجرّب إضافة مقالة جديدة.
</p>

<p style="text-align: center;">
	<img alt="show_action_for_articles.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24991" data-unique="y183fjt3r" src="https://academy.hsoub.com/uploads/monthly_2017_09/show_action_for_articles.png.536a94df1df6d7595f6699a0fa033583.png"></p>

<h2 id="عرض-قائمة-بمقالات-المدونة">
	عرض قائمة بمقالات المدوّنة
</h2>

<p>
	نحتاج الآن إلى عرض قائمة بجميع المقالات الموجودة في المدونة، وسيكون المسار المرتبط بهذا الحدث وبحسب مخرجات الأمر <code>bin/rails routes</code> كالتالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<code class="hljs ruby"><span class="pln">articles </span><span class="hljs-constant"><span class="pln">GET</span></span><span class="pln">    </span><span class="pun">/</span><span class="pln">articles</span><span class="pun">(.</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">format</span></span><span class="pun">)</span><span class="pln">          articles</span><span class="hljs-comment"><span class="com">#index</span></span></code></pre>

<p>
	أضف الحدث <code>index</code> المرتبط بهذا المسار إلى المتحكّم <code>ArticlesController</code> في الملف <code>app/controllers/articles_controller.rb</code>.
</p>

<p>
	من الممارسات الشائعة بين المطوّرين هو كتابة الحدث <code>index</code> في بداية المتحكّم:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<code class="hljs ruby"><span class="hljs-class"><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-title"><span class="typ">ArticlesController</span></span><span class="pln"> </span><span class="hljs-inheritance"><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-parent"><span class="typ">ApplicationController</span></span></span></span><span class="pln">
  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="pln">index
    </span><span class="hljs-variable"><span class="lit">@articles</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-constant"><span class="typ">Article</span></span><span class="pun">.</span><span class="pln">all
  </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="pln">show
    </span><span class="hljs-variable"><span class="lit">@article</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-constant"><span class="typ">Article</span></span><span class="pun">.</span><span class="pln">find</span><span class="pun">(</span><span class="kwd">params</span><span class="pun">[</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">id</span></span><span class="pun">])</span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="kwd">new</span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

  </span><span class="hljs-comment"><span class="com"># بقية الشيفرة ...</span></span>
</code></pre>

<p>
	بعدها أضف العرض الخاصّ بهذا الحدث والموجود في المسار <code>app/views/articles/index.html.erb</code> والذي يتضمّن الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<code class="hljs xml"><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">h1</span></span><span class="tag">&gt;</span></span><span class="pln">Listing articles</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">h1</span></span><span class="tag">&gt;</span></span><span class="pln">

</span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">table</span></span><span class="tag">&gt;</span></span><span class="pln">
  </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">tr</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">th</span></span><span class="tag">&gt;</span></span><span class="pln">Title</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">th</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">th</span></span><span class="tag">&gt;</span></span><span class="pln">Text</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">th</span></span><span class="tag">&gt;</span></span><span class="pln">
  </span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">tr</span></span><span class="tag">&gt;</span></span><span class="pln">

  </span><span class="vbscript"><span class="pun">&lt;%</span><span class="pln"> </span><span class="lit">@articles</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">each</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">do</span></span><span class="pln"> </span><span class="pun">|</span><span class="pln">article</span><span class="pun">|</span><span class="pln"> %&gt;</span></span><span class="pln">
    </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">tr</span></span><span class="tag">&gt;</span></span><span class="pln">
      </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">td</span></span><span class="tag">&gt;</span></span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> article</span><span class="pun">.</span><span class="pln">title %&gt;</span></span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">td</span></span><span class="tag">&gt;</span></span><span class="pln">
      </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">td</span></span><span class="tag">&gt;</span></span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> article</span><span class="pun">.</span><span class="pln">text %&gt;</span></span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">td</span></span><span class="tag">&gt;</span></span><span class="pln">
      </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">td</span></span><span class="tag">&gt;</span></span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> link_to </span><span class="hljs-comment"><span class="str">'Show'</span><span class="pun">,</span><span class="pln"> article_path</span><span class="pun">(</span><span class="pln">article</span><span class="pun">)</span><span class="pln"> %&gt;</span></span></span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">td</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">tr</span></span><span class="tag">&gt;</span></span><span class="pln">
  </span><span class="vbscript"><span class="pun">&lt;%</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln"> %&gt;</span></span><span class="pln">
</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">table</span></span><span class="tag">&gt;</span></span></code></pre>

<p>
	توجّه الآن إلى العنوان <code><a href="http://localhost:3000/articles" ipsnoembed="false" rel="external nofollow">http://localhost:3000/articles</a></code> في المتصفّح وستشاهد قائمة بجميع المقالات التي أنشأتها مسبقًا.
</p>

<h3 id="إضافة-الروابط-للتنقل-بين-صفحات-المدونة">
	إضافة الروابط للتنقل بين صفحات المدوّنة
</h3>

<p>
	أصبح بمقدورنا الآن إنشاء وعرض وسرد قائمة المقالات المتوفّرة في المدونة، ولكنّنا بحاجة إلى بعض الروابط التي تساعدنا في التنقل بين صفحات الموقع.
</p>

<p>
	افتح الملف <code>app/views/welcome/index.html.erb</code> وعدّله كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<code class="hljs xml"><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">h1</span></span><span class="tag">&gt;</span></span><span class="pln">Hello, Rails!</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">h1</span></span><span class="tag">&gt;</span></span><span class="pln">
</span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> link_to </span><span class="hljs-comment"><span class="str">'My Blog'</span><span class="pun">,</span><span class="pln"> controller</span><span class="pun">:</span><span class="pln"> </span><span class="str">'articles'</span><span class="pln"> %&gt;</span></span></span>
</code></pre>

<p>
	التابع <code>link_to</code> هو أحد دوال العروض المساعدة والمضمّنة في Rails، ووظيفة هذا التابع إنشاء رابط تشعّبي بالاستناد إلى النصّ الذي نمرّره إليه، وهو في حالتنا هذه المسار الخاص بسرد قائمة المقالات.
</p>

<p>
	لنضف بعض الروابط إلى العروض الأخرى، ولنبدأ بإضافة رابط إنشاء مقالة جديدة إلى الملف <code>app/views/articles/index.html.erb</code> قبل وسم <code>&lt;table&gt;</code>:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<code class="hljs mel"><span class="pun">&lt;</span><span class="hljs-variable"><span class="pun">%=</span></span><span class="pln"> link_to </span><span class="hljs-string"><span class="str">'New article'</span></span><span class="pun">,</span><span class="pln"> new_article_path </span><span class="hljs-variable"><span class="pln">%&gt;</span></span></code></pre>

<p>
	سيوجّه هذا الرابط المستخدم إلى الصفحة التي تتضمن استمارة إنشاء مقالة جديدة.
</p>

<p>
	سنضيف رابطًا آخر إلى الملفّ <code>app/views/articles/new.html.erb</code> بعد الاستمارة مباشرة، ليتمكن المستخدم من العودة إلى الصفحة الرئيسية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<code class="hljs r"><span class="pun">&lt;%=</span><span class="pln"> form_for </span><span class="pun">:</span><span class="pln">article</span><span class="pun">,</span><span class="pln"> url</span><span class="pun">:</span><span class="pln"> articles_path </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">f</span><span class="pun">|</span><span class="pln"> %&gt;
  </span><span class="hljs-keyword"><span class="pln">...</span></span><span class="pln">
</span><span class="pun">&lt;%</span><span class="pln"> </span><span class="kwd">end</span><span class="pln"> %&gt;

</span><span class="pun">&lt;%=</span><span class="pln"> link_to </span><span class="hljs-string"><span class="str">'Back'</span></span><span class="pun">,</span><span class="pln"> articles_path %&gt;</span></code></pre>

<p>
	وأخيرًا، سنضيف رابطًا إلى القالب <code>app/views/articles/show.html.erb</code> يوجّه المستخدم إلى الصفحة الرئيسية أيضًا، وبهذا يصبح بميسور من يستعرض مقالة معيّنة أن يرجع إلى الصفحة التي تعرض جميع المقالات:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<code class="hljs xml"><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">
  </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">strong</span></span><span class="tag">&gt;</span></span><span class="pln">Title:</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">strong</span></span><span class="tag">&gt;</span></span><span class="pln">
  </span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> </span><span class="lit">@article</span><span class="pun">.</span><span class="pln">title %&gt;</span></span><span class="pln">
</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">

</span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">
  </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">strong</span></span><span class="tag">&gt;</span></span><span class="pln">Text:</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">strong</span></span><span class="tag">&gt;</span></span><span class="pln">
  </span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> </span><span class="lit">@article</span><span class="pun">.</span><span class="pln">text %&gt;</span></span><span class="pln">
</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">

</span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> link_to </span><span class="hljs-comment"><span class="str">'Back'</span><span class="pun">,</span><span class="pln"> articles_path %&gt;</span></span></span></code></pre>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Quote
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة:</strong><br>
			إن كان الرابط يشير إلى حدث موجود في نفس المتحكّم فلا حاجة حينئذٍ إلى تحديد قيمة الخيار <code>:controller</code> لأنّ Rails يستخدم المتحكّم الحالي بصورة افتراضية.
		</p>
	</div>
</blockquote>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Quote
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة:</strong><br>
			في بيئة التطوير (وهي البيئة الافتراضية التي تعمل عليها حاليًّا) يقوم Rails بإعادة تحميل التطبيق في كلّ مرّة يتلقى فيها طلبًا، لذا لا حاجة لإيقاف تشغيل الخادوم وإعادة تشغيله لمشاهدة التحديثات.
		</p>
	</div>
</blockquote>

<h3 id="التحقق-من-المدخلات">
	التحقّق من المدخلات
</h3>

<p>
	لو نظرت إلى النموذج الذي أنشأناه سابقًا فسترى أنّ الملف بسيطٌ للغاية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<code class="hljs ruby"><span class="hljs-class"><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-title"><span class="typ">Article</span></span><span class="pln"> </span><span class="hljs-inheritance"><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-parent"><span class="typ">ApplicationRecord</span></span></span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span></code></pre>

<p>
	لاحظ أنّ الصنف <code>Article</code> موروث من الصنف <code>ApplicationRecord</code> وهو بدوره موروث من الصنف <code>ActiveRecord::Base</code> والذي يتضمّن الكثير من الوظائف والإجراءات الخاصة بالنماذج، مثل عمليات CRUD البسيطة (Create, Read, Update, Destroy) والتحقّق من البيانات Validation، إضافة إلى عمليات البحث المعقّدة وربط النماذج المختلفة مع بعضها البعض.
</p>

<p>
	ويقدّم إطار العمل Rails توابع متعدّدة تساعد في التحقق من البيانات المرسلة إلى النموذج. افتح الملف <code>app/models/article.rb</code> وأضف إليه الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<code class="hljs ruby"><span class="hljs-class"><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-title"><span class="typ">Article</span></span><span class="pln"> </span><span class="hljs-inheritance"><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-parent"><span class="typ">ApplicationRecord</span></span></span></span><span class="pln">
  validates </span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">title</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-symbol"><span class="pln">presence</span><span class="pun">:</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">true</span></span><span class="pun">,</span><span class="pln">
                    </span><span class="hljs-symbol"><span class="pln">length</span><span class="pun">:</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="hljs-symbol"><span class="pln">minimum</span><span class="pun">:</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span></code></pre>

<p>
	سيضمن هذا التغيير امتلاك كل مقالة جديدة في المدونة لعنوان يتألف من خمسة أحرف على الأقل. يتيح Rails التحقّق من أمور متنوّعة في النماذج، مثل التحقّق من وجود أو عدم تكرار الأعمدة والتحقّق من تنسيقها ووجود كائنات مرتبطة بها.
</p>

<p>
	لنجرّب الآن استدعاء الدالة <code>@article.save</code> في مقالة لا تمتلك عنوانًا وسنلاحظ أن الدالة ترجع القيمة <code>false</code>. لو عدنا إلى المتحكّم في الملف <code>app/controllers/articles_controller.rb</code> مرّة أخرى سنلاحظ بأنّنا لم نتحقّق من النتيجة التي ترجعها الدالة <code>@article.save</code> ضمن الحدث <code>create</code>. إن فشلت الدالة <code>@article.save</code> في أداء عملها، يجب أن نعيد المستخدم إلى استمارة إضافة مقالة جديدة، وللقيام بذلك عدّل حدثي <code>new</code> و <code>create</code> في الملف <code>app/controllers/articles_controller.rb</code> بالصورة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<code class="hljs livecodeserver"><span class="kwd">def</span><span class="pln"> </span><span class="hljs-built_in"><span class="kwd">new</span></span><span class="pln">
  </span><span class="lit">@article</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Article</span><span class="pun">.</span><span class="hljs-built_in"><span class="kwd">new</span></span><span class="pln">
</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">end</span></span></span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">create</span></span><span class="pln">
  </span><span class="lit">@article</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Article</span><span class="pun">.</span><span class="hljs-built_in"><span class="kwd">new</span></span><span class="pun">(</span><span class="pln">article_params</span><span class="pun">)</span><span class="pln">

  </span><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> </span><span class="lit">@article</span><span class="pun">.</span><span class="pln">save
    redirect_to </span><span class="lit">@article</span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">else</span></span><span class="pln">
    render </span><span class="hljs-string"><span class="str">'new'</span></span><span class="pln">
  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">end</span></span></span><span class="pln">
</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">end</span></span></span><span class="pln">

</span><span class="hljs-keyword"><span class="kwd">private</span></span><span class="pln">
  </span><span class="kwd">def</span><span class="pln"> article_params
    </span><span class="hljs-built_in"><span class="kwd">params</span></span><span class="pun">.</span><span class="hljs-built_in"><span class="kwd">require</span></span><span class="pun">(:</span><span class="pln">article</span><span class="pun">).</span><span class="pln">permit</span><span class="pun">(:</span><span class="pln">title</span><span class="pun">,</span><span class="pln"> </span><span class="pun">:</span><span class="hljs-keyword"><span class="pln">text</span></span><span class="pun">)</span><span class="pln">
  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">end</span></span></span></code></pre>

<p>
	سينشئ الحدث <code>new</code> متغيّرًا جديدًا من نوع <code>instance</code> يحمل الاسم <code>@article</code> وستتعرّف إلى سبب القيام بذلك بعد قليل.
</p>

<p>
	لاحظ أنّنا استخدمنا <code>render</code> داخل الحدث <code>create</code> بدلًا من <code>redirect_to</code> في حال إرجاع الدالة <code>save</code> للقيمة <code>false</code>. يستخدم التابع <code>render</code> لكي يتم تمرير الكائن <code>@article</code> إلى القالب الجديد عند تصييره. وعملية التصيير هذه تتم ضمن نفس الطلب الناتج من إرسال الاستمارة، في حين أن الدالة <code>redirect_to</code> تتسبّب في إرسال طلب آخر.
</p>

<p>
	الآن أعد تحميل الصفحة ذات العنوان <code><a href="http://localhost:3000/articles/new" ipsnoembed="false" rel="external nofollow">http://localhost:3000/articles/new</a></code> وحاول إضافة مقالة جديد دون عنوان، سترى بأنّ Rails يعيدك إلى صفحة الاستمارة، ولكن هذا ليس مفيدًا جدًّا. يجب إخبار المستخدم بحدوث خطأ ما، وللقيام بذلك عدّل الملف <code>app/views/articles/new.html.erb</code> للتحقّق من رسائل الخطأ:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7047_8" style="">
<code class="hljs xml"><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> form_for </span><span class="pun">:</span><span class="pln">article</span><span class="pun">,</span><span class="pln"> url</span><span class="pun">:</span><span class="pln"> articles_path </span><span class="hljs-keyword"><span class="kwd">do</span></span><span class="pln"> </span><span class="pun">|</span><span class="pln">f</span><span class="pun">|</span><span class="pln"> %&gt;</span></span><span class="pln">

  </span><span class="vbscript"><span class="pun">&lt;%</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> </span><span class="lit">@article</span><span class="pun">.</span><span class="pln">errors</span><span class="pun">.</span><span class="pln">any</span><span class="pun">?</span><span class="pln"> %&gt;</span></span><span class="pln">
    </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">div</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="atn">id</span></span><span class="pun">=</span><span class="hljs-value"><span class="atv">"error_explanation"</span></span><span class="tag">&gt;</span></span><span class="pln">
      </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">h2</span></span><span class="tag">&gt;</span></span><span class="pln">
        </span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> pluralize</span><span class="pun">(</span><span class="lit">@article</span><span class="pun">.</span><span class="pln">errors</span><span class="pun">.</span><span class="pln">count</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"error"</span></span><span class="pun">)</span><span class="pln"> %&gt;</span></span><span class="pln"> prohibited
        this article from being saved:
      </span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">h2</span></span><span class="tag">&gt;</span></span><span class="pln">
      </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">ul</span></span><span class="tag">&gt;</span></span><span class="pln">
        </span><span class="vbscript"><span class="pun">&lt;%</span><span class="pln"> </span><span class="lit">@article</span><span class="pun">.</span><span class="pln">errors</span><span class="pun">.</span><span class="pln">full_messages</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">each</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">do</span></span><span class="pln"> </span><span class="pun">|</span><span class="pln">msg</span><span class="pun">|</span><span class="pln"> %&gt;</span></span><span class="pln">
          </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">li</span></span><span class="tag">&gt;</span></span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> msg %&gt;</span></span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">li</span></span><span class="tag">&gt;</span></span><span class="pln">
        </span><span class="vbscript"><span class="pun">&lt;%</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln"> %&gt;</span></span><span class="pln">
      </span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">ul</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">div</span></span><span class="tag">&gt;</span></span><span class="pln">
  </span><span class="vbscript"><span class="pun">&lt;%</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln"> %&gt;</span></span><span class="pln">

  </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> f</span><span class="pun">.</span><span class="pln">label </span><span class="pun">:</span><span class="pln">title %&gt;</span></span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">br</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> f</span><span class="pun">.</span><span class="pln">text_field </span><span class="pun">:</span><span class="pln">title %&gt;</span></span><span class="pln">
  </span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">

  </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> f</span><span class="pun">.</span><span class="pln">label </span><span class="pun">:</span><span class="pln">text %&gt;</span></span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">br</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> f</span><span class="pun">.</span><span class="pln">text_area </span><span class="pun">:</span><span class="pln">text %&gt;</span></span><span class="pln">
  </span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">

  </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> f</span><span class="pun">.</span><span class="pln">submit %&gt;</span></span><span class="pln">
  </span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">

</span><span class="vbscript"><span class="pun">&lt;%</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln"> %&gt;</span></span><span class="pln">

</span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> link_to </span><span class="hljs-comment"><span class="str">'Back'</span><span class="pun">,</span><span class="pln"> articles_path %&gt;</span></span></span>
</code></pre>

<p>
	تحقّقنا في البداية من وجود أي أخطاء من خلال <code>@article.errors.any?</code>، وفي حال وجودها نعرض قائمة الأخطاء المتوفّرة من خلال <code>@article.errors.full_messages</code>.
</p>

<p>
	تأخذ الدالة <code>pluralize</code> معاملين الأول رقمي والثاني نصّي. إن كان العدد أكبر من واحد تتحوّل السلسلة النصّية تلقائيًا إلى صيغة الجمع.
</p>

<p>
	إن سبب إضافة <code>@article = Article.new</code> إلى المتحكّم <code>ArticlesController</code> هو أنّنا لو لم نقم بذلك لأصبحت قيمة المتغيّر <code>@articl</code> هي <code>nil</code>، وسيؤدي الاستدعاء <code>@article.errores.any?</code> إلى إطلاق خطأ.
</p>

<p>
	يحيط Rails الحقول التي تحتوي على أخطاء بوسم <code>&lt;div&gt;</code> مع صنف CSS يحمل الاسم <code>field_with_errors</code>، ويمكنك تعريف صنف CSS هذا لتنسيق الحقول حسب الرغبة.
</p>

<p>
	والآن ستتلقّى رسالة خطا مرتّبة عندما تحاول حفظ مقالة لا تتضمن عنوانًا.
</p>

<p>
	في الدرس القادم سنواصل العمل على النموذج حيث سنكتب الشيفرة المسؤولة عن تعديل المقالات وحذفها، ثم سنتعرّف على طريقة إنشاء علاقات بين النماذج المختلفة من خلال إضافة نموذج للتعامل مع التعليقات في المدونة.
</p>

<h3 id="المصدر">
	المصدر:
</h3>

<p>
	<a href="http://guides.rubyonrails.org/getting_started.html" rel="external nofollow">توثيقات Ruby on Rails</a>.
</p>
]]></description><guid isPermaLink="false">531</guid><pubDate>Sat, 16 Sep 2017 15:27:45 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x62A;&#x62D;&#x643;&#x651;&#x645;&#x627;&#x62A; Controllers &#x648;&#x627;&#x644;&#x639;&#x631;&#x648;&#x636; Views &#x641;&#x64A; &#x625;&#x637;&#x627;&#x631; &#x627;&#x644;&#x639;&#x645;&#x644; Rails</title><link>https://academy.hsoub.com/programming/ruby/rails/%D8%A7%D9%84%D9%85%D8%AA%D8%AD%D9%83%D9%91%D9%85%D8%A7%D8%AA-controllers-%D9%88%D8%A7%D9%84%D8%B9%D8%B1%D9%88%D8%B6-views-%D9%81%D9%8A-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-rails-r530/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_09/59bad7dd24be2_main2(3).png.e59033cc89edf86a669f0d99a4dacd08.png" /></p>

<p id="المتحكمات-والعروض-في-إطار-العمل-rails">
	تعرّفنا في<a href="https://academy.hsoub.com/programming/ruby/rails/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-ruby-on-rails-r526/" rel=""> الدرس السابق</a> على طريقة تثبيت إطار العمل Rails وبدأنا العمل على مشروعنا الأول وهو عبارة عن مدوّنة بسيطة، وقمنا بتشغيل الخادوم الخاص بإطار العمل.
</p>

<p>
	وفي هذا الدرس سنتعرّف على آلية عمل إطار العمل Rails من خلال مثال بسيط، ثم نشرع بعده ببناء مدونتنا البسيطة لنتعرف بصورة أكبر على العديد من المفاهيم التي يستند إليها هذا الإطار.
</p>

<h2 id="آلية-عمل-إطار-rails">
	آلية عمل إطار Rails
</h2>

<p>
	سنتعرّف على آلية عمل إطار Ruby on Rails من خلال مثال بسيط نعرض فيه مجموعة من الكلمات في الصفحة الرئيسية لتطبيقنا، وللقيام بذلك سنحتاج إلى متحكّم Controller وعرض View.
</p>

<p>
	وظيفة المتحكّم هي استقبال الطلبات الواردة إلى التطبيق، وتربط المسارات Routes بين الطلبات والمتحكّمات. وغالبًا ما يكون هناك أكثر من مسار واحد لكل متحكّم، ويمكن للمسارات المختلفة أن تؤدّي إلى أحداث Actions مختلفة، ووظيفة الحدث هي جمع المعلومات اللازمة وتقديمها إلى العرض.
</p>

<p>
	أمّا وظيفة العرض فواضحة من اسمه، وهي عرض المعلومات التي حصل عليها من الحدث بصورة مقروءة للإنسان. من الضروري هنا الانتباه إلى أن عملية جمع المعلومات تتمّ ضمن المتحكّم وليس ضمن العرض، ومهمّة العرض الوحيدة هي عرض المعلومات. يستخدم إطار Rails لغة قوالب خاصّة في العروض تدعى eRuby (اختصار لـ Embedded Ruby) والتي تُعالج بواسطة دورة الطلب في Rails قبل أن تُرسل إلى المستخدم.
</p>

<p>
	سلنجأ إلى أداة المولّد generator لإنشاء متحكّم يحمل اسم <code>Welcome</code> يتضمّن حدثًا باسم <code>index</code>. اكتب الأمر التالي في سطر الأوامر:
</p>

<pre class="ipsCode" id="ips_uid_781_9">
$ bin/rails generate controller Welcome index
</pre>

<p>
	سيقوم Rails بإنشاء مسار وعدد من الملفات.
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_781_11" style="">
<span class="pln">create  app</span><span class="pun">/</span><span class="pln">controllers</span><span class="pun">/</span><span class="pln">welcome_controller</span><span class="pun">.</span><span class="pln">rb
 route  get </span><span class="str">'welcome/index'</span><span class="pln">
invoke  erb
create    app</span><span class="pun">/</span><span class="pln">views</span><span class="pun">/</span><span class="pln">welcome
create    app</span><span class="pun">/</span><span class="pln">views</span><span class="pun">/</span><span class="pln">welcome</span><span class="pun">/</span><span class="pln">index</span><span class="pun">.</span><span class="pln">html</span><span class="pun">.</span><span class="pln">erb
invoke  test_unit
create    test</span><span class="pun">/</span><span class="pln">controllers</span><span class="pun">/</span><span class="pln">welcome_controller_test</span><span class="pun">.</span><span class="pln">rb
invoke  helper
create    app</span><span class="pun">/</span><span class="pln">helpers</span><span class="pun">/</span><span class="pln">welcome_helper</span><span class="pun">.</span><span class="pln">rb
invoke    test_unit
invoke  assets
invoke    coffee
create      app</span><span class="pun">/</span><span class="pln">assets</span><span class="pun">/</span><span class="pln">javascripts</span><span class="pun">/</span><span class="pln">welcome</span><span class="pun">.</span><span class="pln">coffee
invoke    scss
create      app</span><span class="pun">/</span><span class="pln">assets</span><span class="pun">/</span><span class="pln">stylesheets</span><span class="pun">/</span><span class="pln">welcome</span><span class="pun">.</span><span class="pln">scss</span></pre>

<p>
	ما يهمّنا من هذه الملفات هما المتحكم والموجود في المسار <code>app/controllers/welcome_controller.rb</code> والعرض الموجود في المسار <code>app/views/welcome/index.html.erb</code>.
</p>

<p>
	افتح الملف <code>app/views/welcome/index.html.erb</code> في محرّر النصوص المفضّل لديك، واحذف محتوياته واستبدلها بالشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_781_13" style="">
<span class="pun">&lt;</span><span class="pln">h1</span><span class="pun">&gt;</span><span class="typ">Hello</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Rails</span><span class="pun">!&lt;/</span><span class="pln">h1</span><span class="pun">&gt;</span></pre>

<p>
	بعد أن أنشئنا المتحكم والعرض يجب علينا إخبار Rails بالمسار الذي سيأخذ المستخدم إلى هذا العرض. نحن نرغب في حالتنا هذه أن يتم توجيه المستخدم إلى العرض عندما يتوجّه إلى العنوان <code><a href="http://localhost:3000" ipsnoembed="false" rel="external nofollow">http://localhost:3000</a></code>، ولكن صفحة الترحيب تشغل هذا المسار في الوقت الحاضر. بعد ذلك يجب إخبار Rails بموقع الصفحة الرئيسية ليتمكّن من عرضها للمستخدم.
</p>

<p>
	افتح الملف <code>config/routes.rb</code> في محرّر النصوص:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_781_15" style="">
<span class="typ">Rails</span><span class="pun">.</span><span class="pln">application</span><span class="pun">.</span><span class="pln">routes</span><span class="pun">.</span><span class="pln">draw </span><span class="kwd">do</span><span class="pln">
  get </span><span class="str">'welcome/index'</span><span class="pln">

  </span><span class="com"># For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html</span><span class="pln">
</span><span class="kwd">end</span></pre>

<p>
	الشيفرة أعلاه موجودة في ملف المسارات والذي يتضمّن مدخلات DSL خاصّة (DSL اختصار لـ domain-specific language) والتي تخبر Rail بطريقة ربط الطلبات الواردة إلى التطبيق بالمتحكمات والأحداث. عدّل هذا الملف بالصورة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_781_17" style="">
<span class="typ">Rails</span><span class="pun">.</span><span class="pln">application</span><span class="pun">.</span><span class="pln">routes</span><span class="pun">.</span><span class="pln">draw </span><span class="kwd">do</span><span class="pln">
  get </span><span class="str">'welcome/index'</span><span class="pln">

  root </span><span class="str">'welcome#index'</span><span class="pln">
</span><span class="kwd">end</span></pre>

<p>
	من خلال السطر <code>root 'welcome#index'</code> يربط إطار العمل Rails الطلبات الواردة إلى المسار الرئيسي في التطبيق مع الحدث <code>index</code> في المتحكّم <code>Welcome</code>، أما السطر <code>get 'welcome/index'</code> فيربط من خلاله Rails الطلبات الواردة إلى العنوان <code><a href="http://localhost:3000/welcome/index" ipsnoembed="false" rel="external nofollow">http://localhost:3000/welcome/index</a></code> بنفس الحدث ونفس المتحكّم، وقد تمّ إنشاء هذه الشيفرة من قبل أداة المولّد.
</p>

<p>
	والآن شغّل الخادوم الخاص بـ Rails ثمّ توجّه في المتصفّح إلى العنوان <code><a href="http://localhost:3000" ipsnoembed="false" rel="external nofollow">http://localhost:3000</a></code>، وستشاهد عبارة “Hello, Rails!” الموجودة في ملف <code>app/views/welcome/index.html.erb</code> وهذا يعني أن هذا المسار قد توجّه فعلًا إلى الحدث <code>index</code> في المتحكم <code>Welcome</code> والذي قام بدوره بتصيير العرض بصورة صحيحة.
</p>

<h2 id="البدء-بإنشاء-المدونة">
	البدء بإنشاء المدوّنة
</h2>

<p>
	بعد أن تعرّفنا على المتحكّمات والأحداث والعروض، لنبدأ العمل على مدوّنتنا.
</p>

<p>
	سننشئ الآن ما يسمى في إطار العمل Rail بالمورد <code>resourse</code>، والمورد هو مصطلح يعبّر عن مجموعة من العناصر المتشابهة، مثل المقالات، الأشخاص أو الحيوانات. ويمكن إنشاء create وقراءة read وتحديث update وإلغاء destroy العناصر في المورد، وتسمى هذه العمليات بعمليات CRUD.
</p>

<p>
	يقدّم Rails تابعًا باسم <code>resources</code> يمكن استخدامه للإفصاح عن مورد بنمط REST القياسي. يجب إضافة مورد المقالة إلى ملف <code>config/routes.rb</code> وكما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_781_11" style="">
<code class="hljs livecodeserver"><span class="typ">Rails</span><span class="pun">.</span><span class="pln">application</span><span class="pun">.</span><span class="pln">routes</span><span class="pun">.</span><span class="pln">draw </span><span class="hljs-built_in"><span class="kwd">do</span></span><span class="pln">
  </span><span class="hljs-built_in"><span class="kwd">get</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">'welcome/index'</span></span><span class="pln">

  resources </span><span class="pun">:</span><span class="pln">articles

  root </span><span class="hljs-string"><span class="str">'welcome#index'</span></span><span class="pln">
</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">end</span></span></span></code></pre>

<p>
	والآن إن قمت بتنفيذ الأمر <code>bin/rails routes</code> فستشاهد جميع المسارات الخاصّة بجميع الأحداث التي تتّصف بنمط REST. سنتعرّف على معنى عمود <code>prefix</code> وبقية الأعمدة في وقت لاحق، ولكن لاحظ أنّ Rails قد خمّن صيغة المفرد (article) واستخدمها في السياق الصحيح.
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_781_11" style="">
<code class="hljs ruby"><span class="hljs-variable"><span class="pln">$ </span></span><span class="pln">bin</span><span class="pun">/</span><span class="pln">rails routes
      </span><span class="hljs-constant"><span class="typ">Prefix</span></span><span class="pln"> </span><span class="hljs-constant"><span class="typ">Verb</span></span><span class="pln">   </span><span class="hljs-constant"><span class="pln">URI</span></span><span class="pln"> </span><span class="hljs-constant"><span class="typ">Pattern</span></span><span class="pln">                  </span><span class="hljs-constant"><span class="typ">Controller</span></span><span class="hljs-comment"><span class="com">#Action</span></span><span class="pln">
    articles </span><span class="hljs-constant"><span class="pln">GET</span></span><span class="pln">    </span><span class="pun">/</span><span class="pln">articles</span><span class="pun">(.</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">format</span></span><span class="pun">)</span><span class="pln">          articles</span><span class="hljs-comment"><span class="com">#index</span></span><span class="pln">
             </span><span class="hljs-constant"><span class="pln">POST</span></span><span class="pln">   </span><span class="pun">/</span><span class="pln">articles</span><span class="pun">(.</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">format</span></span><span class="pun">)</span><span class="pln">          articles</span><span class="hljs-comment"><span class="com">#create</span></span><span class="pln">
 new_article </span><span class="hljs-constant"><span class="pln">GET</span></span><span class="pln">    </span><span class="pun">/</span><span class="pln">articles</span><span class="pun">/</span><span class="kwd">new</span><span class="pun">(.</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">format</span></span><span class="pun">)</span><span class="pln">      articles</span><span class="hljs-comment"><span class="com">#new</span></span><span class="pln">
edit_article </span><span class="hljs-constant"><span class="pln">GET</span></span><span class="pln">    </span><span class="pun">/</span><span class="pln">articles</span><span class="pun">/</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">id</span><span class="pun">/</span><span class="pln">edit</span></span><span class="pun">(.</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">format</span></span><span class="pun">)</span><span class="pln"> articles</span><span class="hljs-comment"><span class="com">#edit</span></span><span class="pln">
     article </span><span class="hljs-constant"><span class="pln">GET</span></span><span class="pln">    </span><span class="pun">/</span><span class="pln">articles</span><span class="pun">/</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">id</span></span><span class="pun">(.</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">format</span></span><span class="pun">)</span><span class="pln">      articles</span><span class="hljs-comment"><span class="com">#show</span></span><span class="pln">
             </span><span class="hljs-constant"><span class="pln">PATCH</span></span><span class="pln">  </span><span class="pun">/</span><span class="pln">articles</span><span class="pun">/</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">id</span></span><span class="pun">(.</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">format</span></span><span class="pun">)</span><span class="pln">      articles</span><span class="hljs-comment"><span class="com">#update</span></span><span class="pln">
             </span><span class="hljs-constant"><span class="pln">PUT</span></span><span class="pln">    </span><span class="pun">/</span><span class="pln">articles</span><span class="pun">/</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">id</span></span><span class="pun">(.</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">format</span></span><span class="pun">)</span><span class="pln">      articles</span><span class="hljs-comment"><span class="com">#update</span></span><span class="pln">
             </span><span class="hljs-constant"><span class="pln">DELETE</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">articles</span><span class="pun">/</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">id</span></span><span class="pun">(.</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">format</span></span><span class="pun">)</span><span class="pln">      articles</span><span class="hljs-comment"><span class="com">#destroy</span></span><span class="pln">
        root </span><span class="hljs-constant"><span class="pln">GET</span></span><span class="pln">    </span><span class="pun">/</span><span class="pln">                            welcome</span><span class="hljs-comment"><span class="com">#index</span></span></code></pre>

<p>
	سنعمل الآن على إضافة خاصيتي إنشاء المقالات وعرضها، وستكون الاستمارة Form المسؤولة عن ذلك بالشكل التالي:
</p>

<p style="text-align: center;">
	<img alt="new_article.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24956" data-unique="1anwvvlu3" src="https://academy.hsoub.com/uploads/monthly_2017_09/new_article.png.f761b8107c5c2c96c661d53950e21841.png"></p>

<p>
	قد تبدو الاستمارة بدائيًّة ولكنّها كافية في الوقت الحاضر، وسنعمل على تحسين مظهرها فيما بعد.
</p>

<h3 id="إنشاء-المتحكمات-والمسارات-اللازمة">
	إنشاء المتحكّمات والمسارات اللازمة
</h3>

<p>
	في البداية يجب اختيار المسار الذي سيوجّه المستخدم إلى استمارة إنشاء المقالة الجديدة، وسنستخدم المسار <code>/articles/new</code> للقيام بهذه المهمّة، بعدها يصبح بميسور التطبيق أن يتلقّى الطلبات على هذا المسار. توجّه الآن في متصفحك إلى الرابط <code><a href="http://localhost:3000/articles/new" ipsnoembed="false" rel="external nofollow">http://localhost:3000/articles/new</a></code> وستتلقّى الخطأ التالي:
</p>

<p style="text-align: center;">
	<img alt="routing_error_no_controller.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24957" data-unique="6pirahdun" src="https://academy.hsoub.com/uploads/monthly_2017_09/routing_error_no_controller.png.079d0f9b911ef2113f40b33ac49d5737.png"></p>

<p>
	يحدث هذا الخطأ لأنّ المسار بحاجة إلى متحكّم يرسل إليه الطلب؛ لذا سنقوم بإنشاء متحكّم باسم <code>ArticlesController</code>، وذلك من خلال تنفيذ الأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_781_19">
$ bin/rails generate controller Articles</pre>

<p>
	افتح الملف الذي قمت بإنشائه <code>app/controllers/articles_controller.rb</code> وسترى متحكّمًا فارغًا:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_781_21" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">ArticlesController</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="typ">ApplicationController</span><span class="pln">
</span><span class="kwd">end</span></pre>

<p>
	المتحكّم عبارة عن صنف Class موروث من <code>ApplicationController</code> وسنقوم بتعريف التوابع ضمن هذا الصنف والتي ستمثل الأحداث الخاصّة بهذا المتحكم، وهذه الأحداث هي المسؤولة عن تنفيذ عمليات CRUD على المقالات الموجودة في تطبيقنا.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			تضمّ لغة Ruby توابع من نوع <code>public</code> و <code>private</code> و <code>protected</code> ولكن الأحداث هي توابع من نوع <code>public</code> حصرًا.
		</p>
	</div>
</blockquote>

<p>
	إن أعدت تحميل الصفحة ستتلقّى خطأً جديدًا:
</p>

<p style="text-align: center;">
	<img alt="unknown_action_new_for_articles.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24960" data-unique="ffdd2i0e1" src="https://academy.hsoub.com/uploads/monthly_2017_09/unknown_action_new_for_articles.png.077195e96111924e9fbdeed0b79306dc.png"></p>

<p>
	يشير هذا الخطأ إلى عدم قدرة Rails على إيجاد الحدث <code>new</code> ضمن المتحكّم <code>ArticlesController</code> الذي قمنا بإنشائه للتوّ. وهذا عائد إلى أنّ المتحكّمات تكون فارغة عند إنشائها إلا إذا حدّدنا الأحداث المطلوبة خلال عملية إنشاء المتحكّم.
</p>

<p>
	ولتعريف حدث جديد بصورة يدوية، سنحتاج فقط إلى تعريف تابع جديد ضمن المتحكم. افتح الملف <code>app/controllers/articles_controller.rb</code> وضمن الصنف <code>ArticlesController</code> عرّف تابعًا جديدًا وكما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_781_11" style="">
<code class="hljs ruby"><span class="hljs-class"><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-title"><span class="typ">ArticlesController</span></span><span class="pln"> </span><span class="hljs-inheritance"><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-parent"><span class="typ">ApplicationController</span></span></span></span><span class="pln">
  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="kwd">new</span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span></code></pre>

<p>
	والآن أعد تحميل الصفحة في المتصفّح وستتلقّى خطأً آخر:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="24958" href="https://academy.hsoub.com/uploads/monthly_2017_09/template_is_missing_articles_new.png.jpeg.8477cc2c580ce98cf664e02a1d536295.jpeg" rel=""><img alt="template_is_missing_articles_new.png.jpeg" class="ipsImage ipsImage_thumbnailed" data-fileid="24958" data-unique="r75hyekk5" src="https://academy.hsoub.com/uploads/monthly_2017_09/template_is_missing_articles_new.png.thumb.jpeg.2ed1ce134ceddb51752f5b1ed4d9e5db.jpeg"></a>
</p>

<p>
	يظهر هذا الخطأ لأنّ Rails يتوقّع أنه يجب أن تمتلك الأحداث الصرفة المشابهة لهذا الحدث عروضًا ترتبط معها لعرض المعلومات التي تتضمنها، ونظرًا لعدم وجود أي عرض مرتبط بهذا الحدث، أطلق Rails هذا الخطأ.
</p>

<p>
	لنطّلع على رسالة الخطأ الكاملة:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p style="text-align: left;">
			ArticlesController#new is missing a template for this request format and variant. request.formats: [“text/html”] request.variant: [] NOTE! For XHR/Ajax or <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> requests, this action would normally respond with 204 No Content: an empty white screen. Since you’re loading it in a web browser, we assume that you expected to actually render a template, not… nothing, so we’re showing an error to be extra-clear. If you expect 204 No Content, carry on. That’s what you’ll get from an XHR or <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> request. Give it a shot.
		</p>
	</div>
</blockquote>

<p>
	لنستعرض النص السابق سريعًا، ونفهم مضمونه بصورة جيدة.
</p>

<p>
	يحدّد الجزء الأول من نصّ الخطأ القالب المفقود، وفي هذه الحالة القالب المفقود هو <code>articles/new</code>. يبدأ Rails بالبحث عن هذا القالب، وإن لم يفلح في العثور عليه فإنه يحاول تحميل قالب يدعى <code>application/new</code> وذلك لأنّ المتحكّم <code>ArticleController</code> هو صنف موروث من المتحكّم <code>ApplicationController</code>.
</p>

<p>
	يتضمن الجزء الثاني من رسالة الخطأ <code>request.formats</code> والذي يحدّد صيغة القالب الذي سيتم عرضه كاستجابة للطلب الذي تلقّاه التطبيق، وقد تم اختيار صيغة <code>text/html</code> لأنّنا طلبنا هذه الصفحة بواسطة المتصفح؛ لذا يبحث Rails عن قوالب HTML. أما <code>request.variant</code> فيحدد طبيعة الأدوات المادّية physical devices التي سيتم تقديمها مع الطلب وتساعد Rails في تحديد القالب الذي سيستخدمه في الاستجابة، وهو فارغ نظرًا لعدم توفّر المعلومات.
</p>

<p>
	أبسط قالب يمكن أن يعمل في هذه الحالة هو القالب الموجود في المسار <code>app/views/articles/new.html.erb</code>. هذه اللاحقة مهمّة للغاية: فالجزء الأول من اللاحقة (.html) يعبّر عن صيغة القالب، أمّا الجزء الثاني (.erb) فيمثّل المعالج handler الذي سيتم استخدامه في تصيير القالب. يحاول Rails البحث عن قالب يحمل الاسم <code>articles/new</code> ضمن المجلد <code>app/views</code>. يجب أن تكون صيغة هذا القالب هي HTML حصرًا، وسيكون erb المعالج الافتراضي لـ HTML. يستخدم Rails عددًا من المعالجات مثل: builder والمستخدم في إنشاء قوالب XML، وcoffee الذي يستخدم لغة CoffeeScript لبناء قوالب JavaScript. بما أنّنا نرغب في بناء استمارة HTML جديدة فسنستخدم لغة ERB والتي تتيح لنا تضمين لغة Ruby في HTML.
</p>

<p>
	إذًا سيكون اسم القالب <code>articles/new.html.erb</code> وسيكون ضمن المجلد <code>app/views</code> الخاص بالتطبيق.
</p>

<p>
	أنشئ ملفًّا جديدًا باسم <code>new.html.erb</code> في المسار <code>app/views/articles</code> وأضف إليه ما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_781_11" style="">
<code class="hljs xml"><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">h1</span></span><span class="tag">&gt;</span></span><span class="pln">New Article</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">h1</span></span><span class="tag">&gt;</span></span></code></pre>

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

<h3 id="الاستمارة-الأولى">
	الاستمارة الأولى
</h3>

<p>
	سنستخدم منشئ النماذج form builder لإنشاء الاستمارة الأولى في هذا القالب. يمكن استخدام منشئ النماذج الرئيسي في Rails باستخدام التابع المساعد <code>form_for</code>. أضف الشيفرة التالية في الملف <code>app/views/articles/new.html.erb</code>:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_781_11" style="">
<code class="hljs xml"><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> form_for </span><span class="pun">:</span><span class="pln">article </span><span class="hljs-keyword"><span class="kwd">do</span></span><span class="pln"> </span><span class="pun">|</span><span class="pln">f</span><span class="pun">|</span><span class="pln"> %&gt;</span></span><span class="pln">
  </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> f</span><span class="pun">.</span><span class="pln">label </span><span class="pun">:</span><span class="pln">title %&gt;</span></span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">br</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> f</span><span class="pun">.</span><span class="pln">text_field </span><span class="pun">:</span><span class="pln">title %&gt;</span></span><span class="pln">
  </span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">

  </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> f</span><span class="pun">.</span><span class="pln">label </span><span class="pun">:</span><span class="pln">text %&gt;</span></span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">br</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> f</span><span class="pun">.</span><span class="pln">text_area </span><span class="pun">:</span><span class="pln">text %&gt;</span></span><span class="pln">
  </span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">

  </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="vbscript"><span class="pun">&lt;%=</span><span class="pln"> f</span><span class="pun">.</span><span class="pln">submit %&gt;</span></span><span class="pln">
  </span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">
</span><span class="vbscript"><span class="pun">&lt;%</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln"> %&gt;</span></span></code></pre>

<p>
	أعد تحميل الصفحة وستلاحظ ظهور نفس الاستمارة التي عرضناها في المثال السابق. كما تلاحظ فإنّ بناء الاستمارات في Rails أمر سهلٌ للغاية.
</p>

<p>
	عندما نستدعي التابع <code>form_for</code> فإننا نمرّر إليه عنصرًا يحدّد الهدف من هذه الاستمارة، والهدف في حالتنا هذه هو <code>:article</code>. يُستخدم الكائن <code>FormBuilder</code> والذي مثّلناه بـ <code>f</code> لبناء عنصري label وحقلي نصوص text fields لكلّ من عنوان المقال ومتنها. وفي النهاية استدعينا التابع <code>submit</code> لإنشاء زرّ اﻹرسال الخاصّ بالاستمارة.
</p>

<p>
	ولكن تعاني هذه الاستمارة من مشكلة صغيرة. لو تفحّصت شيفرة HTML التي تم توليدها من خلال الشيفرة السابقة فستلاحظ أن خاصية <code>action</code> التابعة للاستمارة تشير إلى المسار <code>articles/new</code> وهذا المسار هو نفسه الذي يقودنا إلى هذه الصفحة، والمفروض أن يستخدم هذا المسار لعرض استمارة إنشاء مقالة جديدة لا غير.
</p>

<p>
	إذًا يجب أن تستخدم الاستمارة مسارًا آخر، ويمكن القيام بذلك بسهولة من خلال استخدام الخيار <code>:url</code> في <code>form_for</code>. عادة ما يحمل الحدث المسؤول عن إرسال مقال جديد اسم “create”، لذا يجب توجيه الاستمارة إلى هذا الحدث.
</p>

<p>
	عدّل السطر الذي يتضمن <code>form_for</code> في ملف <code>app/views/articles/new.html.erb</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_781_11" style="">
<code class="hljs mel"><span class="pun">&lt;</span><span class="hljs-variable"><span class="pun">%=</span></span><span class="pln"> form_for </span><span class="pun">:</span><span class="pln">article</span><span class="pun">,</span><span class="pln"> url</span><span class="pun">:</span><span class="pln"> articles_path </span><span class="hljs-keyword"><span class="kwd">do</span></span><span class="pln"> </span><span class="pun">|</span><span class="pln">f</span><span class="pun">|</span><span class="pln"> </span><span class="hljs-variable"><span class="pln">%&gt;</span></span></code></pre>

<p>
	في هذا المثال تم تمرير الدالة المساعدة <code>articles_path</code> إلى الخيار <code>:url</code>، ولنتعرّف على نتيجة هذا التعديل سنلقي نظرة على مخرجات الأمر <code>bin/rails routes</code> في سطر اﻷوامر:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_781_11" style="">
<code class="hljs ruby"><span class="hljs-variable"><span class="pln">$ </span></span><span class="pln">bin</span><span class="pun">/</span><span class="pln">rails routes
      </span><span class="hljs-constant"><span class="typ">Prefix</span></span><span class="pln"> </span><span class="hljs-constant"><span class="typ">Verb</span></span><span class="pln">   </span><span class="hljs-constant"><span class="pln">URI</span></span><span class="pln"> </span><span class="hljs-constant"><span class="typ">Pattern</span></span><span class="pln">                  </span><span class="hljs-constant"><span class="typ">Controller</span></span><span class="hljs-comment"><span class="com">#Action</span></span><span class="pln">
    articles </span><span class="hljs-constant"><span class="pln">GET</span></span><span class="pln">    </span><span class="pun">/</span><span class="pln">articles</span><span class="pun">(.</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">format</span></span><span class="pun">)</span><span class="pln">          articles</span><span class="hljs-comment"><span class="com">#index</span></span><span class="pln">
             </span><span class="hljs-constant"><span class="pln">POST</span></span><span class="pln">   </span><span class="pun">/</span><span class="pln">articles</span><span class="pun">(.</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">format</span></span><span class="pun">)</span><span class="pln">          articles</span><span class="hljs-comment"><span class="com">#create</span></span><span class="pln">
 new_article </span><span class="hljs-constant"><span class="pln">GET</span></span><span class="pln">    </span><span class="pun">/</span><span class="pln">articles</span><span class="pun">/</span><span class="kwd">new</span><span class="pun">(.</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">format</span></span><span class="pun">)</span><span class="pln">      articles</span><span class="hljs-comment"><span class="com">#new</span></span><span class="pln">
edit_article </span><span class="hljs-constant"><span class="pln">GET</span></span><span class="pln">    </span><span class="pun">/</span><span class="pln">articles</span><span class="pun">/</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">id</span><span class="pun">/</span><span class="pln">edit</span></span><span class="pun">(.</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">format</span></span><span class="pun">)</span><span class="pln"> articles</span><span class="hljs-comment"><span class="com">#edit</span></span><span class="pln">
     article </span><span class="hljs-constant"><span class="pln">GET</span></span><span class="pln">    </span><span class="pun">/</span><span class="pln">articles</span><span class="pun">/</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">id</span></span><span class="pun">(.</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">format</span></span><span class="pun">)</span><span class="pln">      articles</span><span class="hljs-comment"><span class="com">#show</span></span><span class="pln">
             </span><span class="hljs-constant"><span class="pln">PATCH</span></span><span class="pln">  </span><span class="pun">/</span><span class="pln">articles</span><span class="pun">/</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">id</span></span><span class="pun">(.</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">format</span></span><span class="pun">)</span><span class="pln">      articles</span><span class="hljs-comment"><span class="com">#update</span></span><span class="pln">
             </span><span class="hljs-constant"><span class="pln">PUT</span></span><span class="pln">    </span><span class="pun">/</span><span class="pln">articles</span><span class="pun">/</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">id</span></span><span class="pun">(.</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">format</span></span><span class="pun">)</span><span class="pln">      articles</span><span class="hljs-comment"><span class="com">#update</span></span><span class="pln">
             </span><span class="hljs-constant"><span class="pln">DELETE</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">articles</span><span class="pun">/</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">id</span></span><span class="pun">(.</span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">format</span></span><span class="pun">)</span><span class="pln">      articles</span><span class="hljs-comment"><span class="com">#destroy</span></span><span class="pln">
        root </span><span class="hljs-constant"><span class="pln">GET</span></span><span class="pln">    </span><span class="pun">/</span><span class="pln">                            welcome</span><span class="hljs-comment"><span class="com">#index</span></span></code></pre>

<p>
	توجّه الدالة المساعدة <code>articles_pat</code> الاستمارة إلى نمط URI المرتبط لاحقة <code>articles</code> وسيرسل الاستمارة - تلقائيًا - طلبًا من نوع <code>POST</code> إلى المسار، والذي يرتبط بالحدث <code>create</code> التابع للمتحكّم ArticlesController.
</p>

<p>
	بعد أن أنشأنا الاستمارة وعرّفنا المسار المرتبط به، أصبح باﻹمكان تعبئة حقول الاستمارة والضغط على زرّ اﻹرسال لبدء عملية إنشاء مقال جديد، ولكن عند إرسال المقال ستتلقّى الخطأ المتوقَّع التالي:
</p>

<p style="text-align: center;">
	<img alt="unknown_action_create_for_articles.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24959" data-unique="ncdxn9qgu" src="https://academy.hsoub.com/uploads/monthly_2017_09/unknown_action_create_for_articles.png.f57d28818a8a47bb14d6500a353e62b0.png"></p>

<p>
	علاج هذا الخطأ بسيط وهو إنشاء الحدث <code>create</code> ضمن المتحكّم <code>ArticlesController</code>.
</p>

<h3 id="إنشاء-المقالات">
	إنشاء المقالات
</h3>

<p>
	سنقوم الآن بتعريف الحدث <code>create</code> ضمن صنف <code>ArticlesController</code> في الملف <code>app/controllers/articles_controller.rb</code> بعد الحدث <code>new</code> وكما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_781_11" style="">
<code class="hljs ruby"><span class="hljs-class"><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-title"><span class="typ">ArticlesController</span></span><span class="pln"> </span><span class="hljs-inheritance"><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-parent"><span class="typ">ApplicationController</span></span></span></span><span class="pln">
  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="kwd">new</span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="pln">create
  </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span></code></pre>

<p>
	إن أعدت إرسال الاستمارة مرة أخرى فستلاحظ عدم حدوث أي تغيير في الصفحة. لا تقلق، هذا الأمر عائد إلى أنّ Rails يعيد الاستجابة “204 No Content” لأي حدث لا يحدّد الاستجابة المطلوبة. وقد أضفنا الحدث <code>create</code> دون تحديد الاستجابة المطلوبة منه، وهي في حالتنا هذه، إنشاء مقالة جديدة في قاعدة البيانات.
</p>

<p>
	عند إرسال الاستمارة يتم إرسال الحقول الخاصة بها إلى Rails على هيئة معاملات parameters، يمكن الإشارة إليها في الأحداث التابعة للمتحكّم وذلك لإنجاز مهّمة ما، ولتعرف كيف تبدو هذه المعاملات عدّل حدث <code>create</code> بالصورة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_781_11" style="">
<code class="hljs livecodeserver"><span class="kwd">def</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">create</span></span><span class="pln">
  render plain</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-built_in"><span class="kwd">params</span></span><span class="pun">[:</span><span class="pln">article</span><span class="pun">].</span><span class="pln">inspect
</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">end</span></span></span></code></pre>

<p>
	يأخذ التابع <code>render</code> هنا <a href="https://academy.hsoub.com/programming/ruby/%D8%AC%D8%AF%D8%A7%D9%88%D9%84-%D8%A7%D9%84%D8%AA%D9%82%D8%B7%D9%8A%D8%B9-hash-tables-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r282/" rel="">جدول تقطيع Hash</a> بسيط مع المفتاح <code>:plain</code> والقيمة هي تابع params <code>[:article].inspect</code>. توابع params هي الكائن الذي يمثّل المعامل (أو الحقل) المأخوذ من الاستمارة. ويعيد تابع params كائن من نوع <code>ActionController::Parameters</code> والذي يتيح لنا الوصول إلى مفاتيح جدول التقطيع من خلال السلاسل النصّيّة Strings أو الرموز Symbols. وفي حالتنا هذه، فإن المعاملات المهمّة هي المعاملات المأخوذة من الاستمارة.
</p>

<p>
	لتوضيح عمل توابع params، إليك المثال التالي: في عنوان URL هذا: <code><a href="http://www.example.com/?username=dhh&amp;email=dhh@mail.com" ipsnoembed="false" rel="external nofollow">http://www.example.com/?username=dhh&amp;email=dhh@mail.com</a></code> فإن <code>params[:username]</code> تحمل القيمة “dhh” و <code>params[:email]</code> تحمل القيمة “dhh@mail.com”.
</p>

<p>
	والآن أعد إرسال الاستمارة مرة أخرى وستشاهد شيئًا مماثلًا لما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_781_11" style="">
<code class="hljs php"><span class="tag">&lt;ActionController::Parameters</span><span class="pln"> {</span><span class="hljs-string"><span class="atv">"title"</span></span><span class="tag">=&gt;</span><span class="hljs-string"><span class="pln">"First Article!"</span></span><span class="pln">, </span><span class="hljs-string"><span class="pln">"text"</span></span><span class="pln">=&gt;</span><span class="hljs-string"><span class="pln">"This is my first article."</span></span><span class="pln">} permitted: </span><span class="hljs-keyword"><span class="pln">false</span></span><span class="pln">&gt;</span></code></pre>

<p>
	يعرض هذا الحدث المعاملات الخاصة بالمقالة والمأخوذة من الاستمارة، ولكن ليس هذا ما نريده بالضبط، فنحن نشاهد المعاملات ولكنّها لا تقدّم أي فائدة تذكر في حالتها هذه.
</p>

<p>
	في الدرس القادم سنتعرّف على النماذج Models في إطار العمل Rails وسنستخدمها في إضافة مقالة جديدة إلى قاعدة البيانات التابعة للتطبيق.
</p>

<h3 id="المصدر">
	المصدر:
</h3>

<p>
	<a href="http://guides.rubyonrails.org/getting_started.html" rel="external nofollow">توثيقات Ruby on Rails</a>.
</p>
]]></description><guid isPermaLink="false">530</guid><pubDate>Tue, 12 Sep 2017 07:05:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x625;&#x637;&#x627;&#x631; &#x627;&#x644;&#x639;&#x645;&#x644; Ruby on Rails</title><link>https://academy.hsoub.com/programming/ruby/rails/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-ruby-on-rails-r526/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_09/59ad21af7d4e5_main(14).png.54361fb4e148c2b270ad9bb20add5ad7.png" /></p>

<p>
	Rails هو إطار عمل لتطوير تطبيقات الويب مكتوب بلغة Ruby البرمجية، وقد صُمّم إطار العمل هذا لتسهيل برمجة تطبيقات الويب من خلال وضع بعض الافتراضات المسبقة حول ما يحتاجه المطوّر للشروع في العمل. يتيح إطار العمل هذا كتابة شيفرات أقل وإنجاز أمور أكثر من أي لغة برمجية أو أطر عمل أخرى.
</p>

<p>
	يفترض Rails أن هناك طريقة مثلى لإنجاز الأعمال، وقد صمّم لتشجيع المطوّر على اتباع هذه الطرق وفي بعض الأحيان حثّه على ترك البدائل الأخرى، وقد تلاحظ زيادة هائلة في إنتاجيتك إن تعلّمت الأسلوب الذي يتبعه إطار العمل هذا، وقد يؤدي الالتزام بالعادات القديمة المتّبعة في لغات البرمجة الأخرى إلى تجربة غير جيّدة في تطوير التطبيقات باستخدام Rails.
</p>

<p>
	تستند فلسفة Rails إلى ركيزتين أساسيتين:
</p>

<ol>
<li>
		<p>
			لا تكرّر نفسك (Don’t Repeat Yourself): ينصّ هذا المفهوم على وجوب تمثيل أي جزء من أجزاء المعرفة بصورة مفردة وغير مبهمة وموثوقة في النظام. اتّباع هذا المفهوم في كتابة النصوص البرمجية وعدم تكرار المعلومات ذاتها باستمرار يؤدي إلى زيادة قابلية صيانة الشيفرة المكتوبة وامتلاكها القدرة على التوسّع إضافة إلى انخفاض نسبة الأخطاء فيها.
		</p>
	</li>
	<li>
		<p>
			مبدأ “Convention Over Configuration”: يمتلك Rails مبادئ خاصّة ترتبط بتحديد الطريقة المثلى في إنجاز الأعمال في تطبيق الويب، ويعتمد على هذه المبادئ بصورة افتراضية بدلًا من إجبار المطوّر على تحديد تفاصيل صغيرة في عمله من خلال عدد كبير من اﻹعدادات.
		</p>
	</li>
</ol>
<h2 id="ما-الذي-تحتاجه-للبدء">
	ما الذي تحتاجه للبدء
</h2>

<p>
	هذه السلسلة مخصصة للمبتدئين الذين يرغبون في الشروع ببناء التطبيقات على إطار العمل Rails، ولا يفترض وجود أي خبرة سابقة في هذا المجال، ولكن هناك بعض الأمور التي يجب تثبيتها قبل الشروع في التعلم:
</p>

<ul>
<li>
		تثبيت الإصدار 2.2.2 من لغة <a href="https://www.ruby-lang.org/en/downloads" rel="external nofollow">Ruby</a> البرمجية أو أي إصدار أعلى.
	</li>
	<li>
		تثبيت النسخة الملائمة من <a href="http://rubyinstaller.org/downloads/" rel="external nofollow">حزمة التطوير Development Kit</a> إن كنت من مستخدمي نظام التشغيل ويندوز.
	</li>
	<li>
		نظام إدارة الحزم (الجواهر) <a href="https://rubygems.org/" rel="external nofollow">RubyGems</a> والذي يأتي مع لغة Ruby بصورة افتراضية.
	</li>
	<li>
		تثبيت قواعد بيانات <a href="https://www.sqlite.org/" rel="external nofollow">SQLite3</a>.
	</li>
</ul>
<p>
	ذكرنا أنّ إطار العمل Rails مبني باستخدام لغة Ruby البرمجية، وإن كنت لا تمتلك خبرة مسبقة بهذه اللغة يمكنك مراجعة <a href="https://academy.hsoub.com/tags/ruby%20101/" rel="">الدروس المتوفّرة حول أساسيات لغة Ruby في الأكاديمية</a> إضافة إلى <a href="https://www.ruby-lang.org/en/documentation/" rel="external nofollow">الموقع الرسمي للغة</a>.
</p>

<h2 id="إنشاء-مشروع-جديد-في-rails">
	إنشاء مشروع جديد في Rails
</h2>

<p>
	الهدف من هذه السلسلة هو بناء مدوّنة بسيطة باستخدام إطار العمل Rails، وقبل البدء في بناء التطبيق يجب التأكد من تثبيت Rails في جهازك.
</p>

<p>
	سنستخدم الرمز $ للتعبير عن سطر الأوامر في الأنظمة الشبيهة بـ UNIX. أما في نظام ويندوز فسترى سطر الأوامر يبدأ بشيء مشابه لهذه الصيغة: &lt;<code>C:\source_code</code>.
</p>

<h3 id="تثبيت-rails">
	تثبيت Rails
</h3>

<p>
	توجّه إلى سطر الأوامر في جهازك (في نظام macOS افتح الطرفية Terminal.app، وفي نظام ويندوز اختر “Run” من قائمة ابدأ ثم اكتب <code>cmd.exe</code>). في البداية سنتأكد من إصدار لغة Ruby المثبت في الجهاز:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_1895_7" style="">
<span class="pln">$ ruby </span><span class="pun">-</span><span class="pln">v
ruby </span><span class="lit">2.3</span><span class="pun">.</span><span class="lit">1p112</span></pre>

<blockquote>
	<blockquote class="ipsQuote" data-ipsquote="">
		<div class="ipsQuote_citation">
			اقتباس
		</div>

		<div class="ipsQuote_contents ipsClearfix">
			<p>
				هناك العديد من الأدوات التي تساعد في تثبيت كلٍّ من Ruby و Ruby on Rails على جهازك. يمكن لمستخدمي نظام ويندوز استخدام <a href="http://railsinstaller.org/" rel="external nofollow">مثبت Rails</a>، أما مستخدمو نظام macOS فيمكنهم استخدام <a href="https://github.com/tokaido/tokaidoapp" rel="external nofollow">Tokaido</a>. ولمعرفة المزيد عن طرق التثبيت المتوفّرة لأنظمة التشغيل المتنوعة، راجع <a href="https://www.ruby-lang.org/en/" rel="external nofollow">الموقع الرسمي للغة Ruby</a> على شبكة الإنترنت.
			</p>
		</div>
	</blockquote>
</blockquote>

<p>
	بالنسبة لقواعد البيانات SQLite3 فعادة ما تكون مثبّتة بشكل افتراضي في الأنظمة الشبيهة بـ UNIX. أما في نظام ويندوز، فإن قمت بتثبيت Rails من خلال مثبت Rails فإن SQLite ستكون مثبتة على جهازك أيضاً. يمكنك كذلك مراجعة <a href="https://www.sqlite.org/" rel="external nofollow">موقع SQLite3</a> للاطلاع على تعليمات تثبيت قاعدة البيانات. يمكن التحقق من سلامة تثبيت SQLite3 من خلال الأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_1895_9">
$ sqlite3 --version</pre>

<p>
	إن كانت SQLite مثبتة في الجهاز فسيظهر رقم الإصدار المثبت في سطر الأوامر.
</p>

<blockquote>
	<blockquote class="ipsQuote" data-ipsquote="">
		<div class="ipsQuote_citation">
			اقتباس
		</div>

		<div class="ipsQuote_contents ipsClearfix">
			<p>
				في أنظمة Linux ستحتاج كذلك إلى تثبيت حزمة <code>libsqlite3-dev</code> (في Ubuntu)، <code>sqlite-devel</code> (في Fedora).
			</p>
		</div>
	</blockquote>
</blockquote>

<p>
	لتثبيت Rails استخدم أمر التثبيت <code>gem install</code> الذي يتيحه RubyGems وبالصورة التالية:
</p>

<pre class="ipsCode" id="ips_uid_1895_11">
$ gem install rails</pre>

<p>
	وللتأكد من أن عملية التثبيت قد تمّت بصورة صحيحة، يجب أن تكون قادرًا على تنفيذ الأمر التالي في سطر الأوامر:
</p>

<pre class="ipsCode" id="ips_uid_1895_13">
$ rails --version</pre>

<p>
	يجب أن تحصل على نتيجة مشابهة لهذه: <code>Rails 5.1.0</code>.
</p>

<h3 id="إنشاء-تطبيق-المدونة">
	إنشاء تطبيق المدوّنة
</h3>

<p>
	يقدّم إطار العمل Rails مجموعة من الشيفرات تحمل اسم المولّدات generators، وتهدف هذه الشيفرات إلى تسهيل عمل المطوّر من خلال إنشاء الملفات المطلوبة للشروع في مهمّة معيّنة. مولّد التطبيق الجديد هو أحد هذه المولّدات ويعمل على إنشاء تطبيق Rails جديد وتوفير عناء كتابته من قبل المطور.
</p>

<p>
	ولاستخدام المولّد توجّه في سطر الأوامر إلى المجلد الذي ترغب في إنشاء التطبيق فيه واكتب الأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_1895_15">
$ rails new blog</pre>

<p>
	سينشئ هذا الأمر تطبيقًا جديدًا باسم Blog في مجلد blog وسيثبت اعتماديات gem الموجودة في GEMfile باستخدام الأمر <code>bundle install</code>.
</p>

<blockquote>
	<blockquote class="ipsQuote" data-ipsquote="">
		<div class="ipsQuote_citation">
			اقتباس
		</div>

		<div class="ipsQuote_contents ipsClearfix">
			<p>
				إن كنت تستخدم ميزة Windows Subsystem for Linux على نظام تشغيل ويندوز (استخدام سطر أوامر Ubunut في ويندوز)، فهناك بعض المحدّدات على تنبيهات نظام التشغيل ويجب إيقاف جوهرتي spring و listen وذلك من خلال تنفيذ الأمر التالي:
			</p>

			<pre class="ipsCode" id="ips_uid_1895_17">

rails new blog --skip-spring --skip-listen</pre>
		</div>
	</blockquote>
</blockquote>

<p>
	يمكنك الاطلاع على جميع الخيارات المتاحة في سطر الأوامر والتي يتقبّلها مولّد تطبيقات Rails وذلك من خلال تنفيذ الأمر:
</p>

<pre class="ipsCode" id="ips_uid_1895_19">
rails new -h</pre>

<p>
	بعد إنشاء تطبيق المدوّنة، توجّه في سطر الأوامر إلى المجلّد الخاص به:
</p>

<pre class="ipsCode" id="ips_uid_1895_21">
$ cd blog</pre>

<p>
	ستلاحظ أنّ مجلّد المدونة يتضمن بعض الملفات والمجلّدات التي تم إنشاؤها بصورة تلقائية والتي تمثّل العمود الفقري لتطبيق Rails. سينحصر الجزء الأكبر من عملنا ضمن مجلد app، ولكن لا بأس في الاطلاع بصورة سريعة على وظيفة هذه الملفات والمجلّدات:
</p>

<center>
	<table border="1"><tbody>
<tr>
<td style="background-color: rgb(255,55,55); color: rgb(255,255,255); padding: 5px 10px; text-align: center;">
					الملف أو المجلد
				</td>
				<td style="background-color: rgb(255,55,55); color: rgb(255,255,255); padding: 5px 10px; text-align: center;">
					الوظيفة
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: left;">
					/app
				</td>
				<td style="padding: 5px 10px;">
					يتضمن هذا المجلّد: المتحكّمات controllers، النماذج models، العروض views، الدوال المساعدة helpers، دوال البريد اﻹلكتروني mailers، القنوات channels، الوظائف jobs، والأصول assets الخاصّة بالتطبيق. سيتركّز عملنا ضمن هذا المجلد.
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: left;">
					/bin
				</td>
				<td style="padding: 5px 10px;">
					يتضمّن هذا المجلد شيفرات Rails المسؤولة عن تشغيل التطبيق ويمكن أن يتضمن شيفرات أخرى تستخدم في تثبيت وتحديث ونشر وتشغيل التطبيق.
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: left;">
					/config
				</td>
				<td style="padding: 5px 10px;">
					يتضمن الإعدادات الخاصة بمسارات التطبيق routes، وقاعدة البيانات وغير ذلك
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: left;">
					config.ru
				</td>
				<td style="padding: 5px 10px;">
					ملف إعدادات Rack يستخدم في خواديم Rack لتشغيل التطبيق عليها.
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: left;">
					/db
				</td>
				<td style="padding: 5px 10px;">
					يتضمّن مخطط قاعدة البيانات الحالية، إضافة إلى تهجيرات قاعدة البيانات.
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: left;">
					Gemfile, Gemfile.lock
				</td>
				<td style="padding: 5px 10px;">
					يتيح هذان الملفان تحديد اعتماديات gem المطلوبة لتطبيق Rails. يستخدم Bundler هذه الملفات. لمزيد من المعلومات توجّه إلى موقع <a href="http://bundler.io/" rel="external nofollow">Bundler</a> الإلكتروني.
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: left;">
					/lib
				</td>
				<td style="padding: 5px 10px;">
					الوحدات الموسّعة الخاصة بالتطبيق.
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: left;">
					/log
				</td>
				<td style="padding: 5px 10px;">
					ملفات log الخاصة بالتطبيق.
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: left;">
					/public
				</td>
				<td style="padding: 5px 10px;">
					المجلد الوحيد الذي سيظهر على حاله بعد نشر التطبيق، ويتضمن الملفات الساكنة و ملفات الأصول المجمّعة.
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: left;">
					Rakefile
				</td>
				<td style="padding: 5px 10px;">
					يحدّد هذا الملف ويحمّل المهامّ التي يمكن تنفيذها بواسطة سطر الأوامر. يتم تعريف المهامّ ضمن مكوّنات Rails. ولإضافة مهامّ جديدة يجب عدم تعديل هذا الملف، بل إضافة ملفات إلى مجلّد <code>lig/tasks</code>.
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: left;">
					README.md
				</td>
				<td style="padding: 5px 10px;">
					الملفّ التعريفي الخاصّ بالتطبيق، ويمكن من خلاله تقديم نبذة تعريفية عن التطبيق والمهام التي يؤديها وطريقة التثبيت وغير ذلك من المعلومات.
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: left;">
					/test
				</td>
				<td style="padding: 5px 10px;">
					يضمّ هذا المجلد جميع الأمور المرتبطة بالاختبارات.
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: left;">
					/tmp
				</td>
				<td style="padding: 5px 10px;">
					يضمّ هذا المجلّد الملفّات المؤقتة (مثل ملفات الذاكرة المخبئية وملفات <abbr title="Process IDentifier | معرّف العملية أو البرنامج">pid</abbr>).
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: left;">
					/vendor
				</td>
				<td style="padding: 5px 10px;">
					ستجد هنا جميع شيفرات الطرف الثالث، وعادة ما يتضمن جواهر مطوّرة من قبل أشخاص أو شركات.
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: left;">
					gitignore.
				</td>
				<td style="padding: 5px 10px;">
					يخبر هذا الملف نظام التحكم في النسخ Git عن الملفات أو (الأنماط) التي ينبغي عليه تجاهلها. لتعرف المزيد راجع <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%B3%D9%8A%D8%B1-%D8%B9%D9%85%D9%84-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D9%86%D8%B3%D8%AE-git-r267/" rel="">سلسلة دروس Git في الأكاديمية</a>.
				</td>
			</tr>
</tbody></table>
</center>

<h2 id="مرحبا-rails" style="text-align: right;">
	مرحبًا Rails
</h2>

<p style="text-align: right;">
	لنحاول في البداية إظهار بعض النصوص على الشاشة وبصورة سريعة، وللقيام بذلك، ستحتاج إلى تشغيل الخادوم الخاص بـ Rails.
</p>

<h3 id="تشغيل-خادوم-rails" style="text-align: right;">
	تشغيل خادوم Rails
</h3>

<p style="text-align: right;">
	يتضمّن إطار العمل Rails خادوم ويب خاصًّا به وكل ما نحتاج إليه هو تشغيله وذلك من خلال تنفيذ الأمر التالي في سطر الأوامر ضمن مجلد blog:
</p>

<pre class="ipsCode" id="ips_uid_1895_23">
$ bin/rails server</pre>

<p style="text-align: right;">
	إن كنت تستخدم نظام ويندوز يجب تمرير الشيفرات في مجلد <code>bin</code> إلى مفسّر Ruby مباشرة:
</p>

<pre class="ipsCode" id="ips_uid_1895_25">
ruby bin\rails server</pre>

<blockquote>
	<blockquote class="ipsQuote" data-ipsquote="">
		<div class="ipsQuote_citation">
			اقتباس
		</div>

		<div class="ipsQuote_contents ipsClearfix">
			<p style="text-align: right;">
				يتطلب تجميع ضغط أصول CoffeScript و JavaScript وجود بيئة تنفيذ Javascript في نظام التشغيل، وبغياب هذه البيئة ستتلقى خطأ execjs عند تجميع الأصول. عادة ما تكون بيئة التنفيذ مثبتة بصورة افتراضية في أنظمة macOS وويندوز. يضيف إطار العمل Rails جوهرة <code>therubyracer</code> إلى ملف Gemfile الذي تم إنشاؤه على هيئة تعليق commented line، ويمكن استخدامه عند الحاجة بإزالة علامات التعليق. يفضل استخدام بيئة تطوير <code>therubyrhino</code> من قبل مستخدمي JRuby ويضاف افتراضيًّا إلى ملف Gemfile في التطبيقات التي يتم إنشاؤها بواسطة JRuby. ويمكنك الاطلاع على قائمة بيئات التنفيذ المدعومة في موقع <a href="https://github.com/rails/execjs#readme" rel="external nofollow">ExecJS</a>.
			</p>
		</div>
	</blockquote>
</blockquote>

<p style="text-align: right;">
	تنفيذ هذا الأمر سيؤدي إلى تشغيل Puma، وهو خادوم ويب مضمّن بصورة افتراضية في إطار العمل Rails.
</p>

<p style="text-align: right;">
	حان الآن وقت الولوج إلى تطبيقنا من خلال المتصفح وذلك بالتوجه إلى الرابط <a href="http://localhost:3000/" rel="external nofollow">http://localhost:3000/</a>. ستظهر الصفحة التالية لتشير إلى نجاحنا في إنشاء أول مشروع على Ruby on Rails.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="24905" href="https://academy.hsoub.com/uploads/monthly_2017_09/rails-welcome.png.212438295ed21c63d86b6230fa666200.png" rel=""><img alt="rails-welcome.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24905" data-unique="2oawhj347" src="https://academy.hsoub.com/uploads/monthly_2017_09/rails-welcome.thumb.png.7ec906b043245e577824bbebf027f807.png"></a>
</p>

<h2 id="المصدر" style="text-align: right;">
	المصدر:
</h2>

<p style="text-align: right;">
	<a href="http://guides.rubyonrails.org/getting_started.html" rel="external nofollow">توثيقات Ruby on Rails</a>.
</p>
]]></description><guid isPermaLink="false">526</guid><pubDate>Sat, 09 Sep 2017 07:00:00 +0000</pubDate></item></channel></rss>
