Encore une journée avec 2 posts. Mercredi, j’ai fait mes 29 min de lecture mais au travail je n’ai pas Rails d’installé. Je fais tous mes tests à la maison maintenant, et sur Windows. Et vu que chaque étape doit être précédée de toutes les autres dont j’ai déjà discuté, je ne peux pas reprendre à zéro. Donc je peux continuer à lire cet article où je veux, mais je ne peux pas l’appliquer. Bref, voici ce que j’ai lu il y a 2 jours.

Un nouveau modèle : les commentaires

J’ai mon modèle Post déjà en place : un auteur, un titre et du texte. J’ai des vérifications et j’ai optimisé le View et le Controller correspondant. Maintenant, je veux des commentaires.

ruby script/generate model Comment commenter:string body:text post:references

Comment est par convention au singulier. La table dans la base de données sera nommée comments (en minuscule et au pluriel). J’ai un auteur, un commentaire et une association avec un post.

Fichiers générés

J’ai plusieurs fichiers de créés :

  • app/models/comment.rb (mon Model)
  • db/migrate/20090521221049_create_comments.rb (le fichier à exécuter pour créer la bdd)
  • des fichiers de tests

Comment Model

Mon Model ressemble à ça :

class Comment < ActiveRecord::Base
belongs_to :post
end

Encore cette classe ActiveRecord si précieuse. Comme pour Post, mais avec une ligne en plus : belongs_to :post. Ca permet d’associer chaque commentaire à un post.

Fichier de migration

Le fichier de migration pour générer la table est celui-là :

class CreateComments < ActiveRecord::Migration
  def self.up
    create_table :comments do |t|
      t.string :commenter
      t.text :body
      t.references :post
 
      t.timestamps
    end
  end
 
  def self.down
    drop_table :comments
  end
end

La ligne importante est t.references :post qui va permettre d’associer à chaque commentaire l’identifiant du post auquel il appartient.

Association avec Post

J’ai déjà dit dans le code qu’un commentaire appartenait à un post. Maintenant il faut que je dise que chaque post peut avoir des commentaires. Je modifie mon Model de Post :

class Post < ActiveRecord::Base
	validates_presence_of :name, :title
	validates_length_of :title, :minimum => 5 
	has_many :comments 
end

Je rajoute simplement has_many :comments. Je peux par exemple accéder aux commentaires d’un post en utilisant @post.comments.