<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blogbangbang.com/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Blog Bang Bang - Tag - ruby</title>
  <link>http://blogbangbang.com/</link>
  <atom:link href="http://blogbangbang.com/feed/tag/ruby/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Tue, 26 Aug 2008 12:43:47 +0200</pubDate>
  <copyright>cc-by-sa</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>ActionView : Imprimeur de son état</title>
    <link>http://blogbangbang.com/post/2008/08/06/ActionView-%3A-Imprimeur-de-son-etat</link>
    <guid isPermaLink="false">urn:md5:7194a5b66f789ccf00710e3937f348c2</guid>
    <pubDate>Wed, 06 Aug 2008 00:37:00 +0200</pubDate>
    <dc:creator>jblanche</dc:creator>
        <category>tout public</category>
        <category>ruby</category><category>RubyOnRails</category><category>vulgarisation</category>    
    <description>&lt;p&gt;
3ème et dernière partie du Modèle M.V.C. dans Rails, la Vue.
&lt;/p&gt;
&lt;p&gt;
Comme vous l'avez compris dans la partie précédente, Ruby on Rails est capable de produire ou de servir
bien plus que des pages HTML et notamment du XML, du JSON, des images, du PDF... ...
&lt;br /&gt;
Toutefois, Rails a été particulièrement bien prévu pour la génération de HTML et en facilite grandement l'écriture...
&lt;/p&gt;    &lt;p&gt;
  Pour commencer sachez que le langage de templates inclus par défaut dans Rails se nomme &lt;strong&gt;erb&lt;/strong&gt;.
  &lt;br /&gt;
  D'autres existent (Builder, HAML... et ont leur intérêt, mais je m'attarderais ici seulement sur erb).
&lt;/p&gt;

&lt;p&gt;
  Celui-ci vous permet d'intégrer du code Ruby dans votre code HTML comme vous le faites avec les balises &amp;lt;? et ?&amp;gt; de PHP.
&lt;/p&gt;

&lt;p&gt;
  En Ruby deux types de balises existent : 
  &lt;ul&gt; 
    &lt;li&gt;Le code placé entre &amp;lt;% et %&amp;gt; sera interprété, mais pas affiché.&lt;/li&gt;
    &lt;li&gt;Le code placé entre &amp;lt;%= et %&amp;gt; sera interprété et affiché.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;
  On écrira par exemple pour afficher les informations d'un étudiant (méthode show) 
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;&amp;lt;h1&amp;gt;Présentation&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; Prénom: &amp;lt;%= h &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@student&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;firstname&lt;/span&gt; %&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; Nom: &amp;lt;%= h &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@student&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;lastname&lt;/span&gt; %&amp;gt;&amp;lt;br /&amp;gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp; &amp;lt;% &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@student&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;major&lt;/span&gt;? %&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Age : &amp;lt;%= &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@student&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;age&lt;/span&gt; %&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;% &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt; %&amp;gt;&lt;/code&gt;

&lt;p&gt;
  &lt;code&gt;@student&lt;/code&gt; étant la variable passée par notre controller dans la méthode &lt;code&gt;show&lt;/code&gt; dans la partie ActionController de ce tutoriel.
&lt;/p&gt;

&lt;p class=&quot;info&quot;&gt;
  N.B. : Je n'ai pas écrit les méthodes major? et age dans mon modèle Student dans le tutoriel sur ActiveRecord mais l'intégralité de cette 
  mini-application (absolument pas fonctionnelle) est disponible sur &lt;a href=&quot;http://github.com/&quot; hreflang=&quot;en&quot;&gt;Github&lt;/a&gt; sur &lt;a href=&quot;http://github.com/jblanche/tutoriel_ruby_rails/tree/master&quot;&gt;mon dépot&lt;/a&gt;.
  &lt;br /&gt;
  Vous trouverez ce modèle &lt;a href=&quot;http://github.com/jblanche/tutoriel_ruby_rails/tree/master/app/models/student.rb&quot;&gt;ici&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  Vous vous souvenez que l'on avait également une méthode update, censée mettre à jour les données d'un utilisateur provenant d'un formulaire.
&lt;/p&gt;

&lt;p&gt;
  Écrivons ce formulaire : 
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;&amp;lt;% form_for &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@student&lt;/span&gt; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt; |s| %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;%= s.&lt;span style=&quot;color:#9900CC;&quot;&gt;label&lt;/span&gt; &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:firstname&lt;/span&gt;, &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;Prénom&amp;quot;&lt;/span&gt; %&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;%= s.&lt;span style=&quot;color:#9900CC;&quot;&gt;text_field&lt;/span&gt; &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:firstname&lt;/span&gt; %&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;lt;%= s.&lt;span style=&quot;color:#9900CC;&quot;&gt;label&lt;/span&gt; &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:lastname&lt;/span&gt;, &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;Nom&amp;quot;&lt;/span&gt; %&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;%= s.&lt;span style=&quot;color:#9900CC;&quot;&gt;text_field&lt;/span&gt; &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:lastname&lt;/span&gt; %&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;lt;%= s.&lt;span style=&quot;color:#9900CC;&quot;&gt;label&lt;/span&gt; &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:date_of_birth&lt;/span&gt;, &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;Date de naissance&amp;quot;&lt;/span&gt; %&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;%= s.&lt;span style=&quot;color:#9900CC;&quot;&gt;date_select&lt;/span&gt; &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:date_of_birth&lt;/span&gt; %&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;lt;%= submit_tag &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;Enregistrer&amp;quot;&lt;/span&gt; %&amp;gt;&lt;br /&gt;
&amp;lt;% &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt; %&amp;gt;&lt;/code&gt;

&lt;p&gt;
  Pas mal non &lt;img src=&quot;/themes/john/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;Oui ok un coup de CSS ne ferait pas de mal, mais là n'est pas le sujet&lt;/p&gt;

&lt;p&gt;
  En passant le @student à la méthode &lt;code&gt;form_for&lt;/code&gt;, 
  celle-ci sait que le formulaire va modifier l'utilisateur existant et grâce à l'utilisation REST, elle peut aisément générer la balise &lt;code&gt;form&lt;/code&gt;correspondante.
&lt;/p&gt;

&lt;p&gt;
De même, l'utilisation du &lt;code&gt;|s|&lt;/code&gt; permet d'appeler les méthodes de rails pour construire un formulaire ( &lt;code&gt;text_field&lt;/code&gt;, &lt;code&gt;date_select&lt;/code&gt;, &lt;code&gt;hidden_field&lt;/code&gt;...)
en les associant à notre étudiant et donc de générer le code du formulaire avec les propriété &lt;code&gt;name&lt;/code&gt; des &lt;code&gt;input&lt;/code&gt; correctement renseignées.
&lt;/p&gt;

&lt;p&gt;
Regardez plutôt le code généré : 
&lt;/p&gt;

&lt;pre class=&quot;pre_code&quot;&gt;
&amp;lt;form action=&amp;quot;/students/1-Jonathan_Blanchet&amp;quot; class=&amp;quot;edit_student&amp;quot; id=&amp;quot;edit_student_1&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;
  &amp;lt;div style=&amp;quot;margin:0;padding:0&amp;quot;&amp;gt;
  &amp;lt;input name=&amp;quot;_method&amp;quot; type=&amp;quot;hidden&amp;quot; value=&amp;quot;put&amp;quot; /&amp;gt;
  &amp;lt;input name=&amp;quot;authenticity_token&amp;quot; type=&amp;quot;hidden&amp;quot; value=&amp;quot;c810f8897fcc7bab36a440cb4653b4f87de89d6e&amp;quot; /&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;label for=&amp;quot;student_firstname&amp;quot;&amp;gt;Prénom&amp;lt;/label&amp;gt;&amp;lt;br /&amp;gt;
  &amp;lt;input id=&amp;quot;student_firstname&amp;quot; name=&amp;quot;student[firstname]&amp;quot; size=&amp;quot;30&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;Jonathan&amp;quot; /&amp;gt;&amp;lt;br /&amp;gt;

  &amp;lt;label for=&amp;quot;student_lastname&amp;quot;&amp;gt;Nom&amp;lt;/label&amp;gt;&amp;lt;br /&amp;gt;
  &amp;lt;input id=&amp;quot;student_lastname&amp;quot; name=&amp;quot;student[lastname]&amp;quot; size=&amp;quot;30&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;Blanchet&amp;quot; /&amp;gt;&amp;lt;br /&amp;gt;
  ...
&amp;lt;/form&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
  Les inputs &lt;code&gt;_method&lt;/code&gt; et &lt;code&gt;authenticity_token&lt;/code&gt; sont automatiquement renseignés par Rails.
&lt;/p&gt;

&lt;p&gt;
  Le premier informe Rails sur le type de requête a utiliser selon la méthode REST (ici PUT) en attendant que les navigateurs 
  implémentent les méthodes &lt;code&gt;PUT&lt;/code&gt; et &lt;code&gt;DELETE&lt;/code&gt; (seulement &lt;code&gt;GET&lt;/code&gt; ET &lt;code&gt;POST&lt;/code&gt; sont actuellement supportées).
&lt;/p&gt;

&lt;p&gt;
  Le deuxième sert à protéger le formulaire contre des ataques extérieures mais comme le premier, vous n'aurez jamais à vous en soucier
&lt;/p&gt;

&lt;p&gt;
  Pour le reste, vous noterez la forme &lt;code&gt;student[propriété]&lt;/code&gt; de tous les inputs qui nous permettra de récupérer un tableau student contenant tous les attributs de notre étudiant.
&lt;/p&gt;

&lt;p&gt;
  Vous noterez également que les propriétés &lt;code&gt;value&lt;/code&gt; ont été automatiquement proprement remplies.
&lt;/p&gt;

&lt;p&gt;
Voilà pour notre formulaire.
&lt;/p&gt;

&lt;img title=&quot;Formulaire généré, aoû 2008&quot; style=&quot;margin: 0 auto; display: block;&quot; alt=&quot;&quot; src=&quot;http://blogbangbang.com/public/ActionView_updateForm.png&quot; /&gt;&lt;br /&gt;

&lt;p&gt;
  Vous vous souvenez surement que nos étudiants doivent avoir un nom et un prénom sous peine d'être &amp;quot;invalides&amp;quot; pour ActiveRecord.
&lt;/p&gt;

&lt;p&gt;
  Rajoutons en haut de notre page le code suivant : 
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;&amp;lt;%= error_messages_for &lt;span style=&quot;color:#996600;&quot;&gt;'student'&lt;/span&gt; %&amp;gt;&lt;/code&gt;
&lt;p&gt;
  Si on essaye désormais de sauvegarder notre utilisateur sans nom, nous aurons droit à ceci :
