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 mysqlModel 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:integerElements 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à.
Flux RSS
Pas mal pour un petit projet de weekend… Tu vois que tu peux mettre en pratique pas mal de choses
(par contre sous Firefox si t’as la WebDeveloper Toolbar, fais un CTRL+SHIFT+A… c’est le validateur W3C, il aime pas les “&” de tonton Bob et des autres… Je suppose que ça vient de la BDD… mais tu peux par exemple essayer de modifier ton Controller pour qu’il fasse un @album.title.gsub(”&”, “&”), mais je peux pas assurer que ça passera à la validation…. d’ailleurs personnellement j’ai pas ce problème, c’est pour ça que je suppose que ça vient des données de ta BDD)
(au fait: UTF8 c’est le bien… 0:-) )
hmm… bon dans le gsub il est évident que je parlais de mettre en 2ème argument le code HTML de l’esperluette (& avec un “;” …)
Comme un validateur analyse le code généré, je pense que ton “&” n’a pas correctement été échappé…
J’avais modifié les & par la suite en search & replace, mais j’ai oublié de le refaire par la suite. Je vais tester ton gsub.
Je te le mets ici au cas où :
j’ai réussis à recréer ce problème des “&” qui sont interprétés comme des séparateurs XML mal placés par le validateur.
A priori et dans mon cas, la fonction “h” (alias de “html_escape”) qui se chargera d’encoder comme il faut les caractères qui t’embêtent…