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 :
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