[rails] - Comprendre le fonctionnement de Rails avec le scaffold
En Ruby on Rails il existe une fonctionnalité bien pratique : Scaffold. C'est un outil d'apprentissage trés intéressant pour générer automatiquement une 'application'. En effet avec un minimum de paramétres on peut voir tourner ce que l'on souhaite et surtout en analyser le code source pour comprendre le fonctionnement de Rails.
Nous allons voir comment créer une application qui génére une liste de course (mais vous pouvez tout aussi bien tester avec une liste de CD, de recette, ...). Comme à chaque fois il est préférable de définir ce que nous allons faire :
Nom de l'application : liste de course
Table : courses
Champs nécéssaires : article et quantite
rails liste_de_course -d mysql
cd liste_de_course
Configurez config/database.yaml pour coller aux paramétres de votre base de donnée (username, password et host, attention pour ce dernier il peut être nécéssaire d'indiquer 127.0.0.1 au lieu de localhost)
Enfin créons la base de donnée associé avec :
rake db:create
Nous voila prêt à créer une table et les champs que nous avons défini. En respectant la convention notre modèle étant Course les noms des tables seront en minuscule et au pluriel, ce qui nous donne comme nom de table courses. Les noms des champs seront : article en tant que string et quantite en tant que nombre (integer).
Voici la commande magique du scaffold :
script/generate scaffold Course article:string quantite:integer
Ce qui génére un certain nombre de fichiers :
exists app/models/
exists app/controllers/
exists app/helpers/
create app/views/courses
exists app/views/layouts/
exists test/functional/
exists test/unit/
create test/unit/helpers/
exists public/stylesheets/
create app/views/courses/index.html.erb
create app/views/courses/show.html.erb
create app/views/courses/new.html.erb
create app/views/courses/edit.html.erb
create app/views/layouts/courses.html.erb
create public/stylesheets/scaffold.css
create app/controllers/courses_controller.rb
create test/functional/courses_controller_test.rb
create app/helpers/courses_helper.rb
create test/unit/helpers/courses_helper_test.rb
route map.resources :courses
dependency model
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/course.rb
create test/unit/course_test.rb
create test/fixtures/courses.yml
create db/migrate
create db/migrate/20091026231134_create_courses.rb
Ceux qui sont précédés de exists on été crée lors de la première invocation de la commande rails, ceux précédés de create sont crée.
Si vous regardez dans le fichier db/migrate, vous verrez ceci :
class CreateCourses < ActiveRecord::Migration
def self.up
create_table :courses do |t|
t.string :article
t.integer :quantite
t.timestamps
end
end
def self.down
drop_table :courses
end
end
self.up est tout ce qui sera crée lorsque nous lancerons la migration et self.down tout ce qui sera éffectué lorsque nous reviendrons un cran en arriere. Ainsi nous voyons que cette migration crée bien une table courses, et un string article et un integer quantite. Ceci est cohérent avec ce que nous voulons, lançons la migration :
rake db:migrate
Afin de simplifier l'accés à notre petit programme, éditez le fichier config/routes.rb et ajouter cette ligne :
map.root :controller => 'courses', :action => 'index'
nous définissons le répertoire racine de notre application, qui pointera sur le controller courses et l'action index (n'oubliez pas d'éffacer le fichier public/index.html).
Lancez maintenant le serveur avec :
script/server
Dans votre navigateur ouvrez : http://localhost:3000, vous devriez avoir ceci :
Ainsi vous pouvez ajouter des nouvelles courses, et une fois la base rempli, les éditer, les supprimer ou les afficher. Ce qui corresponds au modèle CRUD : Create, Read, Update et Delete. Vous noterez que l'on retrouve chacun des modèles dans le controller : CoursesController du fichier app/controller/courses_controller.rb (avec show, new, update et destroy) et également dans chacune des vues dans app/views/courses avec les fichiers new.html.erb, edit.html.erb ... ce qui vous permet de voir l'interaction entre le controller et les vues. Quand au modèle crée automatiquement par le scaffold et présent dans app/model/course.rb il est tout simple :
class Course < ActiveRecord::Base
end
Mais vous pouvez par exemple définir que la saisie d'un article est obligatoire et que la partie quantite est forcément numéraire et ce trés simplement :
class Course < ActiveRecord::Base
validates_presence_of :article
validates_numericality_of :quantite
end
la liste des validations possible est disponible ici : http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html
Essayez à présent de saisir un article vide, ou une quantité non numéraire. Un message vous avertira de l'erreur. Pour l'instant tout ceci est en anglais mais nous verrons prochainement comment franciser une application. Ce qui est important c'est de voir qu'en 4 lignes de codes on peut obtenir une application MVC fonctionelle et prête à tourner, cela permet d'observer et de tester sur une base opérationnelle. Essayer par exemple de faire d'autres exemples avec scaffold sur d'autres sujets. Analyser le code et les interactions entre le controller et la vue. Nous verrons la prochainne fois comment créer une application sans passer par le scaffolding.