bon, un exemple vu que plein de gens en parlent sans jamais en avoir vu
dans ta migration
les articles
Code:
create_table :articles do |t|
t.column :title, :string, :null => false
t.column :text, :text, :null => false
end
et les commentaires
Code:
create_table :comments do |t|
t.column :author, :string, :null => false
t.column :title, :string, :null => false
t.column :text, :text, :null => false
t.column :article_id, :integer, :null => false
end
on édite le fichier de config pour les paramètres d'accès à la DB (login, mot de passe, host, ...) et puis pour générer automatiquement les tables :
$ rake db:migrate
on passe maintenant à la modélisation de données
les articles
Code:
class Article < ActiveRecord::Base
has_many :comments, :dependent => true
validates_presence_of :title, :message => '^Il faut un titre'
validates_presence_of :text, :message => '^Il faut du texte'
validates_length_of :title, :minimum => 5, :message => '^Mettez un titre plus étoffé'
validates_length_of :text, :minimum => 20, :message => '^Et vous appelez ça un article ?'
et pour les commentaires
enfin, le controlleur et la vue d'une liste d'article
Code:
def list
@articles_page, @articles = paginate :articles, :order => 'id', :per_page => 5
end
def new
@article = Article.new
end
def create
@article = Article.new(params[:article])
if @article.save
flash[:notice] = "Article créé"
redirect_to :action => 'list'
else
render :action => 'new'
end
end
def destroy
begin
Article.find(params[:id]).destroy
rescue Exception => excep
flash[:notice] = excep
ensure
redirect_to :action => 'list'
end
end
et la vue qui affiche les articles avec leurs commentaiers
Code:
<p class="notice"><b><%= flash[:notice] %></b></p>
<% for article in @articles %>
<h3><%= h article.title %></h3>
<p><%= textilize article.text %></p>
<h4>Commentaires - <%= link_to "Ajouter un commentaire", :action => 'addcomment', :id => article %></h4>
<% for commitem in article.comments %>
<dl>
<dt><u><%= h commitem.title %></u></dt>
<dd><%= textilize commitem.text %>
<b>Auteur : <%= h commitem.author %></b>
</dd>
</dl>
<% end %>
<%= "<dl><dt>Aucun</dt></dl>" if article.comments.blank? %>
</div>
<% end %>
alors donc nous n'avons vu aucune ligne de SQL
la suppression récursive article -> commentaires associés est automatique, c'est le modèle qui détermine si oui ou non il faut procéder ainsi, il peut aussi lancer une exception qui affichera un joli message d'avertissement
c'est de l'OO de a à z, Article.find

first, :conditions => [ 'title = ?', var_titre ]).comment[2].author
avec ça on cherche le premier article qui a pour titre la variable var_titre, et on récupère le nom de l'auteur du 3ème commentaire de cet article
remarquez aussi que Ruby On Rails va échapper tous les caratères pour var_titre et la rendre 'safe', qui a dit SQL injection ?
remarquez aussi 'textilize' ... ça permet d'avoir du html avec une syntaxe Wiki, et 'h' qui échappe tous les caractères pour en faire des html entities
enfin, tous les messages qu'on a au niveau du modèles peuvent être affichés (en gros) au moment de la création / modification d'un article si les paramètres ne correspondent pas aux conditions demandées.
Code:
<%= error_messages_for 'contact' %>
enfin, le 'paginate' permet d'automatiquement avoir, ici, 5 articles par page, avec tout le support pour changer de page et afficher la suite, par exemple pour avoir le numéro des 5 pages précédentes et suivantes (à la google)
Code:
<%= pagination_links(@articles_page, { :window_size => 10 } )
alors j'ai sûrement encore oublié mille chose comme les test intégrés, de l'ajax à gogo facile (pour ceux qui aiment), une console pour tester en live, le support des breakpoint pour débugguer, une classe pour gérer les mailings en qques lignes, un loggueur intégré avec différent niveau d'alerte et de formatage, le scaffolding pour générer rapidement un prototype d'essai, un système de gestion de plugins avec des 100 aines de disponibles en une ligne de commande, du caching performant et simple, une sécurité accrue (SQL injection, XSS), bla bla bla ...