<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://prendreuncafe.com/blog/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/">
<channel>
  <title>Prendre un Café - Ruby</title>
  <link>http://prendreuncafe.com/blog/</link>
  <description></description>
  <language>fr</language>
  <pubDate>Wed, 14 May 2008 15:57:49 +0200</pubDate>
  <copyright>Contenus sous licence Creative Commons BY-SA</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Ruby on Rails 1.2.2, les migrations</title>
    <link>http://prendreuncafe.com/blog/post/2007/03/03/Ruby-on-Rails-122-les-migrations</link>
    <guid isPermaLink="false">urn:md5:389794342e4062fe62ff4ce44dadd801</guid>
    <pubDate>Sat, 03 Mar 2007 22:19:00 +0100</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Ruby</category>
        <category>framework</category><category>rails</category><category>ruby</category><category>tutoriel</category>    
    <description>    &lt;p&gt;Voici la suite du &lt;a href=&quot;http://prendreuncafe.com/blog/post/2007/03/03/Ruby-on-Rails-122-premier-contact&quot; hreflang=&quot;fr&quot;&gt;précédent tutoriel sur Ruby on Rails&lt;/a&gt; publié sur ce même blog ou nous avons mis en place une application de gestion de contacts rudimentaire.&lt;/p&gt;


&lt;h3&gt;Migration de schéma de base de données&lt;/h3&gt;


&lt;p&gt;Imaginons que nous voulions gérer une liste de sociétés, et lier chacun de nos contacts à sa société... Il va nous falloir modifier notre base de données en ajoutant une table &lt;code&gt;companies&lt;/code&gt; et une clé &lt;code&gt;company_id&lt;/code&gt; dans la table &lt;code&gt;contacts&lt;/code&gt;. Cela peut s'avérer compliqué puisqu'elle contient déjà des données... même si en l'occurence il ne s'agit pour l'heure que de données de test.&lt;/p&gt;


&lt;p&gt;Rails et plus particulièrement &lt;a href=&quot;http://wiki.rubyonrails.com/rails/pages/ActiveRecord&quot; hreflang=&quot;en&quot;&gt;ActiveRecord&lt;/a&gt; proposent un outil de gestion des évolutions du modèle de données intelligent, les &lt;a href=&quot;http://api.rubyonrails.org/classes/ActiveRecord/Migration.html&quot; hreflang=&quot;en&quot;&gt;migrations&lt;/a&gt;. Au même titre que nous avions créé le fichier &lt;code&gt;db/migrate/001_contacts_development.rb&lt;/code&gt; pour définir le schéma initial lors du &lt;a href=&quot;http://prendreuncafe.com/blog/post/2007/03/03/Ruby-on-Rails-122-premier-contact&quot; hreflang=&quot;fr&quot;&gt;tutoriel précédent&lt;/a&gt;, nous allons maintenant créer son évolution incrémentale dans le fichier &lt;code&gt;db/migrate/002_contacts_development.rb&lt;/code&gt; :&lt;/p&gt;

&lt;pre class=&quot;ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;class&lt;/span&gt; ContactsDevelopment &amp;lt; ActiveRecord::Migration
  
  &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;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# On renomme le champs name en first_name (ne devra contenir que le prénom)&lt;/span&gt;
    rename_column :contacts, &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;,       &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;first_name&amp;quot;&lt;/span&gt;
    
    &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# Ajout d'un champs pour stocker le nom de famille&lt;/span&gt;
    add_column    :contacts, &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;last_name&amp;quot;&lt;/span&gt;,  :&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;string&lt;/span&gt;
    
    &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# Ajout d'un champs pour stocker la société du contact&lt;/span&gt;
    add_column    :contacts, &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;company_id&amp;quot;&lt;/span&gt;, :&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;integer&lt;/span&gt;
    
    &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# Création de la table des sociétés&lt;/span&gt;
    create_table &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;companies&amp;quot;&lt;/span&gt;, :force =&amp;gt; &lt;span style=&quot;color:#0000FF; font-weight:bold;&quot;&gt;true&lt;/span&gt; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt; |t| 
      t.&lt;span style=&quot;color:#9900CC;&quot;&gt;column&lt;/span&gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;,        :&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;string&lt;/span&gt;
      t.&lt;span style=&quot;color:#9900CC;&quot;&gt;column&lt;/span&gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;description&amp;quot;&lt;/span&gt;, :text
      t.&lt;span style=&quot;color:#9900CC;&quot;&gt;column&lt;/span&gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;url&amp;quot;&lt;/span&gt;,         :&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;string&lt;/span&gt;
    &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt; 
  &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt; 
&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;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# Rétablissement de la colonne name&lt;/span&gt;
    rename_column :contacts, &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;first_name&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# Destruction de la colonne last_name&lt;/span&gt;
    remove_column :contacts, :last_name
    
    &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# Destruction de la colonne contenant la référence à une société&lt;/span&gt;
    remove_column :contacts, :company
    
    &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# Destruction de la table contenant les sociétés&lt;/span&gt;
    drop_table :companies
  &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt; 
