Friday, May 05, 2006

RoR::Day 2

Nous allons revenir dans cette article au développement de notre application.

Dans l'article 1, nous avons créé une table, artists, et généré le scaffold.
Après avoir joué un peu avec l'écran d'édition, on s'aperçoit assez vite de sa simplicité. Notamment du coté de la validation: en effet, on peut laisser des valeurs vides et soumettre le formulaire.

Mais où mettre la validation dans Rails? La couche modèle est le garant entre le monde du code ruby et la base de données. Cela rend le modèle une place idéale pour insérer la validation. Si le modèle fait le check avant la sauvegarde en base, alors la base sera protégée d'une mauvaise donnée en entrée.

Ouvrons le fichier app/models/artist.rb


class Artist < ActiveRecord::Base
validates_presence_of :name, :origin
end


















Le validates_presence_of() est un validator standard dans le monde Rails. Il checke qu'un ou plusieur champs sont presents et qu'ils ne sont pas vides.

Mais maintenant nous saisissons un nom d'artiste, et nous ne voulons pas qu'il soit répété :
ajoutons la ligne suivante dans le modèle :
class Artist < ActiveRecord::Base
validates_presence_of :name, :origin
validates_uniqueness_of :name
end


















Modification du modèle


Nous allons rajouter 2 entités à notre modèle : items, qui contiendra la liste des albums associés à un artists, et tracks, la liste des pistes musicales associées à un album.

Nous allons toujours procéder avec notre outil de migration :
script/generate migration items

Fichier db/migrate/002_items.rb

class Items < ActiveRecord::Migration
def self.up
create_table :items do |table|
table.column :id, :integer
table.column :name, :string
table.column :type, :string
table.column :artist_id, :integer
end
end

def self.down
drop_table :items
end
end

On recommence pour la table tracks : Fichier db/migrate/003_tracks.rb
class Tracks < ActiveRecord::Migration
def self.up
create_table :tracks do |table|
table.column :id, :integer
table.column :order, :integer
table.column :item_id, :integer
table.column :name, :string
table.column :size, :float
end
end

def self.down
drop_table :tracks
end
end

Créons la structure en base avec la commande : rake migrate

Créons les modèles pour chacune des tables items et tracks

ruby script/generate model Item
ruby script/generate model Track

On n'a pas créé de foreign key en base , mais on remarque qu'on relie 'items' à 'artists' par la colonne artist_id, et la table 'tracks' à 'items' par <nom de la table cible>_item_id....c'est une convention : _id

Nous devons désormais dire à Rails, qu'un artiste a plusieurs albums et qu'un album appartient à un artiste. Ouvrons la classe modèle artist.rb , et faison un appel à has_many() :
class Artist < ActiveRecord::Base validates_presence_of :name, :origin
validates_uniqueness_of :name
has_many :items, :order => "name"
end

Faisons le lien dans l'autre direction , depuis la classe item: appelons la methode belongs_to()
class Item < ActiveRecord::Base validates_presence_of :name
belongs_to :artist
end

Réitérons entre items et tracks : ajoutons has_many() dans la classe item.rb
class Item < ActiveRecord::Base validates_presence_of :name
belongs_to :artist
has_many :tracks, :order => "order"
end

Ajoutons le lien dans l'autre sens depuis la classe track.rb :
class Track < ActiveRecord::Base belongs_to :item
end

Conclusion:
Dans cet article nous avons vu comment ajouter de la validation à un formulaire.
Comment ajouter plusieurs tables et créer des relations entre les classes du modèle.

Dans le prochain article nous rajouterons de nouvelles méthodes dans notre controller pour afficher les listes d'items de nos artistes.
Nous parlerons des layouts et templates (avec relooking de l'application)

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home