&lt;/p&gt;

&lt;img title=&quot;Erreurs de validation, aoû 2008&quot; style=&quot;margin: 0 auto; display: block;&quot; alt=&quot;&quot; src=&quot;http://blogbangbang.com/public/./.ActionView_errorsDisplay_m.jpg&quot; /&gt;&lt;br /&gt;

&lt;p&gt;Évidemment, tous ces messages sont personnalisables très facilement &lt;img src=&quot;/themes/john/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; &lt;/p&gt;

&lt;p&gt;
  Je ne vous parlerais pas ici d'AJAX car même si la facilité de mise en place de fonctionnalités AJAX avec Rails est souvent mise en avant dans les tutoriels,
  le code généré par Rails dans sa version actuelle n'est vraiment pas parfait et ne respecte pas le principe de séparation du contenu, de la présentation et du comportement (HTML - CSS - Javascript)
&lt;/p&gt;

&lt;p&gt;
  Pour les plus curieux, je vous invite à regarder du côté de &lt;a href=&quot;http://ujs4rails.com/&quot; hreflang=&quot;en&quot;&gt;UJS&lt;/a&gt; un plugin permettant d'écrire ce genre de choses : 
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;apply_behaviour &lt;span style=&quot;color:#996600;&quot;&gt;'.list_item:click'&lt;/span&gt; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt; |page, element, event|&lt;br /&gt;
&amp;nbsp; element.&lt;span style=&quot;color:#9900CC;&quot;&gt;replace_html&lt;/span&gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;Deleted.&amp;quot;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; event.&lt;span style=&quot;color:#9900CC;&quot;&gt;stop&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;
  Pour en savoir plus sur la notion de &lt;a href=&quot;http://en.wikipedia.org/wiki/Progressive_Enhancement&quot; hreflang=&quot;en&quot;&gt;Progressive Enhancement&lt;/a&gt; (utilisation propre du Javascript) 
  et sur les &lt;a href=&quot;http://alternateidea.com/event-selectors/&quot; hreflang=&quot;en&quot;&gt;CSS-based Selectors&lt;/a&gt;, je vous invite à lire &lt;a href=&quot;http://www.slideshare.net/matta/unobtrusive-javascript-sdrb-2007?src=embed&quot; hreflang=&quot;en&quot;&gt;cette excellente présentation&lt;/a&gt; (c'est court mais excellent) :
&lt;/p&gt;

&lt;p&gt;
  Voilà, c'est terminé pour la partie vue et plus largement, pour cette série d'articles.
&lt;/p&gt;

&lt;p&gt;
  J'espère vous avoir convaincu de l'intérêt de Ruby et de Ruby On Rails pour écrire vos applications Web.
&lt;/p&gt;

&lt;p&gt;
  Pour ma part, je m'étonne encore régulièrement de la facilité à écrire certaines choses en Ruby ! [private joke]Même une mamie Molette blonde pourrait le faire...[/private joke].
&lt;/p&gt;

&lt;p&gt;
  Je vous invite maintenant à me laisser en commentaire, toutes vos questions, réflexions, demandes sur cette série d'articles et/ou sur Ruby/Ruby On Rails en général.
  &lt;br /&gt;
  J'y répondrais avec plaisir et peut-être sous la forme d'une FAQ qui pourrait faire office de billet de clôture de cette série. 
&lt;/p&gt;</description>
    
    
    
          <comments>http://blogbangbang.com/post/2008/08/06/ActionView-%3A-Imprimeur-de-son-etat#comment-form</comments>
      <wfw:comment>http://blogbangbang.com/post/2008/08/06/ActionView-%3A-Imprimeur-de-son-etat#comment-form</wfw:comment>
      <wfw:commentRss>http://blogbangbang.com/feed/rss2/comments/91</wfw:commentRss>
      </item>
    
  <item>
    <title>ActionController : Monsieur Circulation</title>
    <link>http://blogbangbang.com/post/2008/07/30/ActionController-%3A-Monsieur-Circulation</link>
    <guid isPermaLink="false">urn:md5:1fc0572cc9cd4717ecf5213e6cbd8326</guid>
    <pubDate>Wed, 30 Jul 2008 23:10:00 +0200</pubDate>
    <dc:creator>jblanche</dc:creator>
        <category>tout public</category>
        <category>ruby</category><category>RubyOnRails</category><category>vulgarisation</category>    
    <description>&lt;p&gt;
Dans Rails, ActionController fait la circulation, il va à chaque requête, appeler les modèles nécessaires pour récupérer les données, puis appeler la méthode render pour afficher une vue, un XML... et vous renvoyer le tout.
&lt;/p&gt;
&lt;p&gt;
La politique Rails veut que les controllers soient légers.
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
&amp;quot;Skinny Controller, Fat Model&amp;quot;&lt;br /&gt;
&lt;cite&gt;Jamis Buck, 37signals employee&lt;/cite&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Et ça tombe bien Rails fourni tout ce qu'il faut pour vous simplifier la vie...
&lt;/p&gt;    &lt;p&gt;
  Imaginez par exemple que vous vouliez une interface de gestion de nos étudiants précédemment crées.
  &lt;br /&gt;
  Si nos souhaits se limitent à l'ajout, modification, suppression, le scaffold de Rails ferait l'affaire,
  mais on va ici partir &amp;quot;from scratch&amp;quot; pour vous montrer à quel point tout ceci est aisé.
&lt;/p&gt;

&lt;p&gt;
  On créera alors un Controller StudentsController 
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;script/generate controller Students&lt;/code&gt;

&lt;p&gt;
Rails2.1 permet de faire très facilement des controllers dit &amp;quot;Restful&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
  Si vous ne savez pas ce dont il s'agit je vous invite à lire l'excellente traduction de Biologeek d'un article de Softies on Rails :
  &lt;br /&gt;
  &lt;a href=&quot;http://www.biologeek.com/rest,traduction,web-semantique/pour-ne-plus-etre-en-rest-comprendre-cette-architecture/&quot;&gt;Pour ne plus être en REST, comprendre cette architecture&lt;/a&gt;
  &lt;br /&gt;
  et/ou celle-ci de pompage.net :
  &lt;br /&gt;
  &lt;a href=&quot;http://www.pompage.net/pompe/comment-j-ai-explique-rest-a-ma-femme/&quot;&gt;Comment j'ai expliqué REST à ma femme&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Si vous avez lu et compris, vous aurez retenu qu'avec REST on utilise tous les verbes du protocole HTTP et qu'on parle de ressources plutôt que de pages web ou d'images... 
&lt;/p&gt;
&lt;p&gt;
Les ressources, dans notre cas, ce sont des étudiants et voici quelques URLs qui vont nous intéresser 
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;GET &amp;nbsp; &amp;nbsp;/students &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:action&lt;/span&gt;=&amp;gt;&lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;index&amp;quot;&lt;/span&gt;&lt;br /&gt;
POST &amp;nbsp; /students &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:action&lt;/span&gt;=&amp;gt;&lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;create&amp;quot;&lt;/span&gt;&lt;br /&gt;
GET &amp;nbsp; &amp;nbsp;/students/new &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:action&lt;/span&gt;=&amp;gt;&lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;new&amp;quot;&lt;/span&gt;&lt;br /&gt;
GET &amp;nbsp; &amp;nbsp;/students/:id/edit &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:action&lt;/span&gt;=&amp;gt;&lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;edit&amp;quot;&lt;/span&gt;&lt;br /&gt;
GET &amp;nbsp; &amp;nbsp;/students/:id &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:action&lt;/span&gt;=&amp;gt;&lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;show&amp;quot;&lt;/span&gt;&lt;br /&gt;
PUT &amp;nbsp; &amp;nbsp;/students/:id &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:action&lt;/span&gt;=&amp;gt;&lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;update&amp;quot;&lt;/span&gt;&lt;br /&gt;
DELETE /students/:id &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:action&lt;/span&gt;=&amp;gt;&lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;destroy&amp;quot;&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;
  Vous aurez compris que pour afficher un utilisateur on fera /students/:id, 
  mais et c'est là où REST intervient, on utilisera la même adresse pour le supprimer et le modifier.
&lt;/p&gt;
&lt;p&gt;
  En effet une ressource = une URI, donc un utilisateur =&amp;gt; &amp;quot;/students/:id&amp;quot;
&lt;/p&gt;

&lt;p&gt;
  Par contre, le type de requête HTTP, respectivement GET, DELETE ET PUT nous informera sur ce que l'on souhaite faire.
&lt;/p&gt;

&lt;p&gt;
  Avec Rails, les actions appelées sont les méthodes publiques des controllers, écrivons donc la méthode qui va afficher un utilisateur 
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; show&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@student&lt;/span&gt; = Student.&lt;span style=&quot;color:#9900CC;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;params&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:id&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;
  &lt;strong&gt;Et voilà...&lt;/strong&gt;
  &lt;br /&gt;
  Quoi c'est tout :D
&lt;/p&gt;
&lt;p&gt;
Oui, pour l'instant cela peut suffire, en effet Rails a récupéré notre ressource (l'utilisateur désiré) grâce au find et par défaut, il va appeler la méthode render avec la vue correspondante (show) dans le dossier des vues.
&lt;/p&gt;

&lt;p&gt;
  Cette dernière aura accès aux variables d'instance de notre classe et donc à l'objet @student et toutes ses propriétés.
&lt;/p&gt;

&lt;p&gt;
  Essayons maintenant d'écrire la méthode nécessaire à la modification (update) d'un utilisateur.
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; update&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@student&lt;/span&gt; = Student.&lt;span style=&quot;color:#9900CC;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;params&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:id&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@student&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;update_attributes&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;params&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:student&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; redirect_to &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@student&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;  
  Dans la première ligne, je récupère l'étudiant à créer.
  &lt;br /&gt;
  Dans la seconde j'update ses attributs (donc propriétés) avec les paramètres passés par le formulaire.
  &lt;br /&gt;
  Dans la dernière je redirige l'utilisateur vers le student modifié (cela appellera la méthode show précédemment créée)
&lt;/p&gt;

&lt;p&gt;
  En réalité il faudrait gérer le fait que la sauvegarde se soit ou non bien passée, cela donnerait donc : 
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; update&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@student&lt;/span&gt; = Student.&lt;span style=&quot;color:#9900CC;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;params&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:id&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@student&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;update_attributes&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;params&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:student&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; redirect_to&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;@student&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; render &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:action&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;edit&amp;quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;
  C'est presque la même chose sauf que si la sauvegarde n'a pas fonctionné, on revient sur la page d'édition.
&lt;/p&gt;