&amp;nbsp;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Dans chaque classe de migration de schéma, une méthode &lt;code&gt;up&lt;/code&gt; appliquera des modifications au modèles tandis qu'une méthode &lt;code&gt;down&lt;/code&gt; permettra un rollback des modifications vers une version antérieure. Pour le détail des opérations effectuées par le script de migration ci-dessus, je crois que les commentaires parlent d'eux-mêmes &lt;img src=&quot;/blog/themes/PuC4/smilies/wink.gif&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt; (j'en ai profité pour répartir le patronyme sur deux champs, nom et prénom)&lt;/p&gt;


&lt;p&gt;La mise à jour effective du modèle dans la base de données s'effectue grâce à la commande :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;$ rake db:migrate 
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #b1b100;&quot;&gt;in&lt;/span&gt; /home/niko/ww2/rails/contacts&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
== ContactsDevelopment: migrating =============================================
-- rename_column&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;:contacts, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;first_name&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
   -&amp;gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;0&lt;/span&gt;.0750s
-- add_column&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;:contacts, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;last_name&amp;quot;&lt;/span&gt;, :string&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
   -&amp;gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;0&lt;/span&gt;.0153s
-- add_column&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;:contacts, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;company_id&amp;quot;&lt;/span&gt;, :integer&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
   -&amp;gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;0&lt;/span&gt;.0343s
-- create_table&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;companies&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;:&lt;span style=&quot;color: #0000ff;&quot;&gt;force=&lt;/span&gt;&amp;gt;true&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
   -&amp;gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;0&lt;/span&gt;.0304s
== ContactsDevelopment: migrated &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;0&lt;/span&gt;.1694s&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; ====================================&lt;/pre&gt;


&lt;p&gt;Nous n'avons pas d'outils d'administration pour notre nouvelle table &lt;code&gt;companies&lt;/code&gt;, créons-les :&lt;/p&gt;


&lt;pre&gt;$ ruby script/generate scaffold Company&lt;/pre&gt;


&lt;p&gt;Il faut maintenant mettre à jour notre jeu de données ; on édite d'abord le nouveau fichier &lt;code&gt;./test/fixtures/companies.yml&lt;/code&gt; :&lt;/p&gt;

&lt;pre&gt;Nanonical:
  id:          1
  name:        Nanonical
  description: On vous préfère libres
  url:         http://www.nanonical.com
  
Crimosoft:
  id:          2
  name:        Crimosoft
  description: Notre monopole, c'est trop lol
  url:         http://www.crimosoft.com&lt;/pre&gt;

&lt;p&gt;&lt;small style=&quot;color:grey&quot;&gt;Toute ressemblance avec des sociétés existantes ou ayant existé serait un sacré coup de pot&lt;/small&gt;&lt;/p&gt;



&lt;p&gt;Puis, dans le fichier &lt;code&gt;./test/fixtures/contacts.yml&lt;/code&gt; :&lt;/p&gt;

&lt;pre&gt;John:
  id:         1
  first_name: John
  last_name:  Doe
  email:      john@doe.com
  address:    12, rue des champs
  zip:        75009
  city:       Paris
  country:    France
  company_id: 1 # John -&amp;gt; Nanonical
 
Bob:
  id:         2
  first_name: Bob 
  last_name:  Doe 
  email:      bob@doe.com
  address:    1, place du pré 
  zip:        35000
  city:       Rennes
  country:    France
  company_id: 2 # Bob -&amp;gt; Crimosoft&lt;/pre&gt;


&lt;p&gt;On réinsère nos nouvelles fixtures :&lt;/p&gt;


&lt;pre&gt;$ rake db:fixtures:load&lt;/pre&gt;


&lt;p&gt;On peut se rendre successivement aux adresses &lt;a href=&quot;http://0.0.0.0:3000/contacts&quot; hreflang=&quot;fr&quot;&gt;http://0.0.0.0:3000/contacts&lt;/a&gt; et &lt;a href=&quot;http://0.0.0.0:3000/companies&quot; hreflang=&quot;fr&quot;&gt;http://0.0.0.0:3000/companies&lt;/a&gt; afin de s'assurer que tout va bien.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/Geekeries/Rails/companies_scaffolding.png&quot; alt=&quot;companies_scaffolding.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;h3&gt;Mise à jour des classes modèles&lt;/h3&gt;


&lt;p&gt;Pour que Rails prenne en compte les modifications structurelles de notre schéma, nous allons éditer les fichiers des modèles &lt;code&gt;Contact&lt;/code&gt; et &lt;code&gt;Company&lt;/code&gt;, notamment pour spécifier leur type de relation grace aux &lt;a href=&quot;http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html&quot; hreflang=&quot;en&quot;&gt;méthodes de classe ActiveRecord&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Le fichier &lt;code&gt;./apps/models/contact.rb&lt;/code&gt; :&lt;/p&gt;

&lt;pre class=&quot;ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;class&lt;/span&gt; Contact &amp;lt; ActiveRecord::Base
  &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# Chaque employé appartient à une compagnie&lt;/span&gt;
  belongs_to :company
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Et le fichier &lt;code&gt;./apps/models/company.rb&lt;/code&gt; :&lt;/p&gt;

&lt;pre class=&quot;ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;class&lt;/span&gt; Company &amp;lt; ActiveRecord::Base
  &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# Une société possède plusieurs employés&lt;/span&gt;
  has_many :contact
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;


&lt;h3&gt;Mise à jour du contrôleur&lt;/h3&gt;


&lt;p&gt;On récupère la liste des sociétés depuis le contrôleur gérant les contacts (situé dans le fichier &lt;code&gt;./app/controllers/contacts_controller.rb&lt;/code&gt;), d'abord pour la création :&lt;/p&gt;

&lt;pre class=&quot;ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;class&lt;/span&gt; ContactsController &amp;lt; ApplicationController
  &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;...&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;
  &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; new
    @contact = Contact.&lt;span style=&quot;color:#9900CC;&quot;&gt;new&lt;/span&gt;
    @companies = Company.&lt;span style=&quot;color:#9900CC;&quot;&gt;find_all&lt;/span&gt;
  &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Puis pour l'édition:&lt;/p&gt;

&lt;pre class=&quot;ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;class&lt;/span&gt; ContactsController &amp;lt; ApplicationController
  &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;...&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;
  &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; edit
    @contact = Contact.&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;:id&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;
    @companies = Company.&lt;span style=&quot;color:#9900CC;&quot;&gt;find_all&lt;/span&gt;
  &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;


&lt;h3&gt;Mise à jour de la vue&lt;/h3&gt;


&lt;p&gt;Enfin, modifions notre formulaire d'édition/création de contacts, situé dans &lt;code&gt;app/views/contacts/_form.rhtml&lt;/code&gt;, comme suit :&lt;/p&gt;

&lt;pre&gt;&amp;lt;%= error_messages_for 'contact' %&amp;gt;
&amp;nbsp;
&amp;lt;!--[form:contact]--&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;label for=&amp;quot;contact_company_id&amp;quot;&amp;gt;Company&amp;lt;/label&amp;gt;
&amp;lt;%= select 'contact', 'company_id', @companies.collect {|c| [c.name, c.id]} %&amp;gt;&amp;lt;/p&amp;gt;
&amp;nbsp;
&amp;lt;p&amp;gt;&amp;lt;label for=&amp;quot;contact_name&amp;quot;&amp;gt;First name&amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;%= text_field 'contact', 'first_name'  %&amp;gt;&amp;lt;/p&amp;gt;
&amp;nbsp;
&amp;lt;p&amp;gt;&amp;lt;label for=&amp;quot;contact_name&amp;quot;&amp;gt;Last name&amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;%= text_field 'contact', 'last_name'  %&amp;gt;&amp;lt;/p&amp;gt;
&amp;nbsp;
&amp;lt;p&amp;gt;&amp;lt;label for=&amp;quot;contact_email&amp;quot;&amp;gt;Email&amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;%= text_field 'contact', 'email'  %&amp;gt;&amp;lt;/p&amp;gt;
&amp;nbsp;
&amp;lt;p&amp;gt;&amp;lt;label for=&amp;quot;contact_address&amp;quot;&amp;gt;Address&amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;%= text_field 'contact', 'address'  %&amp;gt;&amp;lt;/p&amp;gt;
&amp;nbsp;
&amp;lt;p&amp;gt;&amp;lt;label for=&amp;quot;contact_city&amp;quot;&amp;gt;City&amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;%= text_field 'contact', 'city'  %&amp;gt;&amp;lt;/p&amp;gt;
&amp;nbsp;
&amp;lt;p&amp;gt;&amp;lt;label for=&amp;quot;contact_zip&amp;quot;&amp;gt;Zip&amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;%= text_field 'contact', 'zip'  %&amp;gt;&amp;lt;/p&amp;gt;
&amp;nbsp;
&amp;lt;p&amp;gt;&amp;lt;label for=&amp;quot;contact_country&amp;quot;&amp;gt;Country&amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;%= text_field 'contact', 'country'  %&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;!--[eoform:contact]--&amp;gt;&lt;/pre&gt;


&lt;p&gt;Ce qui donne à peu-près ceci :&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/Geekeries/Rails/new_contact_form.png&quot; alt=&quot;Nouveau formulaire de création/édition de contacts&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Et le template d'affichage de notre liste de contacts, dans le fichier &lt;code&gt;./app/views/contacts/list.rhtml&lt;/code&gt; pour y ajouter la colonne affichant le nom de la société pour chaque contact :&lt;/p&gt;

&lt;pre&gt;&amp;lt;h1&amp;gt;Listing contacts&amp;lt;/h1&amp;gt;
&amp;nbsp;
&amp;lt;table&amp;gt;
  &amp;lt;tr&amp;gt;
  &amp;lt;% for column in Contact.content_columns %&amp;gt;
    &amp;lt;th&amp;gt;&amp;lt;%= column.human_name %&amp;gt;&amp;lt;/th&amp;gt;
  &amp;lt;% end %&amp;gt;
    &amp;lt;th&amp;gt;Société&amp;lt;/th&amp;gt;
  &amp;lt;/tr&amp;gt;
  
&amp;lt;% for contact in @contacts %&amp;gt;
  &amp;lt;tr&amp;gt;
  &amp;lt;% for column in Contact.content_columns %&amp;gt;
    &amp;lt;td&amp;gt;&amp;lt;%=h contact.send(column.name) %&amp;gt;&amp;lt;/td&amp;gt;
  &amp;lt;% end %&amp;gt;
    &amp;lt;td&amp;gt;&amp;lt;%= h contact.company.name %&amp;gt;&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;&amp;lt;%= link_to 'Show', :action =&amp;gt; 'show', :id =&amp;gt; contact %&amp;gt;&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;&amp;lt;%= link_to 'Edit', :action =&amp;gt; 'edit', :id =&amp;gt; contact %&amp;gt;&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;&amp;lt;%= link_to 'Destroy', { :action =&amp;gt; 'destroy', :id =&amp;gt; contact }, :confirm =&amp;gt; 'Are you sure?', :method =&amp;gt; :post %&amp;gt;&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
&amp;lt;% end %&amp;gt;
&amp;lt;/table&amp;gt;
&amp;nbsp;
&amp;lt;%= link_to 'Previous page', { :page =&amp;gt; @contact_pages.current.previous } if @contact_pages.current.previous %&amp;gt;
&amp;lt;%= link_to 'Next page', { :page =&amp;gt; @contact_pages.current.next } if @contact_pages.current.next %&amp;gt; 
&amp;nbsp;
&amp;lt;br /&amp;gt;
&amp;nbsp;
&amp;lt;%= link_to 'New contact', :action =&amp;gt; 'new' %&amp;gt;&lt;/pre&gt;


&lt;p&gt;Ce qui donne au final quelque chose comme ceci :&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/Geekeries/Rails/new_contacts_list.png&quot; alt=&quot;Nouvelle liste de contacts&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;h3&gt;To be continued&lt;/h3&gt;


&lt;p&gt;Dans un prochain tutoriel, nous aborderons la validation de formulaires.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Ruby on Rails 1.2.2, premier contact</title>
    <link>http://prendreuncafe.com/blog/post/2007/03/03/Ruby-on-Rails-122-premier-contact</link>
    <guid isPermaLink="false">urn:md5:b416b3ee6aa13888ee8ee6592a9be551</guid>
    <pubDate>Sat, 03 Mar 2007 12:00:00 +0100</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Ruby</category>
        <category>framework</category><category>rails</category><category>ruby</category><category>tutoriel</category>    
    <description>    &lt;p&gt;Je dois préparer une réunion technique sur &lt;a href=&quot;http://rubyonrails.org/&quot; hreflang=&quot;en&quot;&gt;Ruby on Rails&lt;/a&gt;, aussi je m'y remets doucement. J'en profite donc pour passer en revue la version &lt;a href=&quot;http://api.rubyonrails.org/files/vendor/rails/railties/CHANGELOG.html&quot; hreflang=&quot;en&quot;&gt;1.2.2&lt;/a&gt; du framework par le biais d'un petit tutoriel. Je prends pour exemple la gestion d'un carnet d'adresses simplissime.&lt;/p&gt;


&lt;h3&gt;Installation sur Ubuntu&lt;/h3&gt;


&lt;p&gt;&lt;a href=&quot;http://snippets.prendreuncafe.com/snippet/51&quot; hreflang=&quot;fr&quot;&gt;L'installation de rails sur Ubuntu&lt;/a&gt; est toujours aussi simple.&lt;/p&gt;


&lt;h3&gt;Création de l'application&lt;/h3&gt;


&lt;p&gt;Vos pouvez créer votre projet rails n'importe où sur votre disque dur, par exemple dans &lt;code&gt;~/rails&lt;/code&gt; :&lt;/p&gt;


&lt;pre&gt;$ cd ~ &amp;amp;&amp;amp; mkdir rails
$ rails contacts&lt;/pre&gt;


&lt;p&gt;Le squelette de l'application &lt;code&gt;contacts&lt;/code&gt; est créé sous la forme d'un répertoire contenant l'arborescence par défaut d'un projet vierge.&lt;/p&gt;


&lt;pre&gt;$ cd contacts&lt;/pre&gt;


&lt;p&gt;Pour tester votre projet vierge, vous pouvez lancer &lt;a href=&quot;http://www.webrick.org/&quot; hreflang=&quot;en&quot;&gt;Webrick&lt;/a&gt;, un petit serveur HTTP écrit en ruby inclus dans les librairies du framework :&lt;/p&gt;


&lt;pre&gt;$ script/server&lt;/pre&gt;


&lt;p&gt;Faites pointer votre navigateur à l'adresse &lt;a href=&quot;http://0.0.0.0:3000/&quot;&gt;http://0.0.0.0:3000/&lt;/a&gt; pour admirer la page par défaut du projet.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/Geekeries/Rails/welcome_aboard.png&quot; alt=&quot;Capture d'écran&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;h3&gt;Configuration de l'accès aux données&lt;/h3&gt;


&lt;p&gt;Dans le fichier &lt;code&gt;config/databases.yml&lt;/code&gt;, on définit nos paramètres de connexion au &lt;acronym title=&quot;Système de Gestion de Base de Données&quot;&gt;SGBD&lt;/acronym&gt;, ici MySQL :&lt;/p&gt;

&lt;pre&gt;development:
  adapter:  mysql
  database: contacts_development
  username: root
  password: password
  host:     localhost
  socket:   /var/run/mysqld/mysqld.sock&lt;/pre&gt;


&lt;p&gt;N'oubliez pas de créer une base MySQL &lt;code&gt;contacts_development&lt;/code&gt;, hein &lt;img src=&quot;/blog/themes/PuC4/smilies/wink.gif&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;h3&gt;Création d'une table dans la base données&lt;/h3&gt;


&lt;p&gt;On va utiliser le système de migration propre à rails pour garantir une évolutivité de notre modèle de données :&lt;/p&gt;


&lt;pre&gt;$ ruby script/generate migration contacts_development&lt;/pre&gt;


&lt;p&gt;On édite le fichier généré dans &lt;code&gt;db/migrate/001_contacts_development.rb&lt;/code&gt; :&lt;/p&gt;

&lt;pre class=&quot;ruby&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;class&lt;/span&gt; ContactsDevelopment &amp;lt; ActiveRecord::Migration
&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;
    create_table &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;contacts&amp;quot;&lt;/span&gt; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt; |t| 
      t.&lt;span style=&quot;color:#9900CC;&quot;&gt;column&lt;/span&gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;, :&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;string&lt;/span&gt;
      t.&lt;span style=&quot;color:#9900CC;&quot;&gt;column&lt;/span&gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;email&amp;quot;&lt;/span&gt;, :&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;string&lt;/span&gt;
      t.&lt;span style=&quot;color:#9900CC;&quot;&gt;column&lt;/span&gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;address&amp;quot;&lt;/span&gt;, :&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;string&lt;/span&gt;
      t.&lt;span style=&quot;color:#9900CC;&quot;&gt;column&lt;/span&gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;city&amp;quot;&lt;/span&gt;, :&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;string&lt;/span&gt;
      t.&lt;span style=&quot;color:#9900CC;&quot;&gt;column&lt;/span&gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;zip&amp;quot;&lt;/span&gt;, :&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;string&lt;/span&gt;
      t.&lt;span style=&quot;color:#9900CC;&quot;&gt;column&lt;/span&gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;country&amp;quot;&lt;/span&gt;, :&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;string&lt;/span&gt;
    &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt; 
  &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt; 
&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;
    drop_table :contacts
  &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt; 
&amp;nbsp;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;On lance la migration, ce qui pour l'heure aura pour conséquence et pour l'heure de créer notre table &lt;code&gt;contacts&lt;/code&gt; dans la base de données :&lt;/p&gt;


&lt;pre&gt;$ rake db:migrate&lt;/pre&gt;


&lt;h3&gt;Création d'un jeu de données&lt;/h3&gt;


&lt;p&gt;Nous allons créer quelques fixtures pour peupler notre table et avoir quelque chose à se mettre sous la dent. Pour cela, on crée (ou modifie) un fichier &lt;code&gt;test/fixtures/contacts.yml&lt;/code&gt; contenant les deux entrées :&lt;/p&gt;

&lt;pre&gt;John:
  name:    John Doe 
  email:   john@doe.com
  address: 12, rue des champs
  zip:     75009
  city:    Paris
  country: France
&amp;nbsp;
Bob:
  name:    Bob Doe 
  email:   bob@doe.com
  address: 1, place du pré 
  zip:     35000
  city:    Rennes
  country: France&lt;/pre&gt;


&lt;p&gt;On insère les données dans la base :&lt;/p&gt;


&lt;pre&gt;$ rake db:fixtures:load&lt;/pre&gt;


&lt;p&gt;Ces données permettront par la suite de tester plus facilement l'application.&lt;/p&gt;


&lt;h3&gt;Scaffolding&lt;/h3&gt;


&lt;p&gt;On crée un module basique de gestion de nos contacts :&lt;/p&gt;


&lt;pre&gt;$ ruby script/generate scaffold Contact&lt;/pre&gt;


&lt;p&gt;Faites pointer votre navigateur sur &lt;a href=&quot;http://0.0.0.0:3000/contacts&quot;&gt;http://0.0.0.0:3000/contacts&lt;/a&gt; pour tester les scripts générés automatiquement.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/Geekeries/Rails/railstuto_scaffold.png&quot; alt=&quot;Scaffolding basique dans rails 1.2.2&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Ce n'est effectivement pas très beau, vous avez raison, mais c'est déjà fonctionnel... et surtout, cela ne nous a pas pris plus de 5 minutes !&lt;/p&gt;


&lt;h3&gt;À suivre&lt;/h3&gt;


&lt;p&gt;On ne s'arrêtera pas en si bon chemin, le prochain volet de ce tutoriel fera notamment évoluer notre schéma de base de données... &lt;em&gt;stay tuned !&lt;/em&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>FreeOnRails, un hébergement gratuit pour vos applications Rails</title>
    <link>http://prendreuncafe.com/blog/post/2006/03/25/424-freeonrails-un-hebergement-gratuit-pour-vos-applications-rails</link>
    <guid isPermaLink="false">urn:md5:c79f6da36f152677c6b403c83e72f9be</guid>
    <pubDate>Sat, 25 Mar 2006 12:31:18 +0000</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Ruby</category>
        <category>dev</category><category>framework</category><category>hosting</category><category>rails</category><category>ruby</category><category>web</category>    
    <description>    &lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/images/icones/logo-freeonrails.png&quot; alt=&quot;&quot; style=&quot;float:right; margin: 0 0 1em 1em;&quot; /&gt;[via &lt;a href=&quot;http://www.scoopeo.com/Internet/hebergement_ruby_on_rails_gratuit&quot; hreflang=&quot;fr&quot;&gt;Scoopeo&lt;/a&gt;]&lt;/p&gt;


&lt;p&gt;Je vous avais fait une &lt;a href=&quot;http://www.prendreuncafe.com/blog/2006/02/17/394-ruby-on-rails-sur-les-pages-perso-de-free&quot; hreflang=&quot;fr&quot;&gt;fausse joie récemment&lt;/a&gt; en annonçant que &lt;a href=&quot;http://free.fr&quot; hreflang=&quot;fr&quot;&gt;free.fr&lt;/a&gt; allait proposer gratuitement &lt;a href=&quot;http://www.prendreuncafe.com/blog/2006/01/06/372-ruby-on-rails-1-lets-go-ruby&quot; hreflang=&quot;en&quot;&gt;Ruby on Rails&lt;/a&gt; sur les pages perso. Hélas, fausse alerte, et jusqu'à aujourd'hui, impossible de trouver un hébergeur gratuit proposant Ruby et son framework superstar...&lt;/p&gt;


&lt;p&gt;Jusqu'à ce que &lt;a href=&quot;http://www.freeonrails.com&quot; hreflang=&quot;en&quot;&gt;FreeOnRails&lt;/a&gt; ouvre ses portes &lt;img src=&quot;/blog/themes/PuC4/smilies/wink.gif&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Seules &lt;a href=&quot;http://www.freeonrails.com/hosting&quot; hreflang=&quot;en&quot;&gt;conditions&lt;/a&gt;&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Posséder un nom de domaine dédié,&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.freeonrails.com/user/register&quot; hreflang=&quot;en&quot;&gt;S'inscrire&lt;/a&gt; et poster une demande d'hébergement motivée sur le &lt;a href=&quot;http://www.freeonrails.com/forum/1&quot; hreflang=&quot;en&quot;&gt;forum ad-hoc&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les &lt;a href=&quot;http://www.freeonrails.com/hosting&quot; hreflang=&quot;en&quot;&gt;caractéristiques&lt;/a&gt; de l'hébergement proposé sont très interessantes&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pas de pub,&lt;/li&gt;
&lt;li&gt;100 Mo d'espace,&lt;/li&gt;
&lt;li&gt;1 Go de bande passante mensuelle,&lt;/li&gt;
&lt;li&gt;Un accès &lt;acronym title=&quot;Secure SHell&quot;&gt;SSH&lt;/acronym&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.fastcgi.com/&quot; hreflang=&quot;en&quot;&gt;FastCGI&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;PHP5 &amp;amp; Perl (au cas où ?),&lt;/li&gt;
&lt;li&gt;Bases MySQL 4.1.x illimitées,&lt;/li&gt;
&lt;li&gt;Sous-domaines, comptes ftp et emails illimités.&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Ruby on Rails sur les pages perso de Free</title>
    <link>http://prendreuncafe.com/blog/post/2006/02/17/394-ruby-on-rails-sur-les-pages-perso-de-free</link>
    <guid isPermaLink="false">urn:md5:dfbfd92052ce83ec187d4be189653181</guid>
    <pubDate>Fri, 17 Feb 2006 12:33:39 +0000</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Ruby</category>
        <category>dev</category><category>framework</category><category>rails</category><category>ruby</category><category>web</category>    
    <description>    &lt;p&gt;Il &lt;em&gt;&lt;a href=&quot;http://www.freenews.fr/forum/viewtopic.php?pid=106050&quot; hreflang=&quot;fr&quot;&gt;semblerait&lt;/a&gt;&lt;/em&gt; que &lt;a href=&quot;http://free.fr&quot; hreflang=&quot;fr&quot;&gt;Free&lt;/a&gt; se prépare à proposer &lt;a href=&quot;http://rubyonrails.org&quot; hreflang=&quot;en&quot;&gt;Ruby on Rails&lt;/a&gt; sur leur service d'hébergement de pages personnelles... Si c'est avéré, ça sera un formidable tremplin pour ce framework efficace et pour le langage &lt;a href=&quot;http://ruby-lang.org/&quot; hreflang=&quot;en&quot;&gt;Ruby&lt;/a&gt;, réellement très attachant &lt;img src=&quot;/blog/themes/PuC4/smilies/smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Edit :&lt;/strong&gt; &lt;a href=&quot;http://www.freenews.fr/index.php?itemid=3103&quot; hreflang=&quot;fr&quot;&gt;Fake&lt;/a&gt;. Déçu&amp;nbsp;!&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Apprendre Ruby on Rails facilement</title>
    <link>http://prendreuncafe.com/blog/post/2006/01/20/381-apprendre-ruby-on-rails-facilement</link>
    <guid isPermaLink="false">urn:md5:6f1b29d19e96f12dd2c4801daa9e5774</guid>
    <pubDate>Fri, 20 Jan 2006 10:17:23 +0000</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Ruby</category>
        <category>dev</category><category>framework</category><category>livre</category><category>rails</category><category>ruby</category><category>web</category>    
    <description>    &lt;p&gt;[ Via &lt;a href=&quot;http://weblog.typhon.net/2006/01/18/11-lancement-de-l-offre-decouverte-rails&quot; hreflang=&quot;fr&quot;&gt;Typhon weblog&lt;/a&gt; ]&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/images/Dev/Rails/ror_book.gif&quot; alt=&quot;&quot; style=&quot;float:right; margin: 0 0 1em 1em;&quot; /&gt;J'ai entre les mains l'un des petits derniers des éditions &lt;a href=&quot;http://wwww.eyrolles.fr&quot; hreflang=&quot;fr&quot;&gt;Eyrolles&lt;/a&gt; - décidemment très productifs ces temps-ci - &lt;em&gt;&lt;a href=&quot;http://www.editions-eyrolles.com/Livre/9782212117462/ruby-on-rails&quot; hreflang=&quot;fr&quot;&gt;Ruby on Rails&lt;/a&gt;&lt;/em&gt;. C'est la traduction française du fort réputé &lt;strong&gt;&lt;em&gt;Agile Web Development with Rails&lt;/em&gt;&lt;/strong&gt; initialement écrit par Dave Thomas et David Heinemeier Hansson (ni plus ni moins que l'auteur du framework).&lt;/p&gt;


&lt;p&gt;Le livre est une mine d'informations illustrée d'exemples pratiques notamment par le biais de la réalisation d'une boutique en ligne en très peu de temps et d'opérations. L'ouvrage est clair, accessible, exhaustif et bourré d'humour. On y trouve une des meilleures introduction au design pattern &lt;acronym title=&quot;Modèle Vue Controlleur&quot;&gt;MVC&lt;/acronym&gt; que j'ai pu lire, une reflexion pertinente sur les méthodologies de développement ainsi qu'un référentiel complet des fonctions usuelles Ruby/Rails.&lt;/p&gt;


&lt;p&gt;Cerise sur le gâteau, un partenariat avec l'hébergeur &lt;a href=&quot;http://www.typhon.net&quot; hreflang=&quot;fr&quot;&gt;Typhon&lt;/a&gt; a été établi afin de proposer une réduction de 50% sur leur offre d'hégergement &lt;em&gt;&lt;a href=&quot;http://typhon.net/OffreRails&quot; hreflang=&quot;fr&quot;&gt;Découverte Rails&lt;/a&gt;&lt;/em&gt; pour tout acheteur du livre.&lt;/p&gt;


&lt;p&gt;Si vous vous interessez de près ou de loin à &lt;a href=&quot;http://www.ruby-lang.org/&quot; hreflang=&quot;en&quot;&gt;Ruby&lt;/a&gt; et plus particulièrement à &lt;a href=&quot;http://rubyonrails.org/&quot; hreflang=&quot;en&quot;&gt;Rails&lt;/a&gt;, vous pouvez acheter l'ouvrage les yeux fermés &lt;img src=&quot;/blog/themes/PuC4/smilies/smile.gif&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Interlude - Installer un blog Typo</title>
    <link>http://prendreuncafe.com/blog/post/2006/01/08/375-interlude-installer-un-blog-typo</link>
    <guid isPermaLink="false">urn:md5:33cd5094c19fccf32b25fc6769b022b1</guid>
    <pubDate>Sun, 08 Jan 2006 21:32:07 +0000</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Ruby</category>
        <category>dev</category><category>framework</category><category>linux</category><category>rails</category><category>ruby</category><category>tutoriel</category><category>ubuntu</category><category>web</category>    
    <description>    &lt;p&gt;En attendant le tutorial complet de la création d'une application avec Ruby on Rails et RadRails, voila de quoi patienter et découvrir un peu plus les possibilités du framework.&lt;/p&gt;


&lt;p&gt;Les applications &lt;acronym title=&quot;Ruby on Rails&quot;&gt;RoR&lt;/acronym&gt; fleurissent un peu partout ces temps-ci, et certaines sont assez bluffantes. Je viens de tomber sur &lt;a href=&quot;http://typo.leetsoft.com/trac/&quot; hreflang=&quot;en&quot;&gt;Typo&lt;/a&gt;, un gestionnaire de Weblog très sympa écrit en Ruby et doté de fonctionnalités tout à fait interessantes&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interface tout &lt;acronym title=&quot;Asynchronous JavaScript + XML&quot;&gt;AJAX&lt;/acronym&gt;,&lt;/li&gt;
&lt;li&gt;Notification de commentaires et trackback par mail et messagerie &lt;a href=&quot;http://fr.wikipedia.org/wiki/Jabber&quot; hreflang=&quot;fr&quot;&gt;jabber&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;Pings automatiques vers des sites comme &lt;a href=&quot;http://www.technorati.com&quot; hreflang=&quot;en&quot;&gt;Technorati&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;Gestion de tags (multicatégories, ou &lt;em&gt;folksonomies&lt;/em&gt;),&lt;/li&gt;
&lt;li&gt;Gestionnaire de pages statiques,&lt;/li&gt;
&lt;li&gt;Contrôle du &lt;a href=&quot;http://fr.wikipedia.org/wiki/SPAM&quot; hreflang=&quot;fr&quot;&gt;SPAM&lt;/a&gt; avancé (blacklistes locales et distantes, nombre d'URL dans un commentaire, etc.),&lt;/li&gt;
&lt;li&gt;Gestion intelligente du cache des pages,&lt;/li&gt;
&lt;li&gt;Nombreux plugins vers des sites disposant d'&lt;acronym title=&quot;Application Program Interface&quot;&gt;API&lt;/acronym&gt; &lt;a href=&quot;http://www.flickr.com&quot; hreflang=&quot;fr&quot;&gt;(FlickR&lt;/a&gt;, &lt;a href=&quot;http://del.icio.us&quot; hreflang=&quot;en&quot;&gt;Del.icio.us&lt;/a&gt;, &lt;a href=&quot;http://upcomming.org/&quot; hreflang=&quot;en&quot;&gt;Upcomming&lt;/a&gt;, &lt;a href=&quot;http://www.last.fm/&quot; hreflang=&quot;en&quot;&gt;LastFM&lt;/a&gt;, etc.)&lt;/li&gt;
&lt;li&gt;Etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bon, le plus simple pour se rendre compte de l'interêt de cet outil, c'est de l'installer et de le tester soi-même.&lt;/p&gt;


&lt;p&gt;Tout d'abord, et après avoir &lt;a href=&quot;http://www.prendreuncafe.com/blog/2006/01/06/372-ruby-on-rails-1-lets-go-ruby&quot; hreflang=&quot;fr&quot;&gt;installé &lt;acronym title=&quot;Ruby on Rails&quot;&gt;RoR&lt;/acronym&gt; sur Ubuntu&lt;/a&gt;, il faut récupérer les sources Subversion &lt;sup&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2006/01/08/#pnote-375-1&quot; id=&quot;rev-pnote-375-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt; de Typo&amp;nbsp;:&lt;/p&gt;


&lt;pre&gt;$ cd /path/to/docroot
$ svn checkout svn://leetsoft.com/typo/trunk typo&lt;/pre&gt;


&lt;p&gt;Ceci fait, il faut créer une base de données MySQL dédiée à Typo&amp;nbsp;:&lt;/p&gt;


&lt;pre&gt;$ cd typo
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12 to server version: 4.1.12-Debian_1ubuntu3.1-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql&amp;gt; CREATE DATABASE typo_dev;
Query OK, 1 row affected (0.00 sec)

mysql&amp;gt; \q;&lt;/pre&gt;


&lt;p&gt;On va y insérer le schema SQL fourni&amp;nbsp;:&lt;/p&gt;


&lt;pre&gt;$ mysql -u root -p typo_dev &amp;lt; db/schema.mysql.sql&lt;/pre&gt;


&lt;p&gt;Il nous reste à configurer le fameux fichier &lt;code&gt;./config/database.yml&lt;/code&gt;&amp;nbsp;:&lt;/p&gt;


&lt;pre&gt;login: &amp;amp;login
  adapter: mysql
  host: localhost
  username: &amp;lt;nom_utilisateur_mysql&amp;gt;
  password: &amp;lt;votre_mot_de_passe&amp;gt;&lt;/pre&gt;


&lt;p&gt;On lance Webrick, le petit serveur web fourni avec &lt;acronym title=&quot;Ruby on Rails&quot;&gt;RoR&lt;/acronym&gt;&amp;nbsp;:&lt;/p&gt;


&lt;pre&gt;$ script/server&lt;/pre&gt;


&lt;p&gt;Et on teste on faisant pointer son navigateur à l'adresse &lt;a href=&quot;http://0.0.0.0:3000&quot;&gt;0.0.0.0:3000&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Bon amusement &lt;img src=&quot;/blog/themes/PuC4/smilies/smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2006/01/08/#rev-pnote-375-1&quot; id=&quot;pnote-375-1&quot;&gt;1&lt;/a&gt;] Si vous ne disposez pas de Subversion, &lt;code&gt;sudo apt-get install subversion&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;
</description>
    
    
    
      </item>
    
  <item>
    <title>Ruby on Rails #1 - Lets go Ruby !</title>
    <link>http://prendreuncafe.com/blog/post/2006/01/06/372-ruby-on-rails-1-lets-go-ruby</link>
    <guid isPermaLink="false">urn:md5:a6e47e50ce5a6a8a371bcbfd010ccc86</guid>
    <pubDate>Fri, 06 Jan 2006 16:39:58 +0000</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Ruby</category>
        <category>dev</category><category>framework</category><category>linux</category><category>rails</category><category>ruby</category><category>tutoriel</category><category>ubuntu</category><category>web</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/images/Geekeries/Dev/rails.png&quot; alt=&quot;&quot; style=&quot;float:right; margin: 0 0 1em 1em;&quot; /&gt; Je découvre &lt;a href=&quot;http://www.rubyonrails.com&quot; hreflang=&quot;en&quot;&gt;Ruby on Rails&lt;/a&gt; (&lt;acronym title=&quot;Ruby on Rails&quot;&gt;RoR&lt;/acronym&gt; pour les intimes), c'est assez sympa. Pour mémoire, c'est un framework de developpement web rapide basé sur le motif de conception &lt;acronym title=&quot;Modèle Vue Controlleur&quot;&gt;MVC&lt;/acronym&gt; qui offre une facilité de conception, de déploiement ainsi qu'une maintenance aisée, le tout en langage &lt;a href=&quot;http://www.ruby-lang.org/&quot; hreflang=&quot;en&quot;&gt;Ruby&lt;/a&gt;. J'en veux pour preuve &lt;a href=&quot;http://www.rubyonrails.org/screencasts&quot; hreflang=&quot;en&quot;&gt;ces quelques vidéos&lt;/a&gt; qui m'ont laissées pour le moins scié en quatre, notamment &lt;a href=&quot;http://media.rubyonrails.org/video/rails_take2_with_sound.mov&quot; hreflang=&quot;en&quot;&gt;celle-ci&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;En plus, ça tourne chez &lt;a href=&quot;http://www.typhon.net&quot; hreflang=&quot;fr&quot;&gt;Typhon&lt;/a&gt;, mon hébergeur préféré &lt;img src=&quot;/blog/themes/PuC4/smilies/smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Ce billet est donc le premier d'une série que je rédigerai au gré de mes découvertes de cet outil qui promet d'être passionnant. Commençons par le commencement, l'installation de l'environnement.&lt;/p&gt;    &lt;h3&gt;Installer &lt;acronym title=&quot;Ruby on Rails&quot;&gt;RoR&lt;/acronym&gt; sous Ubuntu&lt;/h3&gt;


&lt;p&gt;Je reprendrai l'&lt;a href=&quot;http://wiki.rubyonrails.com/rails/pages/RailsOnUbuntuDebianTestingAndUnstable&quot; hreflang=&quot;en&quot;&gt;excellent tutoriel d'installation&lt;/a&gt; disponible sur le &lt;a href=&quot;http://wiki.rubyonrails.com/rails/&quot; hreflang=&quot;en&quot;&gt;wiki officiel de &lt;acronym title=&quot;Ruby on Rails&quot;&gt;RoR&lt;/acronym&gt;&lt;/a&gt;.&lt;/p&gt;


&lt;h4&gt;Installation du système de base&lt;/h4&gt;


&lt;p&gt;Après avoir décommenté la ligne &lt;code&gt;universe&lt;/code&gt; de votre fichier &lt;code&gt;/etc/apt/sources.list&lt;/code&gt;, vous pouvez lancer dans l'ordre la série de commandes suivantes&amp;nbsp;:&lt;/p&gt;


&lt;pre&gt;sudo apt-get install ruby rdoc1.8 irb libyaml-ruby libzlib-ruby
wget rubyforge.org/frs/download.php/5207/rubygems-0.8.11.tgz
tar xzvf rubygems-0.8.11.tgz
cd rubygems-0.8.11
sudo ruby setup.rb
sudo gem update --system
sudo gem install rails -y&lt;/pre&gt;


&lt;h4&gt;Quelques ajouts supplémentaires&lt;/h4&gt;


&lt;p&gt;Si vous voulez utiliser quelques &lt;em&gt;gems&lt;/em&gt; &lt;sup&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2006/01/06/#pnote-372-1&quot; id=&quot;rev-pnote-372-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt; existantes&amp;nbsp;:&lt;/p&gt;


&lt;pre&gt;sudo gem install BlueCloth RedCloth switchtower syntax&lt;/pre&gt;


&lt;p&gt;... et quelques librairies graphiques sympathiques&amp;nbsp;:&lt;/p&gt;


&lt;pre&gt;sudo apt-get install librmagick-ruby
sudo apt-get install libgd-ruby1.8&lt;/pre&gt;


&lt;p&gt;Enfin, on peut imaginer utiliser &lt;a href=&quot;http://www.sqlite.org/&quot; hreflang=&quot;en&quot;&gt;SQLite&lt;/a&gt; pour nos premiers tests&amp;nbsp;:&lt;/p&gt;


&lt;pre&gt;sudo apt-get install sqlite3
sudo gem install sqlite3-ruby&lt;/pre&gt;


&lt;h4&gt;Utiliser Eclipse comme environnement de développement intégré&lt;/h4&gt;


&lt;p&gt;Un plugin existe pour Eclipse permettant de simplifier le développement d'applications en Ruby&amp;nbsp;: &lt;a href=&quot;http://radrails.sourceforge.net/&quot; hreflang=&quot;en&quot;&gt;RadRails&lt;/a&gt;. Pour l'installer, il suffit, depuis Eclipse, d'aller dans &lt;em&gt;Help &amp;gt; Software Updates &amp;gt; Find and Install &amp;gt; Search for new features to install&lt;/em&gt; et de rentrer un nouveau dépôt en cliquant sur &lt;em&gt;New remote site&lt;/em&gt; et en saisissant ces informations&amp;nbsp;:&lt;/p&gt;


&lt;pre&gt;Name : RadRails
URL : http://radrails.sourceforge.net/update&lt;/pre&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/images/ScreenShots/Eclipse/radrails_add_repo.png&quot; alt=&quot;Ajouter un dépôt pour RadRails dans Eclipse&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Cliquez sur Finish et installez RadRails.&lt;/p&gt;


&lt;p&gt;Voila pour ce qui est de l'installation de notre environnement de travail. Dans un prochain volet, nous créerons notre première application &lt;img src=&quot;/blog/themes/PuC4/smilies/smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2006/01/06/#rev-pnote-372-1&quot; id=&quot;pnote-372-1&quot;&gt;1&lt;/a&gt;] Les &lt;em&gt;gems&lt;/em&gt; sont des briques logicielles prêtes à l'emploi spécialement développées pour &lt;acronym title=&quot;Ruby on Rails&quot;&gt;RoR&lt;/acronym&gt;&lt;/p&gt;&lt;/div&gt;
</description>
    
    
    
      </item>
    
</channel>
</rss>