Un dimanche, envie de faire quelque chose de nouveau, de simple et de rapide. Ma discographie en Rails.

Création du projet

rails discography -d mysql

Model Album

J’ai un seul modèle avec 4 éléments :

  • artist (string)
  • title (string)
  • year (integer)
  • rating (integer)

Ca me donne :

ruby script/generate scaffold Album artist:string title:string year:integer rating:integer

Elements de validation

Même si je suis le seul à administrer cette appli, je mets en place quelques vérification :

class Album < ActiveRecord::Base
  validates_presence_of :artist, :title, :rating
  validates_uniqueness_of :title
  validates_inclusion_of :year, :in => 1950..2010, :message => "must be between 1950 and 2010.", :allow_blank => true
  validates_inclusion_of :rating, :in => 1..4, :message => "must be between 1 and 4."
end

Tous les éléments sont indispensables, à part l’année.
Le titre doit être unique (pour éviter les doublons par la suite).
L’année doit être entre 1950 et 2010, mais il peut être vide.
La note est entre 1 et 4 inclus.

Controller Album

J’ai 4 actions: index, show, edit et new.
J’ai modifié le new parce que par défaut, après avoir rajouté un nouvel album, il tombe sur le View show de ce dernier. Or, je vais rajouter beaucoup d’albums, donc j’aimerais gagner un clic en retombant directement sur le View new.

C’est au moment du create que la redirection est faite (l’action new créer un nouvel élément en mémoire mais c’est l’action create qui la sauvegarde).

def create
    @album = Album.new(params[:album])
 
    respond_to do |format|
      if @album.save
        flash[:notice] = 'Album was successfully created.'
        format.html { redirect_to :action => "new" }
        format.xml  { render :xml => @album, :status => :created, :location => @album }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @album.errors, :status => :unprocessable_entity }
      end
    end
  end

La ligne modifiée est format.html { redirect_to :action => "new" }. En créant un nouvel album, je retombe sur la page new, en gardant quand la même la notification.

Par la suite, j’ai aussi modifié le View new pour que le champ Year apparaisse à la fin (vu qu’il est facultatif).

J’ai récupéré le code html généré, j’en ai fait une page statique à laquelle j’ai rajouté un plugin jQuery, et le résultat est là.