&lt;p&gt;
  Voilà pour la version HTML, mais si vous avez compris REST, vous savez que l'on aimerait pouvoir 
  avoir d'autre représentation de notre ressource qu'une page web ! 
  &lt;br /&gt;
  Pourquoi pas par exemple,  une représentation XML que l'on pourrait passer à un webservice distant ou je ne sais quel autre usage.
&lt;/p&gt;

&lt;p&gt;
Ré-écrivons notre méthode show dans ce but 
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; show&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@student&lt;/span&gt; = Student.&lt;span style=&quot;color:#9900CC;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;params&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:id&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; respond_to &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt; |format|&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;format&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;html&lt;/span&gt; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# show.html.erb&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;format&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;xml&lt;/span&gt; &amp;nbsp;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#123;&lt;/span&gt; render &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:xml&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@student&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;
  Et voilà, notre controller répondra désormais à la demande générée.
  &lt;br /&gt;
  Si vous lui demandez du HTML, celui là réagira comme précédemment, si vous le voulez en XML, il exécutera la ligne : 
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;format&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;xml&lt;/span&gt; &amp;nbsp;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#123;&lt;/span&gt; render &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:xml&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@student&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;  

&lt;p&gt;
  et renverra donc notre objet student converti en XML.
&lt;/p&gt;

&lt;p&gt;
Vous voulez discuter avec une application Flash/Flex/AIR..., installez &lt;a href=&quot;http://www.rubyamf.org/&quot; hreflang=&quot;en&quot;&gt;RubyAMF&lt;/a&gt; 
(l'équivalent Ruby de &lt;a href=&quot;http://www.amfphp.org/&quot; hreflang=&quot;en&quot;&gt;AMFPHP&lt;/a&gt;) et il vous suffira de rajouter : 
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;format&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;amf&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#123;&lt;/span&gt; render &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:amf&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@student&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;
  Et voilà vous avez côté ActionScript votre objet tout chaud sans nécessité de désérialisation.
  &lt;br /&gt;
  Et vous n'avez presque rien eu à faire côté Rails et finalement, c'est normal, la logique et la ressource sont les mêmes, seul le rendu change ! 
&lt;/p&gt;

&lt;p&gt;
  Comme vous pouvez le voir, ActionController se débrouille donc très bien pour faire la circulation entre la vue et les modèles. 
&lt;/p&gt;


&lt;img src=&quot;http://blogbangbang.com/public/./.carrefour_m.jpg&quot; alt=&quot;carrefour&quot; style=&quot;margin: 0 auto; display: block;&quot; title=&quot;Spaghetti Junction, Chris Gin&quot; /&gt;

&lt;p&gt;
  Une des rares autres tâches qui incombe au controller est le contrôle des accès, 
  si vous souhaitez vérifier que l'utilisateur connecté peut accéder à telle ou telle ressource, c'est à lui de s'en charger.
&lt;/p&gt;

&lt;p&gt;
  Imaginons dans notre exemple, que les étudiants puissent consulter les informations les concernant, 
  mais que seul l'intendance puisse les éditer, ajouter, supprimer.
&lt;/p&gt;

&lt;p&gt;
  Ajoutons à notre controller la ligne suivante : 
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;before_filter &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:authenticate&lt;/span&gt; , &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:exept&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:index&lt;/span&gt;, &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:show&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;
  Cela signifie qu'avant toutes les méthodes sauf index et show,
  on exécutera la méthode authenticate et que l'on ne fera la suite que si cette méthode renvoi &lt;code&gt;true&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;
On peut donc rajouter à la fin de notre controller la méthode authenticate :
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;private&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; authenticate&lt;br /&gt;
&amp;nbsp; authenticate_or_request_with_http_basic &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt; |username, password|&lt;br /&gt;
&amp;nbsp; &amp;nbsp; username == &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt; &amp;amp;&amp;amp; password == &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;bar&amp;quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;
  On notera que la méthode a été placée après le mot clé private afin de signifier 
  que celle-ci n'est pas une action exécutable par le navigateur.
&lt;/p&gt;

&lt;p&gt;
  Notre action va ouvrir une boite de dialogue (si l'utilisateur n'est pas encore authentifier)
  nous demandant notre login et mot de passe et renverra true si et seulement si ceux-ci sont &amp;quot;foo&amp;quot; et &amp;quot;bar&amp;quot;
  &lt;br /&gt;
  N.B. : Evidement, en réalité, cette vérification s'effectuerait en base de donnée &lt;img src=&quot;/themes/john/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;
  Et voilà, désormais seul les personnes connaissant les logins et mot de passe ont accès à l'intégralité de l'application. 
&lt;/p&gt;

&lt;p&gt;
Ce sera tout pour ce soir, nous avons désormais vu &lt;a href=&quot;http://blogbangbang.com/post/2008/07/15/ruby_cest_quoi_comme_langage&quot;&gt;comment écrire&lt;/a&gt; &lt;a href=&quot;http://blogbangbang.com/post/2008/07/19/Un-peu-de-syntaxe-Ruby&quot;&gt;du Ruby&lt;/a&gt;, puis, comment fonctionnent les parties &lt;a href=&quot;http://blogbangbang.com/post/2008/07/25/ActiveRecord-%3A-Vos-donnees-c-est-mon-dada&quot;&gt;Model&lt;/a&gt; et Controller de Rails.
&lt;/p&gt;

&lt;p&gt;
  Il ne nous reste donc plus qu'une partie à aborder : les vues. 
  &lt;br /&gt;
  A bientôt pour ce dernier chapitre. 
&lt;/p&gt;</description>
    
    
    
          <comments>http://blogbangbang.com/post/2008/07/30/ActionController-%3A-Monsieur-Circulation#comment-form</comments>
      <wfw:comment>http://blogbangbang.com/post/2008/07/30/ActionController-%3A-Monsieur-Circulation#comment-form</wfw:comment>
      <wfw:commentRss>http://blogbangbang.com/feed/rss2/comments/89</wfw:commentRss>
      </item>
    
  <item>
    <title>ActiveRecord : Vos données, c'est mon dada.</title>
    <link>http://blogbangbang.com/post/2008/07/25/ActiveRecord-%3A-Vos-donnees-c-est-mon-dada</link>
    <guid isPermaLink="false">urn:md5:95127ed41e1bfcfd8b64485c06e3940a</guid>
    <pubDate>Fri, 25 Jul 2008 22:24:00 +0200</pubDate>
    <dc:creator>jblanche</dc:creator>
        <category>tout public</category>
        <category>ruby</category><category>RubyOnRails</category><category>vulgarisation</category>    
    <description>&lt;p&gt;
Nous allons donc commencer par le M du M.V.C., le modèle :
&lt;br /&gt;
ActiveRecord c'est le gestionnaire de vos données et donc la plupart du temps, de votre Base de données dans Rails
&lt;br /&gt;
Ça tombe bien, la partie Base de données est surement la plus magique de Rails...
&lt;/p&gt;    &lt;p&gt;
Question à 100 piasses : Qui aime écrire du SQL ?
&lt;br /&gt;
Ceux qui ont répondu OUI peuvent s'en aller :D
&lt;/p&gt;
&lt;p&gt;
En effet que ce soit à la création ou au traitement de vos données, vous n'écrirez pratiquement jamais de SQL avec Rails.
&lt;br /&gt;
Mais alors comment on les crée nos bases ? 
&lt;/p&gt;
&lt;p&gt;
La réponse de Rails s'appelle les migrations.
&lt;br /&gt;
Quand vous voulez créer une nouvelle table, vous créez (ou faite faire à Rails) une nouvelle migration, celle-ci comporte deux méthodes &amp;quot;up&amp;quot; et &amp;quot;down&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
De cette manière, il sera aisé pour Rails de revenir en arrière si finalement votre implémentation de la base ne vous plait pas.
&lt;/p&gt;
&lt;p&gt;
La création de ce modèle s'écrira : (à exécuter en console ou dans l'interface de votre IDE)
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;script/generate model Student firstname:&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;string&lt;/span&gt; lastname:&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;string&lt;/span&gt; date_of_birth:date section:&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;string&lt;/span&gt; promotion_id:&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;integer&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
On précise que l'on veut créer un modèle, on donne ensuite son nom, puis les colonnes de la base de données avec leur types.
&lt;/p&gt;
&lt;p&gt;
En exécutant ceci, vous créer tous les fichiers de votre modèle dont une migration ressemblant à ceci, dans le up, on crée notre table, dans le down on la supprime. 
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;class&lt;/span&gt; AddStudents &amp;lt; &lt;span style=&quot;color:#6666ff; font-weight:bold;&quot;&gt;ActiveRecord::Migration&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color:#0000FF; font-weight:bold;&quot;&gt;self&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;up&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; create_table &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:students&lt;/span&gt; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt; |t|&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;string&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:firstname&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;string&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:lastname&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;span style=&quot;color:#9900CC;&quot;&gt;date&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:date_of_birth&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;string&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:section&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#S pour Scientifique, L pour Littéraire, ES pour Economique et Social&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;integer&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:promotion_id&lt;/span&gt; &amp;nbsp;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;span style=&quot;color:#9900CC;&quot;&gt;timestamps&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color:#0000FF; font-weight:bold;&quot;&gt;self&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;down&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; drop_table &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:students&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
Plutôt simple n'est-ce pas ? Et avec ça Rails s'adaptera à votre base de données, qu'elle soit Mysql, Postgresql, Oracle, SQLite...
&lt;/p&gt;
&lt;p&gt;
Et si demain vous changez Mysql pour Postgres, il suffira de faire un petit
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;rake db:migrate&lt;/code&gt;
&lt;p&gt;
pour récréer toutes vos tables (En réalité, Ruby éxécutera à la suite toutes les méthodes up de vos migrations).
&lt;/p&gt;
&lt;p&gt;
Vous aurez surement remarqué le promotion_id, on supposera dans ce tutorial que l'on a ailleurs une table Promotion avec notamment l'année de la promo et que ce champ servira à faire le lien 
entre un étudiant et sa promotion.
&lt;/p&gt;
&lt;p&gt;
Ok, mais cette liaison elle est définie où ? On a pas écrit les contraintes dans notre SQL là ?
&lt;br /&gt;
Oui c'est vrai, allons donc modifier nos modèles pour changer ça. 
Et puisque nous y somme, nous indiquerons qu'un étudiant doit forcément avoir un nom et un prénom (lignes not null en quelque sorte) 
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;class&lt;/span&gt; Promotion &amp;lt; &lt;span style=&quot;color:#6666ff; font-weight:bold;&quot;&gt;ActiveRecord::Base&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; has_many &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:students&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;
&lt;br /&gt;
&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;class&lt;/span&gt; Student &amp;lt; &lt;span style=&quot;color:#6666ff; font-weight:bold;&quot;&gt;ActiveRecord::Base&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; belongs_to &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:promotion&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; validates_presence_of &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:firstname&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; validates_presence_of &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:lastname&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
Difficile de faire plus clair non ?
&lt;/p&gt;
&lt;p&gt;
Oui mais dans le code après comment ça se passe ?
&lt;/p&gt;
&lt;p&gt;
Imaginez que vous souhaitiez récupérer tous les étudiants (en gros un &lt;code&gt;SELECT * FROM students&lt;/code&gt;)
&lt;br /&gt;
vous ferez simplement
&lt;/p&gt;
 
