Ensemble d'outils...
... pour ne pas réinventer la roue.
こんにちは Ruby !
Inventé en 1995 par Yukihiro « matz » Matsumoto
Langage de script simple mais puissant et efficace
Parenthèses optionnelles
Pas de ;
Tout est objet
Gestion d’exceptions, ramasse-miettes
Diverses implémentations (Linux, Mac, Win, java...)

Interpréteur interactif en ligne de commande : irb
> "bonjour " * 3
=> "bonjour bonjour bonjour "
> aujourdhui = Date.today
=>
> demain = aujourdhui + 1.day
=>
> dans_une_semaine = aujourdhui + 1.week
=>
> ["Dog", "Fox", "Mouse"].each do |animal|
puts "I like #{animal.pluralize}"
end
I like Dogs
I like Foxes
I like Mice
=> ["Dog", "Fox", "Mouse"]
Ruby (On Rails) connait le pluriel des mots... anglais
> chaine = "C'est chouette l'IUT"
=> "C'est chouette l'IUT"
> tableau = chaine.split(" ")
=> ["C'est", "chouette", "l'IUT"]
> tableau.reverse.map{|ch| ch.capitalize}.join("+")
=> "L'IUT+Chouette+C'est"
Il y a plein de méthodes pratiques sur la classe Array
class Personne < ActiveRecord::Base def nom_complet prenom+" "+nom end def age ((Date.today - date_naissance)/365.25).floor end endp = Personne.new puts p.age
une_variable_toute_simple
:un_symbole
UneClasse
@une_variable_d_instance
@@une_variable_de_classe
UNE_CONSTANTE
$une_abominable_variable_globale # beurk !
Les variables sont typées, mais on ne définit pas les types des variables explicitement.
C'est ce qu'on appelle le Duck Typing.
# Fichier : ma_classe.rb
class MaClasse
def ma_methode_d_instance
# La dernière ligne d'une méthode est renvoyée
# (c'est un return implicite)
"Bye bye !"
end
def self.ma_methode_de_classe
MaClasse.new nom:"Dupont"
end
end
Qui s'utilise ainsi :
> mon_objet = MaClasse.ma_methode_de_classe
> mon_objet.ma_methode_d_instance
=> "Bye bye !"
Sur internet bien sûr (Google est votre ami)
Pour démarrer :
http://www.ruby-lang.org/fr/documentation/quickstartLa référence du langage sur devdocs.io:
http://devdocs.io/ruby/Pour apprendre de manière interactive et ludique :
Try Ruby !, RubyMonk et Ruby Warrior !
Paquet contenant des classes Ruby et des outils
Provenant d'un dépôt d'internet
Exemples :
XML, SOAP, Google docs, spreadsheet, lastfm, sqlite, mysql, pg, devise, pdf, twitter-bootstrap, ckeditor, facebook, et... Rails !
# Liste des gems installées :
$ gem list
# Installer une gem :
$ gem install
# Chercher une gem :
$ gem search
# Mettre à jour les gems d'un projet avec Bundler :
$ bundle
+
!
| Personne | La classe s'écrit en CamelCase |
| personnes | La table associée à une classe est au pluriel |
| date_de_naissance | Un attribut s'écrit en snake_case |
| adresse_id | La clé étrangère = nom de l'assoc. + _id |
| personne.rb | Le fichier qui contient la classe porte son nom en snake_case |
| app/models/personne.rb app/controllers/personnes_controller.rb app/views/personnes/index.html.erb |
Chaque fichier a un nom correspondant à ce qu’il contient |
| Partials | sous-vues pouvant être appelées par d'autres vues |
| Helpers | fonctions appelées par les vues |
| Héritage | classique du développement objet |
| Gems | compléments pour ajouter des fonctionnalités |
Permet d'organiser et de découper l'application pour :
Le modèle contient la logique métier et l'accès aux données
Le contrôleur reçoit des requêtes HTTP et génére la Vue en se servant du modèle
class CreateVoitures < ActiveRecord::Migration
def self.up
create_table :voitures do |t|
t.string :immatriculation
t.string :marque
t.string :modele
t.string :couleur
t.timestamps
end
end
def self.down
drop_table :voitures
end
end
class AddPersonneIdToVoiture < ActiveRecord::Migration
def self.up
add_column :voitures, :personne_id, :integer
end
def self.down
remove_column :voitures, :personne_id
end
end
# Exemple d’utilisation des classes du modèle
paul = Personne.new
paul.nom = «Dupont»
paul.prenom = «Paul»
paul.save
v = Voiture.create(immatriculation: «123 ABC 51», marque: «Peugeot»)
v.personne = paul
# ou
paul.voitures << v
puts paul.voitures.count
-> 1
puts Voiture.first.personne.nom
-> «Dupont»
| Route | URL + Verbe → Contrôleur + action |
| Action | méthode appelée par un verbe HTTP |
| Layout | choix d’un modèle de vue pour rendre une action |
| Filtres | utilisé pour l’authentification et pour protéger les accès aux actions |
| Sessions | session['valeur']=objet |
| Paramètres | params['nom'] (par exemple) |
views/layouts/application.html.erb
Sous-vues, dans des fichiers indépendants (commençant par _)
Fonctions facilitant l'écriture des vues et évitant de dupliquer du code (génération de formulaire, liens, champs...)
Mais comment tout ça s'articule ?
Vous le saurez en regardant cette petite animation.
Verbe + chemin d'URL + paramètres nommés
↓
Contrôleur + Action
# Fichier config/routes.rb
get '/personnes/par_nom/:nom' => 'personnes#show_par_nom', as:"montrer_par_nom"
Exemple d'URL : http://mon_serveur:3000/personnes/show_par_nom/DUPONT
# Fichier app/controllers/personnes_controller.rb
class PersonnesController < ApplicationController
# GET /personnes/par_nom/DUPONT
def show_par_nom
# Dans params[:nom], on a le nom passé sur l'URL
end
end
Génération d'une URL depuis une route
Nom de la route + _path(paramètres)montrer_par_nom_path("un nom")
# Exemple pour générer un lien :
<%= link_to @personne.nom, montrer_par_nom_path(@personne.nom) %>
<%= link_to @personne.nom, @personne %>
# est équivalent à
<%= link_to @personne.nom, personne_path(@personne.id) %>
→ /personnes/32 # On suppose que @personne à l'id 32
Contrôleur → Vue → FormBuilder → Page HTML
Exemple : app/views/questions/_form.html.erb
<%= form_for @question do |f| %>
Libellé : <%= f.text_field :libelle %>
<% end %>
<form action="/questions/3" class="edit_question" id="edit_question_1" method="post">
<div class="field">
<label for="question_libelle">Libellé</label><br />
<input id="question_libelle" name="question[libelle]" size="30" type="text" value="04- Durée depuis..." />
</div>
<div class="actions">
<input name="commit" type="submit" value="Update Question" />
</div>
</form>
Page HTML → Submit → Contrôleur
Exemple : app/controllers/questions_controller.rb
params == {:question => {:libelle => "04 - Comment ça va aujourd'hui ?"},
:id => 3}
soit
params[:question] == {:libelle => "04 - Comment ça va aujourd'hui ?"}
on peut donc écrire
mon_objet_a_mettre_a_jour = Question.find(params[:id])
mon_objet_a_mettre_a_jour.update_attributes(params[:question])
class Personne < ActiveRecord::Base
has_many :voitures
accepts_nested_attributes_for :voitures, allow_destroy: true
end
Dans le fichier Gemfile :
gem 'nested_form'
N'oubliez pas le bundle install
<%= nested_form_for @personne %>
...
<%= f.fields_for :voitures %>
...
<% end %>
et pensez à créer le partial :
app/views/personnes/_voiture_fields.html.erb
Attention aux conventions de nommage.
Quand vous modifiez un de ces fichiers, le serveur est automatiquement à jour en mode développement, et la console Rails nécessite un petit rechargement avec la commande :
reload!
Tout ce qui est modifié dans ce répertoire nécessite un redémarrage de la console ou du serveur (Ctrl-C, puis rails c ou rails s).
Si vous faites une modification dans ce fichier, quittez le serveur / la console Rails puis mettez à jour vos gems avec la commande shell "bundle install"
# Générer un nouveau projet
rails new nom_projet
cd nom_projet
# Vérifie et installe les Gems requise par le projet (dans le fichier Gemfile, décommenter therubyracer, on en a besoin)
bundle install
# Génère le modèle, la vue, le contrôleur et la migrations prêts à l'emploi
rails generate scaffold Classe <attribut[:type]> <attribut[:type]>
# Lance un serveur Rails
rails server [-p port]
# Lance IRB dans l’environnement Rails
rails console
# Joue / annule les dernière migrations
rake db:migrate / rollback
# Exécute un script dans l'environnement Rails de votre projet
rails runner lib/tasks/<nom du script>
# On génère un nouveau projet «tp_1»
# (la base de données par défaut est sqlite3)
rails new tp_1
# On va dans le répertoire du projet
cd tp_1
# On active la gem "therubyracer" dans le fichier Gemfile
# et on vérifie que l’environnement de la machine est adapté au projet
bundle install
# On crée une nouvelle classe, sa vue, son contrôleur...
rails generate scaffold Personne nom prenom date_de_naissance:date
# On crée la table correspondant dans la base de donnéees
rake db:migrate
# On lance le serveur
rails server
rails new <projet>
rake db:migrate
rails generate ...
Sur internet bien sûr (Google est toujours votre ami)
Suivez le guide
http://guides.rubyonrails.orgFouillez dans les API
http://api.rubyonrails.orgRegardez des screencasts pour apprendre plein de choses
http://www.railscasts.comPour apprendre de manière ludique
Rails for zombies !
Le sujet se trouve ici.