<?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 - Tutorial</title>
  <link>http://blogbangbang.com/</link>
  <atom:link href="http://blogbangbang.com/feed/tag/Tutorial/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>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>
    
  <item>
    <title>Tutorial : créer sa première application Ruby on Rails - Part3</title>
    <link>http://blogbangbang.com/post/2007/08/28/Tutorial-%3A-creer-sa-premiere-application-Ruby-on-Rails-Part3</link>
    <guid isPermaLink="false">urn:md5:39adef5ca6b554f013cae55d1845ae2a</guid>
    <pubDate>Tue, 28 Aug 2007 22:08:00 +0200</pubDate>
    <dc:creator>jblanche</dc:creator>
        <category>geeks</category>
        <category>RubyOnRails</category><category>Tutorial</category>    
    <description>&lt;p&gt;
Après une trêve due à de trop courtes mais bien agréable vacances, voici la suite de la création de notre application.
&lt;/p&gt;
&lt;p&gt;
Dans ce tutorial, nous apprendrons à rajouter des tags à notre application.
&lt;/p&gt;
&lt;p&gt;
Pour ce faire, je me suis largement inspiré d'un autre tutorial sur &lt;a href=&quot;http://www.stoneageblog.com/articles/2007/06/03/nuage-de-tag-avec-ruby-on-rails-acts_as_taggable/&quot;&gt;stoneageblog.com&lt;/a&gt;.
&lt;/p&gt;    &lt;p&gt;Comme souvent, avec Rails inutile de ré-inventer la roue, et quand ce n'est pas le framework qui vous simplifie la vie, c'est la communauté qui vient à votre
secours.&lt;/p&gt;
&lt;p&gt;
J'ai donc utilisé pour ce tutorial le plugin &lt;a href=&quot;http://agilewebdevelopment.com/plugins/acts_as_taggable_on_steroids&quot;&gt;acts_as_taggable_on_steroids&lt;/a&gt;,
un plugin servant à créer facilement un système de tags dans votre application.
&lt;/p&gt;
&lt;p&gt;
Pour ce faire, il est nécessaire d'exécuter dans une console à la racine de notre application le script suivant :
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;script/plugin install http://svn.viney.net.nz/things/rails/plugins/acts_as_taggable_on_steroids/&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Une fois le plugin installé, il est nécessaire d'ajouter une migration afin de créer les tables nécessaires à l'introduction des Tags. &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;script/generate migration add_tags&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Remplissez le fichier précédemment crée comme ceci :
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;class AddTags &amp;lt; ActiveRecord::Migration&lt;br /&gt;  def self.up&lt;br /&gt;    create_table :tags, :force =&amp;gt; true do |t|&lt;br /&gt;      t.column :name, :string&lt;br /&gt;    end&lt;br /&gt;    create_table :taggings, :force =&amp;gt; true do |t|&lt;br /&gt;      t.column :tag_id, :integer&lt;br /&gt;      t.column :taggable_id, :integer&lt;br /&gt;      t.column :taggable_type, :string&lt;br /&gt;      t.column :created_at, :datetime&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def self.down&lt;br /&gt;    drop_table :tags&lt;br /&gt;    drop_table :taggings&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Nous créons donc deux tables, la première contiendra les noms des différents tags, la seconde les associe à un objet de type taggable_type qui pour nous sera un Snippet et au taggable_id de l'objet en question.
&lt;br /&gt;Cette méthode appelée Polymorphisme permettrait d'appliquer les tags à d'autres modèles (Catégories...) par la suite.
&lt;/p&gt;
&lt;p&gt;
Pour exécuter cette migration, c'est vous commencez à en avoir l'habitude en console que ça se passe.
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rake db:migrate&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Pour parachever la partie base de données, indiquons à notre modèle Snippet qu'il est taggable (ou susceptible d'être taggé).
Pour cela, il suffit d'ajouter la ligne acts_as_taggable dans notre modèle afin d'obtenir quelquechose comme ceci.
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;class Snippet &amp;lt; ActiveRecord::Base&lt;br /&gt;  acts_as_taggable&lt;br /&gt;  ...&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Notre base de données est désormais prête à accueillir nos tags, nous allons donc les ajouter au formulaire d'ajout de nos Snippets dans le controller Admin.
&lt;br /&gt;
Dans la vue new.rhtml, je rajoute le code suivant :
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&amp;lt;%= content_tag :label , &amp;quot;Tags (separated by a comma)&amp;quot;, {:for=&amp;gt;&amp;quot;cd_tag_list&amp;quot;} %&amp;gt;&lt;br /&gt;&amp;lt;%= f.text_field :tag_list %&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Et voilà, rien de plus ne sera nécessaire, l'ajout des tags à notre application est déjà effectif et une multitude de méthodes sont à notre disposition pour les utiliser.
Pour les afficher, je peut par exemple désormais faire :
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&amp;lt;%= content_tag :p, @snippet.tag_list, :class =&amp;gt; &amp;quot;tag_list&amp;quot;%&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Nos Snippets sont désormais taggués mais il manque un petit nuage de tags afin de rendre cette application vraiment Web2.0 :-D.&lt;br /&gt;
Pour ce faire, nous allons créer une méthode tag_cloud dans le helper de notre controller snippets(on pourrait tout aussi bien le mettre dans appliucation_helper si l'on souhaite l'afficher dans l'admin.)
&lt;/p&gt;
&lt;p&gt;
Cette méthode, la voiçie (encore merci à l'article de stoneageblog)
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;def tag_cloud(tags, classes)&lt;br /&gt;    max, min = 0, 0 &lt;br /&gt;    tags.each { |t| &lt;br /&gt;      max = t.count.to_i if t.count.to_i &amp;gt; max &lt;br /&gt;      min = t.count.to_i if t.count.to_i &amp;lt; min &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    divisor = ((max - min) / classes.size) + 1 &lt;br /&gt;&lt;br /&gt;    tags.each { |t|&lt;br /&gt;      yield t.name, classes[(t.count.to_i - min) / divisor]&lt;br /&gt;    }&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Dans un premier temps, la méthode cherche la fréquence des tags les plus et les moins utilisés.&lt;br /&gt;
Dans un deuxième temps, elle affecte à chaque tags une classe CSS en fonction de sa propre fréquence.
&lt;/p&gt;
&lt;p&gt;
Pour ce faire, vous devrez donc définir plusieurs styles dans vos CSS.
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;css&quot;&gt;/* Nuage de Tag*/&lt;br /&gt;&lt;br /&gt;.nube1 {font-size: 1.0em;}&lt;br /&gt;.nube2 {font-size: 1.2em;}&lt;br /&gt;.nube3 {font-size: 1.4em;}&lt;br /&gt;.nube4 {font-size: 1.6em;}&lt;br /&gt;.nube5 {font-size: 1.8em;}&lt;br /&gt;.nube6 {font-size: 2.0em;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Comme je souhaite afficher ce nuage de tags pour toutes les méthodes du controller Snippets (dans la sidebar), j'ai choisi d'ajouter ma propre méthode au controller et de l'appeler pour chaque action.
&lt;br /&gt;J'ajoute donc une méthode private (pas accessible directement depuis le web)
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;private&lt;br /&gt;def tag_cloud&lt;br /&gt; @tags = Snippet.tag_counts(:order=&amp;gt;'tags.name asc')&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Puis j'indique au controller d'éxécuter cette méthode avant chaque appel aux autres actions en ajoutant un before_filter à notre controller.
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;class SnippetsController &amp;lt; ApplicationController&lt;br /&gt;  before_filter :tag_cloud&lt;br /&gt;  ...&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Reste à afficher ce nuage de tag dans nos vues. &lt;br /&gt;
Celui ci étant toujours afficher, je l'ai placé directement dans le layout de notre controller (app/views/layouts/snippets.rhtml)
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&amp;lt;% tag_cloud @tags, %w(nube1 nube2 nube3 nube4 nube5) do |name, css_class|  %&amp;gt;&lt;br /&gt;   &amp;lt;%= link_to name,{:controller=&amp;gt;&amp;quot;snippets&amp;quot;, :action=&amp;gt;&amp;quot;tagged&amp;quot;, :tag=&amp;gt;name} ,:class =&amp;gt; css_class %&amp;gt;&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Comme toujours, c'est quand on croit en avoir fini que l'on découvre nos oublis.
Avoir un nuage de tags, c'est bien joli, mais pouvoir associé à chaque tag une page ou l'on affichera les snippets taggués par celui ci, ça serait quand même plus sympa.
&lt;/p&gt;
&lt;p&gt;
Je vous je propose donc, comme on peut le voir dans le link_to du code précédent, de lier chaque tag vers une page /snippets/tagged?tag=montag.&lt;br /&gt;
La méthode tagged n'étant bien sûre pas une méthode de l'architecture REST, il va falloir indiquer à rails que celle ci existe en ajoutant une ligne dans notre fichier routes.rb :
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;map.resources :snippets, :collection =&amp;gt; { :tagged =&amp;gt; :get }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Cette ligne indique à rails que le controller snippets bénéficie d'une méthode &amp;quot;tagged&amp;quot; qui retourne une collection (une liste) de snippets et qui sera appelée en utilisant la méthode GET.
&lt;/p&gt;
&lt;p&gt;
Je peut donc écrire dans mon controller la méthode tagged comme ceci :
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;def tagged&lt;br /&gt; @snippets = Snippet.find_tagged_with(params[:tag])&lt;br /&gt; render :action =&amp;gt; :index&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
La encore, la méthode find_tagged_with nous est fournie par le plugin acts_as_taggable_on_steroids, ce qui nous simplifie bien la vie &lt;img src=&quot;/themes/john/smilies/laugh.png&quot; alt=&quot;:-D&quot; class=&quot;smiley&quot; /&gt;
&lt;br /&gt;
Voilà je crois que c'est tout pour les tags.&lt;/p&gt;
&lt;p&gt;
L'application à également bénéficié d'un relooking grâce au plugin &lt;a href=&quot;http://benjamin.francisoud.googlepages.com/skinnable&quot; hreflang=&quot;en&quot;&gt;Skinnable&lt;/a&gt; sur lequel je ne reviendrais pas tellement il est facile à mettre en place.
&lt;/p&gt;
&lt;p&gt;
L'application en ligne est plus avancée que dans nos tutos puisque qu'elle bénéficie déjà d'un système de commentaires, de la coloration syntaxique des blocs de code, ainsi que de l'autocomplétion sur les tags qui feront l'objet des prochains tutos.
&lt;/p&gt;
&lt;p&gt;
Le résultat est visible dans mon &lt;a href=&quot;http://depot.blogbangbang.com/&quot; hreflang=&quot;fr&quot;&gt;dépôt de snippets de test&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Vous pouvez comme toujours, &lt;a href=&quot;http://www.blogbangbang.com/utils/depot5.zip&quot;&gt;télécharger le code de l'application&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
A bientôt pour la suite &lt;img src=&quot;/themes/john/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;
&lt;/p&gt;</description>
    
    
    
          <comments>http://blogbangbang.com/post/2007/08/28/Tutorial-%3A-creer-sa-premiere-application-Ruby-on-Rails-Part3#comment-form</comments>
      <wfw:comment>http://blogbangbang.com/post/2007/08/28/Tutorial-%3A-creer-sa-premiere-application-Ruby-on-Rails-Part3#comment-form</wfw:comment>
      <wfw:commentRss>http://blogbangbang.com/feed/rss2/comments/47</wfw:commentRss>
      </item>
    
  <item>
    <title>Tutorial : créer sa première application Ruby on Rails - Part2</title>
    <link>http://blogbangbang.com/post/2007/08/01/Tutorial-%3A-creer-sa-premiere-application-Ruby-on-Rails-Part2</link>
    <guid isPermaLink="false">urn:md5:8017ade3b8edf812125e72c8a65e31f3</guid>
    <pubDate>Wed, 01 Aug 2007 00:07:00 +0200</pubDate>
    <dc:creator>jblanche</dc:creator>
        <category>geeks</category>
        <category>RubyOnRails</category><category>Tutorial</category>    
    <description>    &lt;p&gt;
Pour cette deuxième partie du tutorial, je vous propose de construire en quelques minutes l'interface d'administration de notre application, de lui ajouter un petit module de recherche et enfin de modifier la page d'accueil.
&lt;/p&gt;
&lt;p&gt;
Commençons donc par l'interface d'administration :
&lt;/p&gt;
&lt;p&gt;
Je ne reviendrais pas sur les méthodes index et show du controller admin puisque se sont exactement les mêmes que dans le controller snippets.
&lt;/p&gt;
&lt;p&gt;La méthode new est appellée au clic sur le lien &lt;code&gt;new snippet&lt;/code&gt;, elle crée un objet snippet que la vue va nous permettre d'éditer.&lt;br /&gt;
La méthode create est appellée au clic sur le bouton &amp;quot;Create snippet&amp;quot;, elle crée un objet snippet à partir des données passées en paramètres, le sauvegarde (insertion dans la BD) et nous redirige vers la page d'accueil du controller Admin.
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;new&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;iv&quot;&gt;@snippet&lt;/span&gt; = &lt;span class=&quot;co&quot;&gt;Snippet&lt;/span&gt;.new&lt;br /&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;create&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;iv&quot;&gt;@snippet&lt;/span&gt; = &lt;span class=&quot;co&quot;&gt;Snippet&lt;/span&gt;.new(params[&lt;span class=&quot;sy&quot;&gt;:snippet&lt;/span&gt;])&lt;br /&gt;    &lt;span class=&quot;iv&quot;&gt;@snippet&lt;/span&gt;.save&lt;br /&gt;    &lt;span class=&quot;rails&quot;&gt;redirect_to&lt;/span&gt; admin_path&lt;br /&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
La méthode edit est appellée au clic sur le lien edit snippet, elle crée un objet Snippet à partir de l'id passé en paramètre pour afficher les valeurs actuelles dans l'édition.&lt;br /&gt;
La méthode update est appellée au clic sur le bouton &amp;quot;Save Snippet&amp;quot;, elle récupère l'objet Snippet à partir de l'ID, appelle la méthode update_attributes avec les paramètres passés par la vue pour mettre à jour notre Snippet dans la base, puis elle nous redirige vers la vue &amp;quot;Show&amp;quot; du Snippet édité.
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;edit&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;iv&quot;&gt;@snippet&lt;/span&gt; = &lt;span class=&quot;co&quot;&gt;Snippet&lt;/span&gt;.find(params[&lt;span class=&quot;sy&quot;&gt;:id&lt;/span&gt;])&lt;br /&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;update&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;iv&quot;&gt;@snippet&lt;/span&gt; = &lt;span class=&quot;co&quot;&gt;Snippet&lt;/span&gt;.find(params[&lt;span class=&quot;sy&quot;&gt;:id&lt;/span&gt;])&lt;br /&gt;    &lt;span class=&quot;iv&quot;&gt;@snippet&lt;/span&gt;.update_attributes(params[&lt;span class=&quot;sy&quot;&gt;:snippet&lt;/span&gt;])&lt;br /&gt;    &lt;span class=&quot;rails&quot;&gt;redirect_to&lt;/span&gt; admin_instance_path(params[&lt;span class=&quot;sy&quot;&gt;:snippet&lt;/span&gt;])&lt;br /&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
La méthode Destroy supprime le snippet passé en paramètre et redirige vers la liste.
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;destroy&lt;/span&gt;&lt;br /&gt;   &lt;span class=&quot;co&quot;&gt;Snippet&lt;/span&gt;.find(params[&lt;span class=&quot;sy&quot;&gt;:id&lt;/span&gt;]).destroy&lt;br /&gt;   &lt;span class=&quot;rails&quot;&gt;redirect_to&lt;/span&gt; admin_path&lt;br /&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
Passons donc aux vues :
&lt;/p&gt;
&lt;p&gt;
La vue &lt;code&gt;index.rhtml&lt;/code&gt; du controller admin ressemble à celle du controller snippets à la différence près qu'elle rajoute un lien éditer et un bouton supprimer pour chaque snippet ainsi qu'un lien pour créer un nouveau snippet en bas de page.
&lt;/p&gt;
&lt;p&gt;
La vue show est la même que celle du controller snippets à un lien près.
&lt;/p&gt;
&lt;p&gt;
Les vues new et edit méritent plus de précisions :
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&amp;lt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;% &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;form_for&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sy&quot;&gt;:snippet&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;:url&lt;/span&gt; =&amp;gt; admin_url , &lt;span class=&quot;sy&quot;&gt;:method&lt;/span&gt;=&amp;gt;&lt;span class=&quot;sy&quot;&gt;:post&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |f| &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;br /&gt;        &amp;lt;%= content_tag :label , &amp;quot;Titre&amp;quot;, {:for=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;titre&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;} %&amp;gt;&amp;lt;br &lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;&lt;br /&gt;        &amp;lt;%= f.text_field :titre %&amp;gt;&amp;lt;br &lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;%=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; content_tag :label , &amp;quot;Texte&amp;quot;, {:for&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;=&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;texte&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;} %&amp;gt;&amp;lt;br &lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;%= f.text_area :texte %&amp;gt;&amp;lt;br &lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;%=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; submit_tag &amp;quot;Create Snippet&amp;quot;%&amp;gt;&lt;br /&gt;&amp;lt;%end%&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
La méthode form_for demande plusieurs paramètres.
Le premier désigne le modèle en relation avec le formulaire crée (ici snippet).
Le deuxième défini l'url d'action du formulaire.
Le troisième la méthode d'envoi.
A l'intérieur du bloc crée par &lt;code&gt;form_for do ... end&lt;/code&gt;, les éléments seront automatiquement associés au modèle correspondant (regardez le paramètre name des champs dans la source générée pour mieux comprendre).
&lt;/p&gt;
&lt;p&gt;
Vous l'avez peut être remarqué, les controllers comme les vues font un usage intensif de l'utilisation des routes automatiquement créees par Rails dans le cas d'une application REST (comme admin_path, admin_instance_path...).
&lt;/p&gt;
&lt;p&gt;
J'ai volontairement choisi le nom admin pour ce controller pour vous montrer une petite spécifité de Rails.&lt;br /&gt;
Normalement, les noms des controllers sont au pluriel (comme Snippets) mais si l'on désire nommer son controller Admin (car c'est de l'administration et non pas des administrateurs que l'on parle), on fait face à un petit problème.&lt;br /&gt;
En effet, Rails se charge de mettre au singulier admin et nous propose admin, ce qui n'est pas faux, mais très génant puisque des routes devant être différentes ont désormais le même nom.&lt;br /&gt;
On doit donc dans ce cas, spécifier dans le fichier routes.rb le singulier que l'on utilisera  grâce au paramètre :singular (j'ai pour ma part choisi admin_instance).&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;  map.resources &lt;span class=&quot;sy&quot;&gt;:admin&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;:singular&lt;/span&gt; =&amp;gt; &lt;span class=&quot;sy&quot;&gt;:admin_instance&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Il existe un autre problème dans notre application telle qu'elle est actuellement.&lt;/p&gt;
&lt;p&gt;En effet, si vous editez ou créez un snippet en plaçant des retours à la ligne dans la description de celui-ci, vous remarquerez qu'à l'affichage, les retours chariots ont disparus.&lt;/p&gt;
&lt;p&gt;
La raison en est simple, à l'enregistrement, Rails enregistre le texte situé dans la textarea en utilisant le caractère de retour chariot normal à savoir &amp;quot;\n&amp;quot;. &lt;/p&gt;
&lt;p&gt;Ce comportement est parfaitement logique puisque si nous voulons fournir notre contenu dans différents formats (HTML, XML, PDF...), nous ne souhaiterions pas avoir de marquage HTML dans nos données. &lt;/p&gt;
&lt;p&gt;
Pourtant à l'affichage dans notre vue, on aimerait bien que ceux-ci soient interprétés et traduit en langage HTML.
Rails fournit un moyen très simple d'y parvenir en utilisant la méthode simple_format d'ActionView.
&lt;/p&gt;
&lt;p&gt;
Celle-ci remplacera par exemple les sauts de ligne par des &amp;lt;br /&amp;gt; et les doubles sauts de lignes par des paragraphes(&amp;lt;p&amp;gt; &amp;lt;/p&amp;gt;)
&lt;/p&gt;
&lt;p&gt;
On aura donc dans nos vues quelquechose comme :
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&amp;lt;%= content_tag :p, simple_format(@snippet.texte) %&amp;gt;&lt;/pre&gt;
&lt;p&gt;
Pour poursuivre cette deuxième partie du tutorial, je vous propose de commencer la mise en place d'un moteur de recherche très simple pour nos snippets.
&lt;/p&gt;
&lt;p&gt;
Grâce à ce moteur, je souhaiterais afficher les snippets dont le titre ou le texte contient la recherche faite par l'utilisateur.
&lt;/p&gt;
&lt;p&gt;
Commençons donc par créer la méthode associée dans notre modèle :
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;def self.find_by_titre_or_texte(search)&lt;br /&gt;	search ||= &amp;quot;&amp;quot;&lt;br /&gt;	self.find(:all,:conditions =&amp;gt; [&amp;quot;titre ILIKE (?) OR texte ilike (?)&amp;quot;,&amp;quot;%&amp;quot;+search+&amp;quot;%&amp;quot;,&amp;quot;%&amp;quot;+search+&amp;quot;%&amp;quot;],:order =&amp;gt; &amp;quot;id desc&amp;quot;)&lt;br /&gt;end&lt;/pre&gt;
&lt;p&gt;
Le nom de la méthode est préfixé par self car celle-ci est une méthode du modèle Snippet et non pas une méthode applicable à une instance d'un Snippet.
&lt;/p&gt;
&lt;p&gt;La première ligne correspond à dire search = search si search existe et la chaine vide &amp;quot;&amp;quot; dans le cas contraire.&lt;/p&gt;
&lt;p&gt;
La méthode est assez triviale, elle effectue un find avec les paramètres all et conditions.&lt;br /&gt;
Le premier indique de récupérer tous les enregistrements (et non un seul).&lt;br /&gt;
Le deuxième défini les conditions de la requête, on y demande donc de vérifier si le titre ou le texte IS LIKE &amp;quot;%search%&amp;quot;.&lt;br /&gt;
En SQL, les % désignent n'importe quelle chaîne de caractère et le I de ILIKE indique de ne pas tenir compte de la casse.
Cette requête sera donc traduit en : &lt;br /&gt;
&lt;code&gt;SELECT * FROM snippets WHERE titre ILIKE '%search%' or texte ILIKE '%search%' ;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
Dans notre controller snippets, la méthode qui nous sert à afficher une liste de snippets est la méthode index.&lt;br /&gt;
Nous allons donc lui passer un paramètre search pour lui indiquer de n'afficher que les résultant correspondant à notre recherche.
&lt;/p&gt;
&lt;p&gt;
Le paramètre search vaut par défaut la chaîne vide. De cette façon, la recherche donnera des conditions comme : &lt;code&gt;
titre ILIKE '%%' &lt;/code&gt; ce qui est vrai pour tous les titres.
&lt;/p&gt;
&lt;p&gt;
Les paramères en GET sont passés en ajoutant ?param1=value1&amp;amp;param2=value2&amp;amp;param3=value3 à l'adresse demandée.&lt;br /&gt;
Nous appelerons donc snippets?search=rails pour récupérer tous les snippets traitant de rails.&lt;br /&gt;
(ex : &lt;a href=&quot;http://depot.blogbangbang.com/snippets?search=rails&quot;&gt;http://depot.blogbangbang.com/snippets?search=rails&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;
J'ai également ajouté un formulaire de recherche simpliste dans le layout afin de pouvoir faire une recherche de partout.
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;        &amp;lt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;% &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;form_tag&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;/snippets&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;:method&lt;/span&gt;=&amp;gt;&lt;span class=&quot;sy&quot;&gt;:get&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; -&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;br /&gt;        &amp;lt;%= text_field_tag 'search' %&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;        &amp;lt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;%=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; submit_tag 'Search' %&amp;gt;&lt;br /&gt;        &amp;lt;%end-%&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;
Celui ci appelle donc l'URL snippets en get, et le paramètre de recherche est nommé search comme le paramètre récupéré dans notre controller.
&lt;p&gt;
En guise de conclusion de cette deuxième partie, nous allons corriger un autre défaut de notre application.&lt;br /&gt;
Vous avez peut être constater qu'à la fin de la première partie, l'adresse : &lt;a href=&quot;http://depot.blogbangbang.com&quot;&gt;depot.blogbangbang.com&lt;/a&gt; amenait à la page d'accueil d'une application RubyOnRails.&lt;br /&gt; Il serait préférable de remplacer ce comportement par défaut par la page d'accueil de notre application, à savoir la page snippets.
&lt;/p&gt;
&lt;p&gt;
Pour celà rien de plus simple, ne sortez surtout pas l'artillerie lourde et les ré-écriture d'URL..., rails s'occupe de tout (oui encore :-D)&lt;/p&gt;
&lt;p&gt;Nous lui signifions une seule chose dans le fichier &lt;code&gt;routes.rb&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;map.connect '', :controler =&amp;gt; &amp;quot;snippet&amp;quot;&lt;/pre&gt;
&lt;p&gt;
Supprimons également le fichier index.html dans le dossier public.
Et voilà c'est tout ! Grâce à cette ligne, rails sait que si l'url demandé est vide (''), il doit rediriger vers le controlleur snippets qui par defaut éxécutera l'action index.
&lt;/p&gt;
&lt;p&gt;
Voilà, nous arrivons au terme de ce deuxième tutorial, j'espère que vous commencez à saisir la puissance du framework RubyOnRails et le plaisir que peut avoir un développeur à coder grâce à celui-çi.
&lt;/p&gt;
&lt;p&gt;
Dans le prochain épisode, nous ajouterons des tags à nos snippets afin de les trier plus facilement.
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.blogbangbang.com/utils/depot2.zip&quot;&gt;Archive&lt;/a&gt; pour voir l'état actuel de l'ensemble des fichiers.
&lt;/p&gt;</description>
    
    
    
          <comments>http://blogbangbang.com/post/2007/08/01/Tutorial-%3A-creer-sa-premiere-application-Ruby-on-Rails-Part2#comment-form</comments>
      <wfw:comment>http://blogbangbang.com/post/2007/08/01/Tutorial-%3A-creer-sa-premiere-application-Ruby-on-Rails-Part2#comment-form</wfw:comment>
      <wfw:commentRss>http://blogbangbang.com/feed/rss2/comments/46</wfw:commentRss>
      </item>
    
  <item>
    <title>Tutorial : créer sa première application Ruby on Rails - Bilan1</title>
    <link>http://blogbangbang.com/post/2007/07/23/Tutorial-%3A-creer-sa-premiere-application-Ruby-on-Rails-Bilan1</link>
    <guid isPermaLink="false">urn:md5:54bb09dc9de54bf23bac42f275c5701c</guid>
    <pubDate>Mon, 23 Jul 2007 23:34:00 +0200</pubDate>
    <dc:creator>jblanche</dc:creator>
        <category>geeks</category>
        <category>RubyOnRails</category><category>Tutorial</category>    
    <description>    &lt;p&gt;Après ce premier billet de cette série de tutoriaux, voici l'heure du premier bilan.&lt;/p&gt;
&lt;p&gt;Commençons par un bilan &amp;quot;comptable&amp;quot; : &lt;/p&gt;
&lt;p&gt;Le premier article à été assez bien accueilli puisque la fréquentation de blog à frôlé les 100 visiteurs uniques vendredi dernier grâce notamment à une petite auto promotion sur railsfrance et blogasty (sans les visites par le flux RSS &lt;del&gt;que je ne suis pas en mesure de calculer puisque je ne suis toujours pas inscrit à un service comme feedburner&lt;/del&gt;, maintenant ce sera fait on verra le résultat ces prochains jours &lt;img src=&quot;/themes/john/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt; )&lt;/p&gt;
&lt;p&gt;Toutefois, ces articles me prennent un temps fou à écrire et j'avoue que je m'attendais à un peu plus de retour en matière de commentaires notamment.&lt;br /&gt;
Alors, certains diront que j'insiste mais si vous pensez suivre cette série de tutoriaux, laissez moi un petit commentaire, ça motive &lt;img src=&quot;/themes/john/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Faisons maintenant le point sur ce que nous avons appris :&lt;/p&gt;
&lt;p&gt;On aura tout d'abord remarqué qu'une application rails peut s'exécuter par défaut sur trois environnements : development, production et test.&lt;br /&gt;
Ces trois environnements permettent d'obtenir des comportements différents de l'application ainsi que des bases de données différentes.&lt;/p&gt;
&lt;p&gt;On peut donc choisir d'afficher toutes les erreurs, d'insérer des données &amp;quot;virtuelles&amp;quot;... dans l'environnement de développement pour tester de nouvelles &amp;quot;features&amp;quot; pendant que l'environnement de production continuera a tourner a merveille.&lt;br /&gt;
L'environnement de test est un peu a part puisque les données n'y sont pas conservées à l'arrêt de celui ci, il est donc réservé comme son nom l'indique, à la phase de tests&lt;/p&gt;
&lt;p&gt;On a également découvert le mécanisme de migrations de rails. Celui ci  permettra au fur et à mesure de l'avancée de notre projet, d'ajouter des colonnes, des tables... en ayant toujours la possibilité de revenir facilement en arrière et de conserver l'intégrité de nos données.&lt;/p&gt;
&lt;p&gt;Enfin, nous avons découvert quelques une des méthodes d'ActionView, la classe qui rend l'écriture de vues encore plus simple :&lt;/p&gt;
&lt;p&gt;Je sais que certains d'entre vous ont été &amp;quot;choqués&amp;quot; part le fait que les vues ne contenait pas la moindre miette d'HTML, sachez que cela n'est en rien une obligation et qu'il est tout a fait possible d'écrire vos vues en HTML en insérant le code ruby seulement pour les données, mais cela reviendrait à se priver d'un mécanisme vous permettant d'être pratiquement certains d'écrire du code valide XHTML, et qui s'avère à la longue bien plus clair qu'un audacieux mélange entre langage à balise et langage de script.&lt;/p&gt;
&lt;p&gt;Enfin je reviendrais ici sur un détail évident après quelques heures de codage mais qui ne l'est donc pas pour les vrais novices, sachez donc que dans les vues, les balises &amp;lt;% %&amp;gt; entoure un code ruby sans rendu tandis que les contenus placés entre &amp;lt;%= %&amp;gt; seront eux automatiquement affichés par rails.&lt;br /&gt;
Enfin le signe &amp;quot;-&amp;quot; placé après le tag d'ouverture ou avant le tag de fermeture indique que rails ne doit pas imprimé des caractères d'espaces ou de retour charriot situé après ou avant le tag (cela n'aura la plupart du temps d'influence que sur la présentation des sources.)&lt;/p&gt;
&lt;p&gt;Je vous dis désormais à bientôt pour la deuxième partie du tutorial, l'interface d'administration.&lt;/p&gt;</description>
    
    
    
          <comments>http://blogbangbang.com/post/2007/07/23/Tutorial-%3A-creer-sa-premiere-application-Ruby-on-Rails-Bilan1#comment-form</comments>
      <wfw:comment>http://blogbangbang.com/post/2007/07/23/Tutorial-%3A-creer-sa-premiere-application-Ruby-on-Rails-Bilan1#comment-form</wfw:comment>
      <wfw:commentRss>http://blogbangbang.com/feed/rss2/comments/41</wfw:commentRss>
      </item>
    
  <item>
    <title>Tutorial : créer sa première application Ruby on Rails - Part1</title>
    <link>http://blogbangbang.com/post/2007/07/19/Tutorial-%3A-creer-sa-premiere-application-Ruby-on-Rails-Part1</link>
    <guid isPermaLink="false">urn:md5:957c5f121f493f71904a44f628389842</guid>
    <pubDate>Thu, 19 Jul 2007 21:35:00 +0200</pubDate>
    <dc:creator>jblanche</dc:creator>
        <category>geeks</category>
        <category>RubyOnRails</category><category>Tutorial</category>    
    <description>&lt;p&gt;Allez, cette fois, c'est parti ! &lt;br /&gt;
Si vous n'avez pas encore installé ruby on rails et radrails je vous invite a suivre ce &lt;a href=&quot;http://www.blogbangbang.com/post/2007/04/03/Installation-de-RubyOnRails-et-RadRails&quot;&gt;tutoriel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
Pour ce premier tutorial, nous allons créer une version très simplifiée de notre application.
&lt;/p&gt;
Celle-ci s'appellera Depot, nous devons donc créer les bases de données &lt;code&gt;depot_development&lt;/code&gt;, &lt;code&gt;depot_test&lt;/code&gt; et &lt;code&gt;depot_production&lt;/code&gt; sous notre système de bases de données préféré, pour moi ce sera Postgresql mais les fan de Mysql peuvent l'utiliser (avec l'outil Phpmyadmin par exemple).    &lt;p&gt;
Nous devons maintenant indiquer à notre application comment se connecter à la base de données.
Pour cela, éditez le fichier &lt;code&gt;database.yml&lt;/code&gt; (situé dans le dossier &lt;code&gt;config&lt;/code&gt;) pour obtenir quelquechose comme cela.
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;development:&lt;br /&gt;  adapter: postgresql&lt;br /&gt;  database: depot_development&lt;br /&gt;  username: depot&lt;br /&gt;  password: toto&lt;br /&gt;&lt;br /&gt;test:&lt;br /&gt;  adapter: postgresql&lt;br /&gt;  database: depot_test&lt;br /&gt;  username: depot&lt;br /&gt;  password: toto&lt;br /&gt;&lt;br /&gt;production:&lt;br /&gt;  adapter: postgresql&lt;br /&gt;  database: depot_production&lt;br /&gt;  username: depot&lt;br /&gt;  password: toto&lt;/pre&gt;
&lt;p&gt;
La syntaxe parle d'elle même, remplacez simplement postgresql par mysql si nécessaire.
&lt;/p&gt;
&lt;p&gt;
Ensuite, créons le premier modèle (et donc la première table de notre base de données), le modèle Snippet.
Pour ce faire, deux méthodes :
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Soit via l'onglet Generator de radrails, choisir modèle dans la liste, puis tapper snippet dans le champ texte
&lt;/li&gt;
&lt;li&gt;
Soit, et ce sera ma méthode pour le reste de l'application, dans une console à la racine de l'application : &lt;br /&gt;
&lt;code&gt;ruby script/generate model snippet&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Nous venons de créer notre modèle et tous les fichiers associés.
&lt;/p&gt;
&lt;p&gt;
Le premier que nous éditerons est le fichier de migration généré par la création du modèle.&lt;br /&gt;
Celui-ci se trouve dans &lt;code&gt;db/migrate&lt;/code&gt; et se nomme : &lt;code&gt;001_create_snippets.rb&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
Ces fichiers servent à créer notre base de données, en les renseignant avec la syntaxe de Rails, celui ci se chargera d'aptader le code pour le système de gestion de base de données que vous avez choisi (MySQL, Postgres...).
&lt;/p&gt;
&lt;p&gt;
Chaque fichier de migration comporte deux méthodes. La méthode up définie ce que nous souhaitons modifier dans la base de données tandis que la méthode down contient ce que ruby devra faire si l'on souhaite revenir en arrière.
&lt;/p&gt;
&lt;p&gt;
Dans notre cas nous créons donc une table snippets avec les champs titre et texte dans la méthode up, et de quoi détruire cette table dans la méthode down.&lt;br /&gt;
Voilà le résultat :
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;CreateSnippets&lt;/span&gt; &amp;lt; &lt;span class=&quot;co&quot;&gt;ActiveRecord&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Migration&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;pc&quot;&gt;self&lt;/span&gt;.up&lt;br /&gt;    create_table &lt;span class=&quot;sy&quot;&gt;:snippets&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |t|&lt;br /&gt;      t.column &lt;span class=&quot;sy&quot;&gt;:titre&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;:string&lt;/span&gt;&lt;br /&gt;      t.column &lt;span class=&quot;sy&quot;&gt;:texte&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;:text&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;pc&quot;&gt;self&lt;/span&gt;.down&lt;br /&gt;    drop_table &lt;span class=&quot;sy&quot;&gt;:snippets&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
Après avoir faire ceci, retournons dans la console et éxécutons :
&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
rake db:migrate
&lt;/div&gt;
&lt;p&gt;
Ruby devrait avoir créer notre table et les champs associés.
&lt;/p&gt;
&lt;p&gt;
Pour commencer, nous allons entrer des données de test dans ces tables en écrivant dans le fichier &lt;code&gt;snippets.yml&lt;/code&gt; dans &lt;code&gt;test/fixtures&lt;/code&gt;.
&lt;/p&gt;
&lt;p&gt;
Voilà comment j'ai rempli le mien :
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;ruby:&lt;br /&gt;  id: 1&lt;br /&gt;  titre: &amp;quot;Save some time&amp;quot;&lt;br /&gt;  texte: &amp;quot;Use Ruby on Rails&amp;quot;&lt;br /&gt;&lt;br /&gt;two:&lt;br /&gt;  id: 2&lt;br /&gt;  titre: &amp;quot;Improve your user experience&amp;quot;&lt;br /&gt;  texte: &amp;quot;Use Mozilla Firefox&amp;quot;&lt;/pre&gt;
&lt;div class=&quot;note&quot;&gt;
Note : Les tables ruby contiennent automatiquement un enregistrement ID
&lt;/div&gt;
&lt;p&gt;
Nous allons maintenant créer nos premiers controllers.&lt;br /&gt;
J'ai choisi d'en créer deux pour commencer, un controller Admin depuis lequel on pourra ajouter, modifier et supprimer nos Snippets (accessible seulement par les administrateurs) et un controller Snippets qui sera le site accessible par tout le monde.
&lt;/p&gt;
&lt;p&gt;
Allez lancons nous :
&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
ruby script/generate controller snippets
&lt;/div&gt;
&lt;p&gt;
puis
&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
ruby script/generate controller admin
&lt;/div&gt;
&lt;p&gt;
Ces deux scripts ont à leur tour créés quelques fichiers et dossiers notamment les fichiers &lt;code&gt;snippets_controller.rb&lt;/code&gt; et &lt;code&gt;admin_controller.rb&lt;/code&gt;
ainsi que les dossiers &lt;code&gt;app/views/snippets&lt;/code&gt; et &lt;code&gt;app/views/admin&lt;/code&gt;.
&lt;/p&gt;
&lt;p&gt;
Pour le moment, rendons nous dans le fichier &lt;code&gt;routes.rb&lt;/code&gt; situé dans le dossier &lt;code&gt;config&lt;/code&gt;.&lt;br /&gt;
Ce fichier sert à configurer le lien entre votre application et les url qui lui sont associées. &lt;/p&gt;
&lt;p&gt;
Nous allons donc appliquer nos propres routes (celles par défaut correspondent à une application non REST).
&lt;/p&gt;
&lt;p&gt;
Pour cela, ajoutons deux lignes au fichier pour obtenir la chose suivante :
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;span class=&quot;co&quot;&gt;ActionController&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Routing&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Routes&lt;/span&gt;.draw &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |map|&lt;br /&gt;  map.resources &lt;span class=&quot;sy&quot;&gt;:admin&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;:singular&lt;/span&gt; =&amp;gt; &lt;span class=&quot;sy&quot;&gt;:admin_instance&lt;/span&gt;&lt;br /&gt;  map.resources &lt;span class=&quot;sy&quot;&gt;:snippets&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  map.connect &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:controller/:action/:id.:format&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  map.connect &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:controller/:action/:id&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Grâce à ces deux petites lignes l'application est désormais RESTFUL et notre travail sera bien facilité.
Je reviendrais dans un prochain billet sur le &lt;code&gt;:singular&lt;/code&gt; pour les curieux).
&lt;/p&gt;
&lt;p&gt;
Il ne nous manque plus grand chose pour avoir une application en état de fonctionnement.&lt;br /&gt;
Je vous propose pour terminer ce premier tuto d'écrire les controllers et vues de la partie Snippets (accessible à tous) de notre site.
&lt;/p&gt;
&lt;p&gt;
Pour cela éditons le fichier &lt;code&gt;snippets_controller.rb&lt;/code&gt; dans &lt;code&gt;app/controllers&lt;/code&gt;.
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;SnippetsController&lt;/span&gt; &amp;lt; &lt;span class=&quot;co&quot;&gt;ApplicationController&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;index&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;iv&quot;&gt;@snippets&lt;/span&gt; = &lt;span class=&quot;co&quot;&gt;Snippet&lt;/span&gt;.find(&lt;span class=&quot;sy&quot;&gt;:all&lt;/span&gt;,&lt;span class=&quot;sy&quot;&gt;:order&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;id desc&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;br /&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;show&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;iv&quot;&gt;@snippet&lt;/span&gt; = &lt;span class=&quot;co&quot;&gt;Snippet&lt;/span&gt;.find(params[&lt;span class=&quot;sy&quot;&gt;:id&lt;/span&gt;])    &lt;br /&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
Est-t'il nécessaire d'expliquer le code tellement celui-ci est simple ?&lt;br /&gt;
Allez je vous le fais quand même &lt;img src=&quot;/themes/john/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt; &lt;br /&gt;
La ligne : &lt;code&gt;@snippets = Snippet.find(:all,:order =&amp;gt; &amp;quot;id desc&amp;quot;)&lt;/code&gt; permet de stocker dans la variable &lt;code&gt;@snippets&lt;/code&gt; un objet contenant les Snippets
renvoyés par le modèle Snippet quand on lui demande de chercher (&lt;code&gt;find&lt;/code&gt;) tous les snippets (&lt;code&gt;:all&lt;/code&gt;) en les ordonnant par leur id avec les plus élevés en premiers (&lt;code&gt;:order =&amp;gt; &amp;quot;id desc&amp;quot;&lt;/code&gt;) .
&lt;/p&gt;
&lt;p&gt;
La ligne @snippet = &lt;code&gt;Snippet.find(params[:id])&lt;/code&gt; demande elle au modèle Snippet de chercher l'enregistrement ayant l'id passé en paramètre.
&lt;/p&gt;
&lt;p&gt;
Avec seulement ces deux petites lignes, nous avons tout ce qu'il nous faut pour afficher nos vues.
&lt;/p&gt;
&lt;p&gt;
Rendez-vous donc dans le dossier &lt;code&gt;views/snippets&lt;/code&gt; pour créer les deux vues : &lt;br /&gt;
Commençons par la vue dédiée à l'affichage d'un snippet que l'on nommera&lt;code&gt; show.rhtml&lt;/code&gt; :
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&amp;lt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;%=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; content_tag :h2, @snippet.titre %&amp;gt;&lt;br /&gt;&amp;lt;%&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;=&lt;/span&gt;&lt;/span&gt; content_tag &lt;span class=&quot;sy&quot;&gt;:p&lt;/span&gt;, &lt;span class=&quot;iv&quot;&gt;@snippet&lt;/span&gt;.texte &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
et poursuivons avec la vue pour les lister nommée &lt;code&gt;index.rhtml&lt;/code&gt; :
&lt;pre class=&quot;ruby&quot;&gt;&amp;lt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;% &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;@snippets.each&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |snippet| &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;br /&gt;  &amp;lt;% content_tag :div, :class =&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;snippet&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; -&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;br /&gt;  &amp;lt;%= content_tag :h2, (link_to snippet.titre, snippet_path(snippet)) %&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &amp;lt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;%=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; content_tag :p, snippet.texte %&amp;gt;&lt;br /&gt;  &amp;lt;% end -%&amp;gt;&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
Sachez simplement pour l'instant que le :
&lt;code&gt; &amp;lt;% @snippets.each do |snippet| %&amp;gt;&lt;/code&gt; permet d'itérer sur l'objet contenant tous les snippets et que la méthode &lt;code&gt;content_tag&lt;/code&gt; écrit le tag HTML passé avec le premier paramètre et contenant le deuxième (ex : &lt;code&gt;content_tag :p, &amp;quot;Hello&amp;quot; affichera &amp;lt;p&amp;gt;Hello&amp;lt;/p&amp;gt;&lt;/code&gt;)
&lt;/p&gt;
&lt;p&gt;
Si vous reproduisez ce tutoriel chez vous, récupérez les fichiers &lt;a href=&quot;http://www.blogbangbang.com/utils/snippets.rhtml&quot;&gt;snippets.rhtml&lt;/a&gt; (&lt;code&gt;app/views/layout&lt;/code&gt;) et &lt;a href=&quot;http://www.blogbangbang.com/utils/snippets.css&quot;&gt;snippets.css&lt;/a&gt; (&lt;code&gt;public/stylesheets&lt;/code&gt;) pour customiser votre interface.
&lt;/p&gt;
&lt;p&gt;
Pour la lancer, éxécutez &lt;code&gt;ruby script/server&lt;/code&gt; dans le terminal, celle-ci devrait alors être accessible à l'adresse &lt;a href=&quot;http://0.0.0.0:3000&quot;&gt;http://0.0.0.0:3000&lt;/a&gt;.&lt;br /&gt;
Pour les autres, ma version est disponible ici : &lt;a href=&quot;http://depot.blogbangbang.com/snippets&quot;&gt;http://depot.blogbangbang.com/snippets&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Sachez toutefois que la partie &lt;code&gt;&amp;lt;%= yield %&amp;gt;&lt;/code&gt; dans le layout ne doit pas etre suprimée puisqu'elle correspond à l'endroit ou s'afficheront les données des vues.
&lt;/p&gt;
&lt;p&gt;
Voilà nous arrivons au terme de ce long tutorial, pas mal de chose à mettre en place pour la première version de cette application mais toute ces choses ne seront plus à refaire et nous permettent désormais d'avoir une miriade de possibilités pour la suite.
&lt;br /&gt;
Je reviendrais dans le prochain billet sur quelques points précis de ce tutorial et nous crérons ensuite l'interface d'administration.
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.blogbangbang.com/utils/depot.zip&quot;&gt;Archive&lt;/a&gt; pour voir l'état actuel de l'ensemble des fichiers.
&lt;/p&gt;</description>
    
    
    
          <comments>http://blogbangbang.com/post/2007/07/19/Tutorial-%3A-creer-sa-premiere-application-Ruby-on-Rails-Part1#comment-form</comments>
      <wfw:comment>http://blogbangbang.com/post/2007/07/19/Tutorial-%3A-creer-sa-premiere-application-Ruby-on-Rails-Part1#comment-form</wfw:comment>
      <wfw:commentRss>http://blogbangbang.com/feed/rss2/comments/40</wfw:commentRss>
      </item>
    
  <item>
    <title>Tutorial : créer sa première application Ruby on Rails - Intro</title>
    <link>http://blogbangbang.com/post/2007/07/19/Tutorial-%3A-creer-sa-premiere-application-Ruby-on-Rails-Intro</link>
    <guid isPermaLink="false">urn:md5:dfbe300926aa7487ba4cce66129a2fcf</guid>
    <pubDate>Thu, 19 Jul 2007 00:25:00 +0200</pubDate>
    <dc:creator>jblanche</dc:creator>
        <category>geeks</category>
        <category>RubyOnRails</category><category>Tutorial</category>    
    <description>    &lt;p&gt;Je les avais promis depuis très longtemps, les tutoriaux sur Ruby on Rails arrivent enfin sur ce blog.&lt;/p&gt;
&lt;p&gt;Il me fallait une application à la fois très simple (pour pouvoir l'expliquer correctement) mais néanmoins assez etoffée pour tenir quelques tutos.&lt;br /&gt;
Ce que je vous propose, c'est donc de créer un site qui contiendra un dépot de code (ou snippets).&lt;br /&gt;
Ce dépot peut servir à recopier rapidement un petit bout de code qui vous a été utile et que vous aimeriez retrouver facilement.&lt;/p&gt;
&lt;p&gt;Un exellent exemple de ce genre de dépot est Snipeet, propulsé par Symfony un &amp;quot;équivalent&amp;quot; PHP de rails, dont vous pouvez consulter un exemple sur le site
&lt;a href=&quot;http://snippets.prendreuncafe.com/&quot; hreflang=&quot;fr&quot;&gt;snippets.prendreuncafe.com&lt;/a&gt;[&lt;a href=&quot;http://blogbangbang.com/post/2007/07/19/#pnote-1&quot; class=&quot;note&quot; id=&quot;rev-pnote-1&quot;&gt;1&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;Dans cette série de tutoriaux nous allons donc créer une application comme Snipeet qui contiendra, au fur et à mesure, la gestion des tags, la recherche, un système de votes...&lt;br /&gt;
On pourra bien sur immaginer d'autres fonctionnalités en fonction de vos retours (si tant est qu'il y en ait).&lt;/p&gt;
&lt;p&gt;Pour cette application, j'ai choisi d'utiliser un modèle d'architecture REST.&lt;br /&gt;
Je ne reviendrais pas ici sur les spécificités de cette architecture mais je vous invite à lire les articles ou diaporamas suivants : &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'incontournable &lt;a href=&quot;http://fr.wikipedia.org/wiki/Representational_state_transfer&quot; hreflang=&quot;fr&quot;&gt;wikipedia fr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.biologeek.com/journal/index.php/pour-ne-plus-etre-en-rest-comprendre-cette-architecture&quot; hreflang=&quot;fr&quot;&gt;Biologeek&lt;/a&gt; qui explique le principe avant de s'attaquer à la réalisation avec Django&lt;/li&gt;
&lt;li&gt;Un &lt;a href=&quot;http://www.blogbangbang.com/utils/REST_Rails_OSDC_2007.pdf&quot;&gt;diaporama&lt;/a&gt; résumant très bien son implémentation dans Ruby on Rails&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Sachez enfin que cette série de tuto, à évidement pour but de partager les quelques connaissances que j'ai acquis après quelques mois de développement en Ruby on Rails mais également d'améliorer mon niveau avec ce framework.
&lt;/p&gt;
&lt;p&gt;J'apprenderais donc parfois en même temps que vous et je vous invite à critiquer mes choix, mon code quand vous trouverez à redire (ce qui ne manquera pas d'arriver).&lt;/p&gt;
&lt;p&gt;Ca vous tente ? Alors &lt;a href=&quot;http://www.blogbangbang.com/post/2007/07/19/Tutorial-%3A-creer-sa-premiere-application-Ruby-on-Rails-Part1&quot;&gt;suivez moi&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://blogbangbang.com/post/2007/07/19/#rev-pnote-1&quot; id=&quot;pnote-1&quot;&gt;1&lt;/a&gt;]
Vous êtes également invité à vous rendre sur le &lt;a href=&quot;http://prendreuncafe.com/blog&quot; hreflang=&quot;fr&quot;&gt;blog&lt;/a&gt;, tout aussi excellent.&lt;/p&gt;</description>
    
    
    
          <comments>http://blogbangbang.com/post/2007/07/19/Tutorial-%3A-creer-sa-premiere-application-Ruby-on-Rails-Intro#comment-form</comments>
      <wfw:comment>http://blogbangbang.com/post/2007/07/19/Tutorial-%3A-creer-sa-premiere-application-Ruby-on-Rails-Intro#comment-form</wfw:comment>
      <wfw:commentRss>http://blogbangbang.com/feed/rss2/comments/38</wfw:commentRss>
      </item>
    
</channel>
</rss>