&lt;code class=&quot;Ruby&quot;&gt;Student.&lt;span style=&quot;color:#9900CC;&quot;&gt;all&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
Si vous voulez récupérer la ligne correspondant à la promotion de 2006 : 
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;promo_2006 = Promotion.&lt;span style=&quot;color:#9900CC;&quot;&gt;find_by_year&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color:#006666;&quot;&gt;2006&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
Les étudiants de cette promo : 
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;promo_2006.&lt;span style=&quot;color:#9900CC;&quot;&gt;students&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
Allez compliquons un peu, il n'y a pas de &lt;code&gt;where&lt;/code&gt;, pas de conditions dans nos requête actuelles, ajoutons les :
&lt;/p&gt;
&lt;p&gt;
Disons que l'on ne veut récupérer que les étudiants Scientifiques.
&lt;br /&gt;
Ajoutons à notre modèle la ligne suivante : 
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;named_scope &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:scientists&lt;/span&gt;, &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:conditions&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#123;&lt;/span&gt;:section =&amp;gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;S&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
EN francais : on nommera &amp;quot;scientists&amp;quot; les étudiants ayant comme section &amp;quot;S&amp;quot;
&lt;br /&gt;
On peut désormais écrire 
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;Student.&lt;span style=&quot;color:#9900CC;&quot;&gt;scientists&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
pour récupérer tous les étudiants scientifiques 
&lt;/p&gt;
&lt;p&gt;
Ces &lt;code&gt;named_scope&lt;/code&gt; sont géniaux, ajoutons-en deux pour trouver les étudiant majeurs et mineurs.
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;named_scope &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:majors&lt;/span&gt;, &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:conditions&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#996600;&quot;&gt;'date_of_birth &amp;lt; ?'&lt;/span&gt;, &lt;span style=&quot;color:#006666;&quot;&gt;18&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;years&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;ago&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;br /&gt;
named_scope &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:minors&lt;/span&gt;, &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:conditions&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#996600;&quot;&gt;'date_of_birth &amp;gt; ?'&lt;/span&gt;, &lt;span style=&quot;color:#006666;&quot;&gt;18&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;years&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;ago&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
On peut maintenant faire dans tous nos Controllers : 
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;Student.&lt;span style=&quot;color:#9900CC;&quot;&gt;majors&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
Pour récupérer les étudiants majeurs.
&lt;/p&gt;
&lt;p&gt;
Et si l'on veut, dans la promo 2006, les étudiants à la fois majeurs et scientifiques : 
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;promo_2006.&lt;span style=&quot;color:#9900CC;&quot;&gt;students&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;majors&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;scientists&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
Et le tour est joué ! 
&lt;br /&gt;
Incroyable non ? (qui me l'écrit en SQL avec la jointure et tout et tout ?)
&lt;/p&gt;

&lt;p&gt;
C'est le moment de citer DHH  : 
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
Beautiful code makes happy programmers.&lt;br /&gt;
&lt;cite&gt;David Heinemeier Hansson, Créateur de Rails&lt;/cite&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Voilà pour les requêtes, pour créer un enregistrement, c'est tout aussi simple : 
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;jb = Student.&lt;span style=&quot;color:#9900CC;&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:firstname&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;Jonathan&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:lastname&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;Blanchet&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
La création précédente fonctionnera puisqu'elle remplie bien les conditions décrites précédemment (un étudiant à forcément un nom et un prénom). 
&lt;/p&gt;
&lt;p&gt;
Allez un dernier exemple pour la route, imaginez que la personne utilisant cette application souhaite,
dans l'interface de création des utilisateurs, pouvoir les lier à une promotion en tapant simplement l'année de celle-ci.
&lt;/p&gt;
&lt;p&gt;
Côté modèle, cela veut dire qu'il va falloir trouver la promotion si elle existe, la crée sinon.
&lt;/p&gt;
&lt;p&gt;
Une fois traduit en Rails cela donne : 
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;Promotion.&lt;span style=&quot;color:#9900CC;&quot;&gt;find_or_create_by_year&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;params&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:year&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
Simple non &lt;img src=&quot;/themes/john/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; 
&lt;/p&gt;
&lt;p&gt;
Allez je vous attend pour la suite, on verra le rôle du Controller.
&lt;/p&gt;</description>
    
    
    
          <comments>http://blogbangbang.com/post/2008/07/25/ActiveRecord-%3A-Vos-donnees-c-est-mon-dada#comment-form</comments>
      <wfw:comment>http://blogbangbang.com/post/2008/07/25/ActiveRecord-%3A-Vos-donnees-c-est-mon-dada#comment-form</wfw:comment>
      <wfw:commentRss>http://blogbangbang.com/feed/rss2/comments/87</wfw:commentRss>
      </item>
    
  <item>
    <title>Rails, la locomotive de Ruby !</title>
    <link>http://blogbangbang.com/post/2008/07/25/Rails-la-locomotive-de-Ruby</link>
    <guid isPermaLink="false">urn:md5:3767570209b7ca63d0e55f91a11e7c04</guid>
    <pubDate>Fri, 25 Jul 2008 22:20:00 +0200</pubDate>
    <dc:creator>jblanche</dc:creator>
        <category>tout public</category>
        <category>ruby</category><category>RubyOnRails</category><category>vulgarisation</category>    
    <description>&lt;p&gt;
On a vu dans les deux &lt;a href=&quot;http://blogbangbang.com/post/2008/07/15/ruby_cest_quoi_comme_langage&quot;&gt;articles&lt;/a&gt; &lt;a href=&quot;http://blogbangbang.com/post/2008/07/19/Un-peu-de-syntaxe-Ruby&quot;&gt;précédents&lt;/a&gt; les rudiments de la syntaxe Ruby.
&lt;br /&gt;
Normalement, vous êtes déjà séduit par ces débuts, mais vous n'avez encore rien vu !
&lt;br /&gt;
Alors ? Ce Ruby on Rails, qu'est ce donc ?
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Rails is the killer app for Ruby.&lt;br /&gt;
&lt;cite&gt;Yukihiro Matsumoto, Createur de Ruby&lt;/cite&gt;
&lt;/p&gt;
&lt;/blockquote&gt;    &lt;p&gt;
Ruby on Rails, ou Rails, en fait, est un framework dédié au développement d'application Web.
&lt;br /&gt;
Un framework, c'est selon Wikipedia, un ensemble de bibliothèques, d'outils et de conventions permettant le développement d'applications.
&lt;br /&gt;
Ceux-ci permettent donc de donner un socle commun à toutes vos applications et en facilite du même coup le développement et la maintenance.
&lt;/p&gt;
&lt;p&gt;
Rails a été à l'origine développé pour les besoins de la société américaine 37signals qui devant le succès et l'engouement remporté par l'application au sein de son activité, a décidé d'en extraire un framework qu'elle &amp;quot;donnerait&amp;quot; à la communauté du logiciel libre.
&lt;/p&gt;
&lt;p&gt;
Rails suit les principes déjà énoncés dans les articles sur Ruby et y ajoute deux grandes règles :
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;La convention plutôt que la configuration&lt;/strong&gt;&lt;br /&gt;
Le principal défaut des frameworks Java était souvent leur configuration au travers de 18 fichiers XML tous plus flous les uns que les autres !
Avec Rails, c'est tout l'inverse : votre table s'appelle Students, votre modèle s'appellera Student...
C'est également pour cette raison que Rails vient avec une architecture de fichiers et de dossiers bien précise, l'application ira dans app, les tests dans test...
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DRY ou Don't Repeat Yourself&lt;/strong&gt;&lt;br /&gt;
Le code doit être écrit de façon à éviter toute redondance qui compliquerait les phases de maintenances, de test, de debuggage...
Les modifications doivent se faire à un endroit et n'impacter que les objets concernés.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
En plus de ces deux règles, Rails comme la majorité des frameworks dédié au Web s'articule autour du modèle MVC ou Modèle-Vue-Controller.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les modèles sont les classes assurent la gestion des données, ils sont habituellement liés à la base de données.&lt;/li&gt;
&lt;li&gt;Les vues déterminent comment sont affichées les informations à l'utilisateur. Il s'agit généralement d'une combinaison de code HTML et de Ruby.&lt;/li&gt;
&lt;li&gt;Les contrôleurs réagissent aux requêtes utilisateur et répondent d'ordinaire à l'aide des vues.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Pour faire simple, voici le chemin d'une requête web avec Rails : &lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;requete_rails.png, juil 2008&quot; style=&quot;margin: 0 auto; display: block;&quot; alt=&quot;&quot; src=&quot;http://blogbangbang.com/public/./.testSchema_m.jpg&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Vous appelez une page, celle-ci correspond à une méthode, dans un controller.&lt;/li&gt;
&lt;li&gt;Celui-ci appelle un ou plusieurs modèles pour récupérer les informations nécessaires pour vous répondre.&lt;/li&gt;
&lt;li&gt;Il envoie ces données données à la vue qui va interpréter et renvoyer le code HTML (ou autre) désiré.&lt;/li&gt;
&lt;li&gt;La réponse vous est envoyée. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
On trouve partout sur internet, des tutoriels vous expliquant comment construire un blog fonctionnel en 10mn, un site en une demi-heure et Youtube en 2 jours &lt;img src=&quot;/themes/john/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;
&lt;br /&gt;
Ces tutoriels, mêmes s'ils incitent souvent les débutants à essayer Ruby et Rails, restent trop basique et trop axé sur un exemple particulier pour vraiment montrer les avantages de Rails.
&lt;br /&gt;
Je vais donc pour ma part vous parler de chaque grande partie de Rails (selon le MVC) en vous montrant ce qui selon moi, fait la différence entre Rails et le reste du monde &lt;img src=&quot;/themes/john/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;
On commence tout de suite avec celui qui va gérer vos données, le modèle de Rails, nommé ActiveRecord, &lt;a href=&quot;http://blogbangbang.com/post/2008/07/25/ActiveRecord-%3A-Vos-donnees-c-est-mon-dada&quot;&gt;suivez-moi...
&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blogbangbang.com/post/2008/07/25/Rails-la-locomotive-de-Ruby#comment-form</comments>
      <wfw:comment>http://blogbangbang.com/post/2008/07/25/Rails-la-locomotive-de-Ruby#comment-form</wfw:comment>
      <wfw:commentRss>http://blogbangbang.com/feed/rss2/comments/86</wfw:commentRss>
      </item>
    
  <item>
    <title>Un peu de syntaxe Ruby...</title>
    <link>http://blogbangbang.com/post/2008/07/19/Un-peu-de-syntaxe-Ruby</link>
    <guid isPermaLink="false">urn:md5:b321fcff2130283e52e18ff69d7bb514</guid>
    <pubDate>Sat, 19 Jul 2008 22:05:00 +0200</pubDate>
    <dc:creator>jblanche</dc:creator>
        <category>tout public</category>
        <category>ruby</category><category>RubyOnRails</category><category>vulgarisation</category>    
    <description>&lt;p&gt;
Vous avez apprécier &lt;a href=&quot;http://blogbangbang.com/post/2008/07/15/ruby_cest_quoi_comme_langage&quot;&gt;l'article précédent&lt;/a&gt; ?
&lt;br /&gt;
Alors, essayons d'écrire un peu plus de Ruby...
&lt;/p&gt;
&lt;p class=&quot;info&quot;&gt;
Pour commencer, si vous souhaitez tester ces exemples sur votre poste je vous invite à installer Ruby sur votre machine.&lt;br /&gt;
Pour les autres, vous pouvez tester &lt;a href=&quot;http://tryruby.hobix.com/&quot; hreflang=&quot;en&quot;&gt;en ligne&lt;/a&gt; ou vous contenter de lire :).
&lt;br /&gt;&lt;br /&gt;
Pour l'installation, les Linuxiens se débrouillerons avec leur gestionnaire de paquets pour installer les paquets ruby irb et rdoc.&lt;br /&gt;
&lt;br /&gt;
Pour les utilisateurs de Windows, je vous invite à utiliser le &lt;a href=&quot;http://Rubyforge.org/frs/?group_id=167&quot; hreflang=&quot;en&quot;&gt;one-click install&lt;/a&gt; qui vous donnera
tout ce qu'il faut pour commencer.
&lt;/p&gt;    &lt;p&gt;
  Comme je le disais dans le précédent article, la syntaxe de Ruby peut étonner au premier abord, mais sa lisibilité en est fortement améliorée.
  Regardons ces quelques lignes tirées ou inspirés du fameux &amp;quot;&lt;a href=&quot;http://poignantguide.net/ruby/&quot; hreflang=&quot;en&quot;&gt;Why's (poignant) guide to Ruby&lt;/a&gt;&amp;quot; et de 
  &lt;a href=&quot;http://www.softiesonrails.com/&quot; hreflang=&quot;en&quot;&gt;Softiesonrails&lt;/a&gt; pour s'en convaincre.
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#006666;&quot;&gt;5&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;times&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;Hello!&amp;quot;&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;
  Essayons de lire ce bout de code en anglais, &lt;strong&gt;Five times print Hello&lt;/strong&gt;, je vous laisse deviner ce qu'il fait &lt;img src=&quot;/themes/john/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; 
&lt;/p&gt;

&lt;p&gt;
  Un autre exemple : 
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;exit&lt;/span&gt; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;unless&lt;/span&gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;restaurant&amp;quot;&lt;/span&gt;.&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;include&lt;/span&gt;? &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;aura&amp;quot;&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;
  En anglais lu : &lt;strong&gt;Exit unless restaurant includes aura&lt;/strong&gt;
  &lt;br /&gt;
  Avec cette ligne, notre programme va se terminer (exit) sauf si (unless) le mot &amp;quot;restaurant&amp;quot; contient (include?) le mot &amp;quot;aura&amp;quot;.
&lt;/p&gt;

&lt;p&gt;
  On retiendra de cette ligne le &lt;code&gt; unless &lt;/code&gt;, assez rare dans les autres langages qui est en 
  fait l'inverse du &lt;code&gt;if&lt;/code&gt; ainsi que l'utilisation très judicieuse du point d'interrogation dans le nom
  de méthode include? pour signifier une question, un test (est-ce que &amp;quot;restaurant&amp;quot; contient &amp;quot;aura&amp;quot; &lt;strong&gt;?&lt;/strong&gt;.
  &lt;br /&gt;
  Vous aurez déduis que les méthodes ce terminant par un point d'interrogation retourneront normalement &lt;code&gt;true&lt;/code&gt; ou &lt;code&gt;false&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;
  Allez écrivons maintenant une petite méthode (ou fonction si vous préférez, mais normalement en Programmation Orientée Objet on dit méthode).
&lt;/p&gt;

&lt;p&gt;
  Imaginez un appareil photo, écrivons la méthode qui prend une photo.
  &lt;br /&gt;
  Celle-ci vérifiera si l'appareil est allumé et s'il reste de la place sur la carte mémoire. 
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; capture_clicked &lt;br /&gt;
&amp;nbsp; capture_image &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@camera&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;on&lt;/span&gt;? &amp;amp;&amp;amp; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@camera&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;memory_available&lt;/span&gt;? &lt;br /&gt;
&amp;nbsp;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;
  Comme vous pouvez le constater, une méthode Ruby s'écrit avec &lt;code&gt;def&lt;/code&gt; et &lt;code&gt;end&lt;/code&gt;.
  &lt;br /&gt;
  Pour le reste c'est encore une fois plutôt standard, vous remarquerez toutefois qu'en Ruby, on peut écrire la clause &lt;code&gt;if&lt;/code&gt; à la fin de l'instruction ce qui améliore la lisibilité.
  &lt;br /&gt;
  En effet, ce que l'on veut faire dans notre cas (99% du temps) c'est &lt;strong&gt;capture_screen&lt;/strong&gt;, 
  il est donc logique de le voir tout dès le début de la méthode et pas encadré par un &lt;code&gt;if&lt;/code&gt; comme ce serait le cas dans beaucoup d'autres langages.
&lt;/p&gt;

&lt;p&gt;
  Imaginons maintenant qu'on vous demande une méthode qui prendrai des photos en mode rafale tant qu'il y a de place, vous écrieriez alors simplement : 
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; rafale&lt;br /&gt;
&amp;nbsp; capture_image &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@camera&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;memory_available&lt;/span&gt;?&lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;
  Allez un dernier exemple pour la route, écrivons une petite classe Etudiant.
  &lt;br /&gt;
  Celui-ci aura un nom, un prénom et un âge.
  &lt;br /&gt;
  on a déjà tous écrit un truc du style avec une classe avec trois propriétés et leurs &amp;quot;getters&amp;quot;. 
&lt;/p&gt;

&lt;code class=&quot;PHP&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; Etudiant&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$prenom&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$nom&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$age&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; Etudiant&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;prenom, nom, age&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;prenom&lt;/span&gt; = prenom;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;nom&lt;/span&gt; = nom;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;age&lt;/span&gt; = age;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; prenom&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;prenom&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; nom&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;nom&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; age&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;age&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &amp;nbsp; &lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;
  C'est moche n'est-ce pas !
  &lt;br /&gt;
  Et bien en Ruby cela nous donne :
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;class&lt;/span&gt; Etudiant&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; attr_reader &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:prenom&lt;/span&gt;, &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:nom&lt;/span&gt;, &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:age&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; initialize&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;prenom, nom, age&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@prenom&lt;/span&gt;, &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@nom&lt;/span&gt;, &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@age&lt;/span&gt; = prenom, nom, age&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;
  Alors, vous voyez bien que le mot sexy n'était pas exagéré pour décrire la syntaxe de Ruby &lt;img src=&quot;/themes/john/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;
  Pour information, si l'on veut aussi les &amp;quot;setters&amp;quot;, en PHP ce sera trois nouvelles fonctions en Ruby on remplacera juste : 
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;attr_reader &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:prenom&lt;/span&gt;, &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:nom&lt;/span&gt;, &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:age&lt;/span&gt;&lt;/code&gt;

&lt;p&gt; 
  par  
&lt;/p&gt; 

&lt;code class=&quot;Ruby&quot;&gt;attr_accessor &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:prenom&lt;/span&gt;, &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:nom&lt;/span&gt;, &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:age&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;
  et si l'on veut mettre un peu de logique dans le getter, pour récupérer le prénom avec une majuscule au début, il suffira de l'écrire à la main
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; prenom&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@prenom&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;capitalize&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;
  Vous vous demandez quand même surement ce que sont ces &lt;code&gt;@&lt;/code&gt; que l'on peut voir devant certaines variables.
  &lt;br /&gt;
  Ce signe sert à distinguer les variables d'instances (les attributs d'un objet) des variables locales (à une méthode ou autre).
  &lt;br /&gt;
  Il existe également des variables notées &lt;code&gt;@@ma_variable&lt;/code&gt;, celles-ci sont des variables de classes, elles sont donc attachées à la classe et non à son instance.
&lt;/p&gt;

&lt;p&gt;
  Regardez ce petit exemple pour mieux comprendre : 
&lt;/p&gt;

&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;class&lt;/span&gt; Voiture&lt;br /&gt;
&amp;nbsp; @@nom = &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;Renault Clio&amp;quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; attr_accessor &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:nom&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; initialize&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;nom&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@nom&lt;/span&gt; = nom&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; nom&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@nom&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;capitalize&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; se_presente&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;puts&lt;/span&gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;Je suis une &amp;quot;&lt;/span&gt;+@@nom+&lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot; surnomée &amp;quot;&lt;/span&gt;+nom&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;
&lt;br /&gt;
&lt;code class=&quot;Ruby&quot;&gt;ma_voiture = Voiture.&lt;span style=&quot;color:#9900CC;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;titine&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
ma_voiture.&lt;span style=&quot;color:#9900CC;&quot;&gt;se_presente&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;
  Cet exemple va afficher &lt;br /&gt;
  &lt;strong&gt;Je suis une Renault Clio surnommée Titine.&lt;/strong&gt; &lt;br /&gt;
  Vous remarquerez au passage que je peux appeler les méthodes sans les parenthèses, 
  celles-ci sont optionnelles et les conventions veulent qu'on ne les écrive pas quand il n'y a pas de paramètres.
&lt;/p&gt;

&lt;p&gt;
  Pour résumer pour les habitués à PHP : 
  &lt;br /&gt;
  &lt;code&gt;nom&lt;/code&gt; équivaut à &lt;code&gt;$nom&lt;/code&gt;&lt;br /&gt;
  &lt;code&gt;@nom&lt;/code&gt; équivaut à &lt;code&gt;$this-&amp;gt;nom&lt;/code&gt;&lt;br /&gt;
  &lt;code&gt;@@nom&lt;/code&gt; équivaut à &lt;code&gt;self::$nom&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
  Alors, c'est qui qui a la plus &lt;del&gt;grosse&lt;/del&gt; belle syntaxe ?
  &lt;br /&gt;
  Voilà pour ce soir, j'espère que vous avez encore appris plein de belles choses sur Ruby 
  [troll]et je m'excuse d'avance pour les larmes versées lors de votre prochaine tentative de codage en PHP, ActionScript, Cobol ou Fortran :D [/troll] 
&lt;/p&gt;</description>
    
    
    
          <comments>http://blogbangbang.com/post/2008/07/19/Un-peu-de-syntaxe-Ruby#comment-form</comments>
      <wfw:comment>http://blogbangbang.com/post/2008/07/19/Un-peu-de-syntaxe-Ruby#comment-form</wfw:comment>
      <wfw:commentRss>http://blogbangbang.com/feed/rss2/comments/85</wfw:commentRss>
      </item>
    
  <item>
    <title>Ruby, c'est quoi comme langage ?</title>
    <link>http://blogbangbang.com/post/2008/07/15/ruby_cest_quoi_comme_langage</link>
    <guid isPermaLink="false">urn:md5:225d4351f86913d3c41775127618029e</guid>
    <pubDate>Tue, 15 Jul 2008 22:35:00 +0200</pubDate>
    <dc:creator>jblanche</dc:creator>
        <category>tout public</category>
        <category>ruby</category><category>RubyOnRails</category><category>vulgarisation</category>    
    <description>&lt;p&gt;
Let's go...
&lt;/p&gt;
&lt;p&gt;
Dans Ruby on Rails, il y a avant tout Ruby !
&lt;/p&gt;
&lt;p&gt;
Ruby c'est un langage informatique, au même titre que PHP, Python, Java, C, C++, l'ActionScript...
&lt;/p&gt;
&lt;p&gt;
Parmis tous ces langages, trois familles existent, les langages compilés, les langages interprétés et les langages intermédiaires.
&lt;br /&gt;
Pour information voici comment se répartissent certains langages que vous connaissez surement :
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Langages compilés : C, C++...&lt;/li&gt;
&lt;li&gt;Langages interprétés : PHP, PERL...&lt;/li&gt;
&lt;li&gt;Langages intermédiaires : Java, ActionScript...&lt;/li&gt;
&lt;/ul&gt;    &lt;p&gt;
Pour en savoir plus sur les différences entre ces trois familles de langages, je vous invite à lire &lt;a href=&quot;http://www.commentcamarche.net/langages/langages.php3#interprete&quot;&gt;l'explication de commentcamarche.net&lt;/a&gt; dont la vulgarisation est excellente (je m'étais lancé dans une explication, mais faire clair, simple et concis à ce sujet est vraiment compliqué).
Puisque que c'est de lui qu'il s'agit, Ruby est un langage interprété, donc de la même famille que PHP, c'est d'ailleurs lui que j'utiliserais dans les comparaisons à venir puisqu'il est surement le langage interpreté le plus connu (au moins des lecteurs de ce blog).
&lt;/p&gt;
&lt;p&gt;
D'ailleurs contrairement à la croyance qui veut que Ruby soit un truc tout nouveau qui tombera bientôt à l'eau, Ruby est en fait aussi &amp;quot;vieux&amp;quot; que PHP, leur première publication ayant toutes les deux eu lieu en 1995.
&lt;/p&gt;
&lt;p&gt;
Attention toutefois, Ruby est très différent de PHP !
&lt;/p&gt;
&lt;h3&gt;Pourquoi ?&lt;/h3&gt;
&lt;h4&gt; Orienté Web / Peut tout faire &lt;/h4&gt;
&lt;p&gt;
PHP a été crée par un développeur Web pour le développement Web, les bases de PHP viennent de la nécessité pour son créateur &lt;a href=&quot;http://fr.wikipedia.org/wiki/Rasmus_Lerdorf&quot;&gt;Rasmus Lerdorf&lt;/a&gt;, d'enregistrer la fréquentation sur son CV...
&lt;/p&gt;
&lt;p&gt;
Ruby quant à lui, a été crée par &lt;a href=&quot;http://fr.wikipedia.org/wiki/Yukihiro_Matsumoto&quot;&gt;Yukihiro Matsumotow&lt;/a&gt; dit &amp;quot;Matz&amp;quot; en s'inspirant notamment de &lt;a href=&quot;http://fr.wikipedia.org/wiki/Perl_%28langage%29&quot;&gt;PERL&lt;/a&gt; et &lt;a href=&quot;http://fr.wikipedia.org/wiki/Smalltalk&quot;&gt;Smalltalk&lt;/a&gt;, cela veut principalement dire que Ruby a été écrit pour être un langage applicatif &amp;quot;à tout faire&amp;quot; en allant du petit script de classement de vos images aux bibliothèques d'interfaces graphiques (il est en cela comparable au C, C++, Java...).
&lt;/p&gt;
&lt;h4&gt; Non-Objet / Objet &lt;/h4&gt;
&lt;p&gt;
Dans un langage objet, les objets répondent à des messages.
&lt;br /&gt;
&lt;strong&gt;exemple&lt;/strong&gt; : l'objet maVoiture reçoit un message lui demandant d'avancer donne
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;ma_voiture.&lt;span style=&quot;color:#9900CC;&quot;&gt;avance&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
PHP, lui, n'est pas un langage (entièrement) orienté objet.
&lt;br /&gt;
D'ailleurs à l'origine PHP n'est pas du tout un langage objet.
&lt;br /&gt;
Même si depuis la version 5, tout cela a bien évolué.
&lt;/p&gt;
&lt;p&gt;
Toutefois, en PHP, pour mettre en majuscule un mot ou une phrase, on écrira :
&lt;/p&gt;
&lt;code class=&quot;PHP&quot;&gt;&lt;a href=&quot;http://www.php.net/strtoupper&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;strtoupper&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;jonathan&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
On voit bien ici que &amp;quot;l'objet&amp;quot; traité est passé à une méthode au lieu de recevoir un message.
&lt;/p&gt;
&lt;p&gt;
Si vous n'avez pas encore compris, regardez ce que cela donne en Ruby.
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;jonathan&amp;quot;&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;uppercase&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
Ici c'est bien l'objet (le string) qui reçoit le message lui indiquant de se mettre en majuscule.
&lt;/p&gt;
&lt;p&gt;
Une des particularités de Ruby est qu'absolument tout (ou presque) est Objet.
&lt;/p&gt;
&lt;p&gt;
C'est la raison pour laquelle j'ai pu écrire &amp;quot;jonathan&amp;quot;.uppercase() sans avoir auparavant créé une instance de String...
&lt;/p&gt;
&lt;p&gt;
Ruby &amp;quot;comprend&amp;quot; automatiquement que ce qui est entre deux guillemets est un string et répond donc aux méthodes de cette classe.
&lt;/p&gt;
&lt;p&gt;
On touche là une autre particularité de Ruby, le &amp;quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Duck_Typing&quot; hreflang=&quot;en&quot;&gt;Duck Typing&lt;/a&gt;&amp;quot; ou &amp;quot;Typage Canard&amp;quot; (si ça marche comme un canard et si ça cancane comme un canard, alors ce doit être un canard&amp;quot; ).
&lt;br /&gt;
Le principe est donc de ne pas forcer le programmeur à utiliser une classe donnée, mais de l'obliger à mettre les données dans le format que nous voulons utiliser.
&lt;br /&gt;
J'ai écrit &amp;quot;jonathan&amp;quot; entre guillemets, Ruby comprends que cet objet est un String.
&lt;br /&gt;
Si j'écris [1, 14, 15] ce sera un Array (Tableau), {1=&amp;gt;&amp;quot;aaa&amp;quot;, 2=&amp;gt;&amp;quot;b&amp;quot;} sera un Hash (ou tableau associatif)...
&lt;/p&gt;
&lt;h4&gt;Bizarreries / P.O.L.S.&lt;/h4&gt;
&lt;p&gt;
Une autre particularité de Ruby est de suivre au maximum le P.O.L.S ou &amp;quot;Principle of Least Surprise&amp;quot; (&amp;quot;Principe de moindre surprise&amp;quot;).
&lt;/p&gt;
&lt;p&gt;
Cela peut sembler une évidence, mais en gros cela veut dire que les méthodes font ce que leur nom laisse penser qu'elles font.
&lt;/p&gt;
&lt;p&gt;
Pourtant, lorsque l'on lit la documentation de PHP, on se rend compte que ce n'est pas toujours le cas :
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
array_merge( array $array1  [, array $array2  [, array $...  ]] ) &lt;/p&gt;
&lt;p&gt;Merges the elements of one or more arrays together so that the values of one are appended to the end of the previous one. It returns the resulting array. &lt;/p&gt;
&lt;p&gt;If the input arrays have the same string keys, then the later value for that key will overwrite the previous one. &lt;/p&gt;
&lt;p&gt;If, however, the arrays contain numeric keys, the later value will not overwrite the original value, but will be appended. &lt;/p&gt;
&lt;p&gt;If only one array is given and the array is numerically indexed, the keys get reindexed in a continuous way.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
La même chose en Ruby (méthode merge de la classe Hash) :
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
hsh.merge(other_hash) &lt;/p&gt;
&lt;p&gt;Returns a new hash containing the contents of other_hash and the contents of hsh, overwriting entries in hsh with duplicate keys with those from other_hash.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Vous voyez la différence, n'est ce pas &lt;img src=&quot;/themes/john/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;
[private joke]&lt;br /&gt;
On peut aussi en faire la démonstration avec AS3 et Ruby pour retourner un string  : &lt;/p&gt;
&lt;h4&gt;AS3 :&lt;/h4&gt;
&lt;code class=&quot;Actionscript&quot;&gt;myString.&lt;span style=&quot;color: #0066CC;&quot;&gt;split&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;''&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;reverse&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;''&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/code&gt;
&lt;h4&gt;Ruby &lt;/h4&gt;
&lt;code class=&quot;Ruby&quot;&gt;my_string.&lt;span style=&quot;color:#9900CC;&quot;&gt;reverse&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
[/private joke]
&lt;/p&gt;
&lt;p&gt;
Voilà pour la première introduction, j'espère vous avoir donner envie d'en savoir un peu plus et je vous monterais bientot les rudiments de la syntaxe Ruby (certes un peu étrange pour un développeur PHP ou Flash, mais tellement sexy à l'usage !)
&lt;/p&gt;
&lt;p&gt;
See you soon...
&lt;/p&gt;</description>
    
    
    
          <comments>http://blogbangbang.com/post/2008/07/15/ruby_cest_quoi_comme_langage#comment-form</comments>
      <wfw:comment>http://blogbangbang.com/post/2008/07/15/ruby_cest_quoi_comme_langage#comment-form</wfw:comment>
      <wfw:commentRss>http://blogbangbang.com/feed/rss2/comments/84</wfw:commentRss>
      </item>
    
  <item>
    <title>Mais Ruby, Ruby On Rails, c'est quoi en fait ?</title>
    <link>http://blogbangbang.com/post/2008/07/15/Mais-Ruby-Ruby-On-Rails-c-est-quoi-en-fait</link>
    <guid isPermaLink="false">urn:md5:e50a37085a0c6fb45a41464a3e04601c</guid>
    <pubDate>Tue, 15 Jul 2008 21:57:00 +0200</pubDate>
    <dc:creator>jblanche</dc:creator>
        <category>tout public</category>
        <category>ruby</category><category>RubyOnRails</category><category>vulgarisation</category>    
    <description>    &lt;p&gt;
Comme souvent quand quelque chose vous passionne, vous ne pouvez pas vous empêcher d'en faire la promotion autour de vous.
&lt;/p&gt;
&lt;p&gt;
La plupart temps il s'agit d'un groupe de musique, d'une équipe de foot, d'un réalisateur ou d'un acteur et il est assez facile d'expliquer autour de vous
pourquoi votre préféré est selon vous meilleur que tous les autres.
&lt;br /&gt;
Mais quand l'une de vos passions est le Web, vous êtes déjà un peu plus étrange.
&lt;br /&gt;
Si vous précisez que c'est du développement Web qu'il s'agit, vous devenez carrément bizare.
&lt;br /&gt;
Et si vous finissez en expliquant que c'est plus particulièrement de Ruby ou Ruby et Ruby on Rails qu'il s'agit, vous devenez aux yeux de votre interlocuteur un extraterrestre !
&lt;/p&gt;
&lt;p&gt;
Et pourtant, c'est mon cas.  &lt;br /&gt;
Je suis &amp;quot;accroc&amp;quot; à Ruby et Ruby on Rails et je vais donc essayer d'expliquer en quelques billets ce dont il s'agit avec des mots simples.
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://blogbangbang.com/post/2008/07/15/ruby_cest_quoi_comme_langage&quot;&gt;Suivez moi...&lt;/a&gt;
&lt;/p&gt;</description>
    
    
    
          <comments>http://blogbangbang.com/post/2008/07/15/Mais-Ruby-Ruby-On-Rails-c-est-quoi-en-fait#comment-form</comments>
      <wfw:comment>http://blogbangbang.com/post/2008/07/15/Mais-Ruby-Ruby-On-Rails-c-est-quoi-en-fait#comment-form</wfw:comment>
      <wfw:commentRss>http://blogbangbang.com/feed/rss2/comments/83</wfw:commentRss>
      </item>
    
  <item>
    <title>En vrac</title>
    <link>http://blogbangbang.com/post/2008/06/04/En-vrac</link>
    <guid isPermaLink="false">urn:md5:f32760b1125e2178ecc3a7fb64ec68b7</guid>
    <pubDate>Wed, 04 Jun 2008 23:47:00 +0200</pubDate>
    <dc:creator>jblanche</dc:creator>
        <category>en vrac</category>
        <category>Linux</category><category>ruby</category><category>RubyOnRails</category><category>Systèmes dexploitation</category><category>ubuntu</category><category>Ubuntu</category><category>Umpc</category>    
    <description>    &lt;p&gt;Pas beaucoup de temps en ce moment (pris par le projet de fin d'année de ma dernière année d'étude), donc je vous livre sans grands discours ce qu'il faut lire, voir, savoir en ce moment : &lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Yahoo fournit un &lt;a href=&quot;http://developer.yahoo.com/ypatterns/wireframes/&quot; hreflang=&quot;en&quot;&gt;kit d'éléments d'interfaces&lt;/a&gt; Web afin de faciliter la création de Wireframes.&lt;/li&gt;
&lt;li&gt;Les UltraPortables fourmillent &lt;a href=&quot;http://fr.wikipedia.org/wiki/Asus_Eee_PC&quot;&gt;Eeepc700, 900, 1000&lt;/a&gt;, &lt;a href=&quot;http://www.blogeee.net/2008/06/04/le-gigabyte-m912-se-devoile-au-computex/&quot;&gt;Gigabyte M912&lt;/a&gt;,  &lt;a href=&quot;http://www.blogeee.net/2008/06/04/des-images-du-wind-u90-la-version-89-du-bebe-de-msi/&quot;&gt;Wind U90&lt;/a&gt;... Et quel OS choisit t-on le plus souvent pour faire tourner ce beau monde : Linux ( Et pourquoi mettre autre chose puisque c'est celui qui vous coûtera le moins cher à configuration matérielle égale, qu'il offre un meilleur confort d'utilisation et une meilleure autonomie !)&lt;/li&gt;
&lt;li&gt;Ubuntu va développer &lt;a hreflang=&quot;en&quot; href=&quot;http://www.engadget.com/2008/06/03/canonical-makes-ubuntu-netbook-remix-official-at-computex/&quot;&gt;Ubuntu Netbook Remix&lt;/a&gt; : des interfaces dédiées à ces matériels. &lt;/li&gt;
&lt;li&gt;Les PC de salon à bas prix débarquent eux aussi (&lt;a hreflang=&quot;en&quot; href=&quot;http://www.electronista.com/articles/08/06/02/final.asus.eee.box.specs/&quot;&gt;EeeBox&lt;/a&gt;) et là encore si vous voulez le moins cher ou mieux pour le même prix, c'est la version Linux qu'il vous faudra choisir.&lt;/li&gt;
&lt;li&gt;Facebook &lt;a href=&quot;http://www.lemondeinformatique.fr/actualites/lire-facebook-ouvre-les-sources-de-sa-plateforme-de-developpement-26236.html&quot;&gt;libère sa plateforme de développement&lt;/a&gt; et encourage du même coup les développeurs à utiliser leur plateforme.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;Et pour Ruby, Rails : &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Rails2.1 est sorti accompagné de son &lt;a hreflang=&quot;en&quot; href=&quot;http://ryandaigle.com/articles/2008/6/2/rails-2-1-released-summary-of-features&quot;&gt;lot de nouveautés&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;La Railsconf avait lieu la semaine dernière et les présentations sont &lt;a hreflang=&quot;en&quot; href=&quot;http://en.oreilly.com/rails2008/public/schedule/proceedings&quot;&gt;disponibles&lt;/a&gt;. &lt;br /&gt;
On regardera particulièrement celles-ci (liens vers les PDF) :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a hreflang=&quot;en&quot; href=&quot;http://en.oreilly.com/rails2008/public/asset/attachment/2850&quot;&gt;Les bons conseils pour les tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a hreflang=&quot;en&quot; href=&quot;http://en.oreilly.com/rails2008/public/asset/attachment/2855&quot;&gt;Fuzed&lt;/a&gt; : une solution intérressante pour gérer la montée en charge derrière Rails (ou autre...).&lt;/li&gt;
&lt;li&gt;La gestion des processus longs grâce aux &lt;a hreflang=&quot;en&quot; href=&quot;http://railspikes.com/2008/6/3/asynchronous-railsconf-2008&quot;&gt;processus asynchrones&lt;/a&gt; avec Ruby et Rails.&lt;/li&gt;
&lt;li&gt;&lt;a hreflang=&quot;en&quot; href=&quot;http://en.oreilly.com/rails2008/public/asset/attachment/2858&quot;&gt;La méta-programmation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bonne Lecture.&lt;/p&gt;
&lt;p&gt;PS : Je ne vous oublie pas pour la dernière partie de ma série sur nos ressources et le &amp;quot;HomeServer&amp;quot;, elle arrive bientôt. &lt;/p&gt;</description>
    
    
    
          <comments>http://blogbangbang.com/post/2008/06/04/En-vrac#comment-form</comments>
      <wfw:comment>http://blogbangbang.com/post/2008/06/04/En-vrac#comment-form</wfw:comment>
      <wfw:commentRss>http://blogbangbang.com/feed/rss2/comments/80</wfw:commentRss>
      </item>
    
  <item>
    <title>Un peu de lecture</title>
    <link>http://blogbangbang.com/post/2008/04/24/Un-peu-de-lecture</link>
    <guid isPermaLink="false">urn:md5:f617ecbc170d7f0ba373b1b6d7335fbc</guid>
    <pubDate>Thu, 24 Apr 2008 00:08:00 +0200</pubDate>
    <dc:creator>jblanche</dc:creator>
        <category>geeks</category>
        <category>livre</category><category>ruby</category><category>RubyOnRails</category>    
    <description>    &lt;p&gt;Je viens de recevoir ceci : &lt;/p&gt;
&lt;a class=&quot;thickbox&quot; title=&quot;The Rails and the Ruby way&quot; href=&quot;http://blogbangbang.com/images/rails_and_ruby_way.jpg&quot;&gt;
&lt;img class=&quot;billet&quot; alt=&quot;The Rails and the Ruby way&quot; src=&quot;http://blogbangbang.com/images/small_rails_and_ruby_way.jpg&quot; /&gt;
&lt;/a&gt;
&lt;p&gt;
Deux pavés d'environ 850 pages chacun qui ne sont pas près de quitter mon bureau &lt;img src=&quot;/themes/john/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;
Ces livres ne sont pas à conseiller aux vrais débutants (qui iront plutôt vers &lt;a href=&quot;http://blogbangbang.com/post/2007/05/11/Livte-%3A-Ruby-on-rails-seconde-edition&quot;&gt;celui-ci&lt;/a&gt; chez Eyrolles) puisqu'il ne s'agit pas vraiment de livre aidant à l'apprentissage, mais plus de &amp;quot;bible&amp;quot; de Ruby et de Rails qui vous donneront les outils et méthodes à utiliser pour un problème donné&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
J'ai déjà commencé à fouiner un peu dans chacun et les problématiques abordées sont vraiment larges et pour certains plutôt pointues ! &lt;br /&gt;
Je crois que vais bien m'amuser &lt;img src=&quot;/themes/john/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;
&lt;/p&gt;</description>
    
    
    
          <comments>http://blogbangbang.com/post/2008/04/24/Un-peu-de-lecture#comment-form</comments>
      <wfw:comment>http://blogbangbang.com/post/2008/04/24/Un-peu-de-lecture#comment-form</wfw:comment>
      <wfw:commentRss>http://blogbangbang.com/feed/rss2/comments/72</wfw:commentRss>
      </item>
    
  <item>
    <title>Sortir des conventions dans Rails - retour d'expérience.</title>
    <link>http://blogbangbang.com/post/2008/04/08/Sortir-des-conventions-dans-Rails-retour-dexperience</link>
    <guid isPermaLink="false">urn:md5:654029dfe70b837d7752064c06f44387</guid>
    <pubDate>Tue, 08 Apr 2008 23:01:00 +0200</pubDate>
    <dc:creator>jblanche</dc:creator>
        <category>geeks</category>
        <category>ruby</category><category>RubyOnRails</category><category>Tutorial</category>    
    <description>&lt;p&gt;
Tout d'abord, sachez qu'il ne faut jamais outrepasser les conventions de Rails sans une excellente raison.
&lt;/p&gt;
&lt;p&gt;
Toutefois, il arrive que l'on ai une excellente raison, le cas présenté dans ce billet sera celui (tiré d'une application réelle) d'une base de données assez mal conçue où les noms de tables sont tous au singulier et où, comble du massacre, les id d'une des tables sont sous forme de chaine de caractères.
&lt;/p&gt;
&lt;p&gt;
Bien sur, cette base de données est utilisée par 18 autres applications dans la société et vous ne pouvez en aucun cas en modifier la structure (sinon ce serait trop facile).
&lt;/p&gt;    &lt;h3&gt;Problème N°1 : Les noms de tables.&lt;/h3&gt;
&lt;p&gt;
Notre premier problème est donc que Rails considère par défaut qu'un nom de modèle doit-être un singulier et que le nom de la table correspondante doit être un pluriel. 
&lt;/p&gt;
&lt;p&gt;
Nous pourrions donc ajouter à l'un de nos modèles la ligne suivante :
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#0000FF; font-weight:bold;&quot;&gt;self&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;pluralize_table_names&lt;/span&gt; = &lt;span style=&quot;color:#0000FF; font-weight:bold;&quot;&gt;false&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;
Mais selon moi, cette propriété étant commune à tous nos modèles, il n'est pas logique de la placer dans l'un d'entre eux. Nous allons donc spécifier cette propriété générale à tous les instances d'AciveRecord ailleurs.
&lt;/p&gt;
&lt;p&gt;
Pour cela, la version 2 de Rails nous offre un dossier config/initializers où placer tous nos scripts à exécuter au démarrage de l'application après les configurations par défaut, c'est donc l'endroit parfait pour rajouter un script &amp;quot;do_not_pluralize.rb&amp;quot; avec pour contenu : 
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;module&lt;/span&gt; ActiveRecord&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;class&lt;/span&gt; Base&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#0000FF; font-weight:bold;&quot;&gt;self&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;pluralize_table_names&lt;/span&gt; = &lt;span style=&quot;color:#0000FF; font-weight:bold;&quot;&gt;false&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
Et voilà, nous venons d'overrider le paramètre pluralize_table_names d'ActiveRecord::Base et désormais, tout est clean.
&lt;/p&gt;

&lt;h3&gt;Problème N°2 : Des chaînes de caractères comme id, drôle d'idée...&lt;/h3&gt;
&lt;p&gt;
Les id de notre table &amp;quot;comment&amp;quot; (nom d'emprunt) sont donc des strings. Cela ne pose aucun problème à activeRecord qui saura évidemment faire un find(&amp;quot;a12.bcd.3456789&amp;quot;) si &amp;quot;a12.bcd.3456789&amp;quot; est la valeur du champ id de notre enregistrement.
&lt;/p&gt;
&lt;p&gt;
Là où intervient le problème, c'est que comme vous êtes quelqu'un d'attentif, vous savez qu'avec Rails2, &lt;a href=&quot;http://fr.wikipedia.org/wiki/REST&quot;&gt;REST&lt;/a&gt; et les &lt;a href=&quot;http://wiki.Rubyonrails.org/rails/pages/NamedRoutes&quot;&gt;named routes&lt;/a&gt; ont enfin droit leurs heures de gloire.
&lt;/p&gt;

&lt;p&gt;
Or, cela implique que l'URL d'accès à votre enregistrement soit de la forme : 
&lt;/p&gt;

&lt;p&gt;
/comments pour la liste des commentaires.&lt;br /&gt;
/comments/1 pour le commentaire 1&lt;br /&gt;
/comments/last pour une méthode supplémentaire last que vous auriez définie et qui vous ramènerait probablement les derniers commentaires. &lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;
Or avec notre id, l'url est de la forme &amp;quot;/comments/a12.bcd.3456789&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
Rails pense alors que 'a12.bcd.3456789' est une méthode à appeler  mais il ne la trouvera évidement jamais.
&lt;/p&gt;

&lt;div class=&quot;edit&quot;&gt;
&lt;p&gt;
&lt;b&gt;Edit du 17/04/08&lt;/b&gt;&lt;br /&gt;
Avant de vous montrer la solution que j'ai utilisé dans mon cas je vais suite au commentaire de Nicolas, de &lt;a href=&quot;http://blog.boldr.fr/&quot;&gt;boldr.fr&lt;/a&gt; vous montrer une solution qui fonctionnera dans la majorité des cas (mais pas le mien.)
&lt;/p&gt;

&lt;p&gt;
Afin de dire à rails d'utiliser autre chose qu'un id numérique dans les url de la forme &amp;quot;/comments/1&amp;quot; il existe une option des ressources appellée member_path. 
En modifiant donc votre fichier &amp;quot;config/routes.rb&amp;quot;, vous pouvez indiqué à Rails d'utiliser l'id de votre table pour avoir des url de la forme &amp;quot;/comments/a12bcd3456789&amp;quot; comprises par rails.
&lt;/p&gt;
&lt;p&gt;Il suffit donc de remplacer : &lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;map.&lt;span style=&quot;color:#9900CC;&quot;&gt;resources&lt;/span&gt; &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:comments&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;par&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;map.&lt;span style=&quot;color:#9900CC;&quot;&gt;resources&lt;/span&gt; &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:comments&lt;/span&gt;, &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:member_path&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color:#996600;&quot;&gt;'/comments/:id'&lt;/span&gt;&lt;/code&gt;

&lt;p&gt;Grâce à celà, vous éviterez beaucoup d'ennuis mais malheureusement, la solution ne fonctionne pas si l'id nouveau contient des '&lt;b&gt;.&lt;/b&gt;' car rails se sert de ce caractère pour séparer la partie relative à l'url de l'action de la partie relative au format de retour (html, xml, js...).
&lt;/p&gt;
&lt;p&gt;La solution dans mon cas devait donc venir d'autre part...&lt;/p&gt;
&lt;/div&gt;



&lt;p&gt;
Dans le cas que j'ai eu à d'étudier, le salut est venu du fait que la suite de nombre suffixant l'id (ici '3456789') était unique, j'ai donc décider d'utiliser celle-ci comme paramètre de l'URL. 
&lt;/p&gt;
&lt;p&gt;
Pour récupérer ce nouvel id (que j'appellerai numeric_id), j'ai donc écrit la méthode suivante : 
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; numeric_id&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#0000FF; font-weight:bold;&quot;&gt;self&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;id&lt;/span&gt;.&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;split&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color:#996600;&quot;&gt;'.'&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;last&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;to_i&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
Il ne me restait plus qu'à indiquer à rails d'utiliser ce paramètre dans les URL grâce à la méthode to_param &lt;sup&gt;[&lt;a id=&quot;rev-pnote-1&quot; href=&quot;http://blogbangbang.com/post/2008/04/08/#pnote-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt; (toujours dans mon modèle).
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; to_param&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;#{self.numeric_id}&amp;quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
Grâce à cela, j'ai donc des url &amp;quot;/comments/3456789&amp;quot; que Rails analisera sans problème.
&lt;/p&gt;
&lt;p&gt;
Dernières modifications, il faut indiquer aux méthodes agissant sur un seul enregistrement dans le controller (show, edit, update, destroy et celle que vous pourriez créer) d'utiliser notre nouvel identifiant numérique plutôt que celui par défaut.
&lt;/p&gt;
&lt;p&gt;
Pour cela je rajoute une méthode find_by_numeric_id dans notre modèle : 
&lt;/p&gt;
  def self.find_by_numeric_id(nid)
    Comment.find(:first,:conditions =&amp;gt; ['id LIKE ? ', '%'+nid.to_s])
  end
&lt;p&gt;
Et je modifie les méthodes précédemment citées pour utiliser notre find, ma méthode show devient donc :
&lt;/p&gt;
&lt;code class=&quot;Ruby&quot;&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# GET /comments/1&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# GET /comments/1.xml&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; show&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@comment&lt;/span&gt; = Comment.&lt;span style=&quot;color:#9900CC;&quot;&gt;find_by_numeric_id&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;params&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:id&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; respond_to &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt; |format|&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;format&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;html&lt;/span&gt; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# show.html.erb&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;format&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;xml&lt;/span&gt; &amp;nbsp;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#123;&lt;/span&gt; render &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:xml&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@comment&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;
Et voilà vous avez désormais une base seine sur laquelle faire reposer la suite de votre développement. 
&lt;/p&gt;

&lt;p&gt;Je me répète mais ce genre de modification ne doit être utilisé que si vous ne pouvez pas faire autrement&lt;/p&gt;

&lt;p&gt;[&lt;a id=&quot;pnote-1&quot; href=&quot;http://blogbangbang.com/post/2008/04/08/#rev-pnote-1&quot;&gt;1&lt;/a&gt;]Attention, si vous prévoyez d'utiliser la méthode to_param dans le cas d'un model Active_ressource, allez faire un tour &lt;a href=&quot;http://dev.Rubyonrails.org/changeset/9114&quot;&gt;ici&lt;/a&gt; afin de résoudre un bug de rails (corrigé dans la version SVN) qui fait que activeressource utilise parfois l'id au lieu de to_param.&lt;/p&gt;</description>
    
    
    
          <comments>http://blogbangbang.com/post/2008/04/08/Sortir-des-conventions-dans-Rails-retour-dexperience#comment-form</comments>
      <wfw:comment>http://blogbangbang.com/post/2008/04/08/Sortir-des-conventions-dans-Rails-retour-dexperience#comment-form</wfw:comment>
      <wfw:commentRss>http://blogbangbang.com/feed/rss2/comments/70</wfw:commentRss>
      </item>
    
</channel>
</rss>