Cours gratuits » Cours informatique » Cours développement web » Cours Ruby » Cours d Introduction au langage Ruby et au framework Rails

Cours d Introduction au langage Ruby et au framework Rails

Problème à signaler:

Télécharger



★★★★★★★★★★3.5 étoiles sur 5 basé sur 1 votes.
Votez ce document:

Introduction au langage Ruby et au

framework Rails

Laurent Julliard <laurent chez nuxos point fr >

Présentation Association GUILDE

19 Décembre 2007

                                                                                                                   Version 1.5 16/12/2007                                               

Petit sondage

Qui programme en

?         C/C++

?         Java/JSP

?        

up>

?         PHP

?         Perl

?         Python

et

Ruby

Ruby: origine et principes

?         Langage né au Japon en 1993. Le papa: Yukihiro Matsumoto dit “Matz”.

–     Première release en 1995.

?         Un langage de scripting de haut niveau orienté objet

–     Tout n'est qu'objet

?         Mariage réussi de plusieurs courants

–     Smalltalk, Lisp, Perl,

?         Suit le principe “POLS” ou principe de moindre surprise

–     Une syntaxe simple et lisible (littéralement)

?         Fonctionne sur toutes les plateformes du marché

Un langage ça se lit

?         Les langages humains se lisent, Ruby aussi

5.times { print "Quick !" }

return unless books.include? les_miserables

['toast', 'cheese', 'tea'].each { |food| print food.capitalize }

Installer Ruby (et Rails)

?         Sur Windows

–    Ruby One-click Installer (Curt Hibbs) sur

–    Instant Rails = Ruby, Rails, Apache, MySQL (même site, même auteur)

?         Sur Linux

–    Ruby livré sous forme de packages avec la plupart des distributions

(Fedora, Mandriva, Suse, Ubuntu, Debian )

–    Installation aussi très simple à partir des sources:

Pour Ruby: ./configure; make; make install

Puis Rails: gem install rails

?         Sur Mac OS X

–    Ruby: maintenant livré en standard par Apple sur 10.3 (version 1.8.2), dans Leopard tout sera inclus (Ruby 1.8.4, Rails, MySQL, Mongrel )

–    Ruby/Rails tout-en-un avec Locomotive ()

Ruby: tour d'horizon

Partout des objets et des messages


?         En Ruby tout est objet

?         Un appel de méthode = envoi d'un message à un objet

Notation:

objet.message( )

?         Tout objet: oui mais

– des conventions de nommage et des notations implicites pour pouvoir faire court si on le souhaite !

“Ruby”.size

[1, 3, 5, 7].reverse

5.succ

# L'incontournable “Hello World” puts “Salut !”

# qui signifie en fait

(“Salut !”)

# ou encore sous forme de message

(:puts, “Salut !”)

# et des objets partout

STDOUT.class

STDOUT.methods

(/print/)

(('print'))

Quelques classes de base

?         String

–    Chaîne de caractères

“Ruby”,'Ruby',('Ruby')

?         Array

–    Tableau d'objets

[1, “deux”, 5**20]

?         Hash

–    Tableau associatif d'objets

{ 'I' => 1, 'II' => 2}

( )

?         Integer (Fixnum, Bignum)

5, 5**20

?         Float

3.5,  23.2E-6

?         Ranges

10..100, -3 5

?         FalseClass, TrueClass, NilClass true, false, nil

nil, false, 0, “”

ne signifient pas la même chose !!


Conventions de nommage

?        NomDeClasse                 (ex: LivrePoche)

?        nom_methode et nom_variable (ex: un_livre)

?        methode_qui_questionne?     (ex: existe?)

?        methode_dangereuse!         (ex: detruire!)

?        @variable_d_instance (ex: @titre)

?        @@variable_de_classe (ex: @@nb_de_livres)

?        $variable_globale ou

$VARIABLE_GLOBALE (ex: $LOAD_PATH)

?        CONSTANTE ou AutreConstante (ex: PLATFORM)

?        :symbole  (ex: :option)

Exemple: classe, méthodes

Une déclaration de classe              $SAFE = 1

           comprend:                                    class Avion

                  – un nom de classe           @@avion_fabriques = 0

attr_reader :moteurs

                  – des déclarations de:             attr_accessor :altitude, :speed

?        méthodes d'instance    def initialize(moteurs)

                                          ou de classe @moteurs@@avion_fabriques += 1 = moteurs

?        des variables d'instances     end

                                          (attributs) ou de classe  def self.quantite

?        des accesseurs      end@@avion_fabriques

?        constantes end

?        classes imbriquées (rares)      zingue = (2) puts zingue.moteurs

?        Autre: variable globale     zingue.altitude = 33000

puts Avion.quantite

Les classes sont des objets


Les classes sont des objets comme les autres

–     Elles sont toutes du type Class

–     Ruby utilise une constante pour les

nommer

puts Avion.class  # Class

def factory(a_class, *args)   (*arg) end

factory(Array, [1,2,3]) factory(Avion, 4) [String, Array, Hash][rand(3)].new

# Une classe peut-être créée var =


puts # chaine vide

Constante: Avion  # et nommer plus tard Object pointer  AvionChasse = var

puts # “AvionChasse” Objet Class

Methodes et paramètres


?        Tous les paramètres sont passés par référence sur les objets.

?        Une valeur par défaut peut être spécifiée pour les paramètres

?        Parenthèses facultatives lors de l'appel d'une méthode

?        Paramètres nommés(utilisation d'un Hash)

?        La valeur retournée est la dernière valeur évaluée (souvent absence de return)

?        Les méthodes sont public, protected ou private

def edit(chaine) chaine[3..6] = “soir” end

ma_chaine = “Bonjour” edit(ma_chaine) puts ma_chaine  # “Bonsoir”

# valeur par défaut def save(flush=true)

end

save # comme save(true) save false # parenthèses facultatives

# paramètres nommés def modifier(args) puts args[:nb_pages] puts args[:auteur] end

@livre.modifier(:nb_pages => 300,

:auteur => 'DHH')


Héritage

Les modules

?         Les modules sont des classes non instantiables

?         Elles on deux usages

–   Structurer l'espace de nommage sur un modèle hiérarchique

–   Permettre le 'mixin' c'est à dire étendre les compétences d'une classe

Modules: Espace de nommage

Modules: Mixin


? Pas d'héritage multiple en

Ruby mais utilisation des

'Mixin'

–   utilisation du mot clé       include

–   un Mixin étend les compétences d'une classe

en lui ajoutant une série de méthodes

–   Exemple: Enumerable, Comparable,

class CollectionBouquin

include Enumerable

# comment itérer sur la collection def each   

end

# relation d'ordre entre 2 éléments def <=> (autre_elt)

end end c = ( )

# En incluant Enumerable on a gratuitement:

# min, max, find, sort, between?,etc

c.find { |bouquin| bouquin.title =~ /Ruby/}

c.min

c.sort


Le 'typage à la canard'

(duck typing)

?         Paramètres et variables ne sont pas typés statiquement MAIS à l'exécution tous les objets sont l'instance d'une classe.

–    En pratique les erreurs de typage n'arrivent jamais

–    Sauf sur 'nil' et c'est une bonne chose (= valeur indéfinie)

?         Ruby juge un objet sur ce qu'il est capable de faire pas sur un type défini statiquement.

–    Si un objet marche comme un canard et fait coin-coin alors Ruby le voit comme un canard

? Conséquence: le code Ruby peut et doit être très générique

– On repousse le plus loin possible le moment où le code est spécifique d'un “type”. 

Blocs et itérateurs

Blocs

Itérateurs, transaction, closures

?      Ruby offre les habituelles 5.times { print “Coco!!”} boucles for, while, arr = [23, 34, “33”, 4.5]

mais on leur préfère


les itérateurs

?      Le bloc peut être utilisé en mode “transaction”

?      On peut aussi l'utiliser comme une “closure”

– i.e. un bloc de code avec

arr.sort_by { |elt| elt.to_i }   # [4.5, 23, “33”, 34 ]

arr.collect { |elt| puts elt.class }   # [Fixnum, Fixnum, String, Fixnum]

# Transaction avec close implicite

(“”) do |fh|   fh.each_line { |l| puts l if l.size > 40 } end

# Closure transfer = b1 = (“Start”) { transfer.start }


tout son contexte préservé

Itérateurs (définition)

Les symboles

?         Une autre “étrange bestiole”

:nom_du_symbole

?         Un symbole est une étiquette

?         Ce n'est ni une variable, ni une chaîne de caractères

 

Bibliothèques et Packages

? Types de base

–   Object

–   String, Array, Hash, Range, Regexp

? Autres

–   Kernel

–   Exception

–   Process, Signal

– Integer, Fixnum, Bignum, Float, Numeric

?         Fichiers

– IO, File, FileTest, Dir, Errno

?         Math

–   Thread, ThreadGroup

–   Time

–   GC

–   Marshal

–   TrueClass, FalseClass, NilClass

Les classes intégrées

– trigo, log, exp .

Les classes standards


?         Database

–   DBM, GDBM, SDBM

?         Protocoles réseau

–   Net (http, ftp, imap, pop, smtp, telnet), openSSL

?         Web/XML

–   CGI, URI, REXML, RSS, SOAP, XMLRPC, Yaml,

Webrick

?         Concurrence/Distribution

–   dRuby, Rinda

–   Thread, Mutex, Monitor,

?         Math

–   Complex, Rational, mathn, Matrix,

?         Lib. externes

–   DL

?         Et beaucoup d'autres


L'entourage de Ruby

Les Gems

Les outils de développement

? Shell interactif

– Irb:  Ruby en direct

? Couverture de code

– rcov

(?rcov)

? Debugger

ruby -r debug

%self  cumulative total  self children  calls self/call total/call  name

 23.64     0.13   0.13   0.13 0.00     10002   0.00     0.00     String#split

 21.82     0.30   0.39   0.12 0.27     10002   0.00     0.00     CallRot#read_line

 18.18     0.55   0.54   0.10 0.44         1   0.10     0.54     #foreach

 12.73     0.42   0.07   0.07 0.00     10002   0.00     0.00     #local

  5.45     0.33   0.05   0.03 0.02     10002   0.00     0.00     CallRot#line_is_future?

  3.64     0.44   0.02   0.02 0.00     10003   0.00     0.00     #allocate

  3.64     0.35   0.02   0.02 0.00     20004   0.00     0.00     Array#pop

  3.64     0.17   0.02   0.02 0.00     10002   0.00     0.00     Comparable#>

  3.64     0.15   0.02   0.02 0.00     10002   0.00     0.00     OnCall#initialize

  1.82     0.45   0.01   0.01 0.00         1   0.01     0.01     #open

Les outils de développement

Le futur de Ruby

?         Actuellement en version 1.8.6

–   Très stable, une release mineure tous les 6 à 8 mois. ? Ruby 1.9.x, version expérimentale avant la 2.0.

?         4 projets de machines virtuelles en cours !!!

–   Machine Virtuelle YARV  (l'héritière)

–   JVM de Sun (JRuby)

–   CLR de Microsoft (IronRuby et )

–   Machine Virtuelle Smalltalk (Rubinius)


Le framework Ruby on Rails

Laurent Julliard <laurent chez nuxos point fr >

Paris On Rails 2007

 

Adoption ?

• Près de 6% des développeurs Web ont déja adopté Ruby & Rails et presque 25% s’y intéressent [1]

[1]

Hot Stuff !

IBM

• De nombreux articles sur le site Developerworks [1]

   

[1]

IBM

Sun Microsystems


•        Financement du développement de JRuby

•        Charles Nutter et Thomas Enebo sont désormais employés à plein temps par Sun..

•        et travaillent sur le portage de l’interpréteur Ruby sur la JVM

•        Ruby est le premier langage dynamique que Sun va porter sur la JVM


Microsoft

?         Intégration de Ruby dans Silverlight

?         Financement du développement de IronRuby (Ruby CLR)

?         John Lam est désormais employé à plein temps par Microsoft

?         et travaille sur le portage de l’interpréteur Ruby CLR

Microsoft


Rails sur Ruby, pourquoi?

?         Multi-plateforme

?         Compact

–   2 à 4 fois moins de code qu'en Java/C#/C/C++

?         Expressif

–   Forte capacité d'auto-analyse  (introspection et réflexion)

User.find_by_name_and_country(“Hansson”, “Danemark”) has_many :adresses

La force de Rails: ses principes!

?         Principe #1 :  “Don't Repeat Yourself” (DRY)

? Eviter les répétitions

l   Principe #2 :  “Convention over configuration”

? Compacité et organisation du code

l   Principe #3 : “Say What You Do, Do What You Say”

? Expressivité et extensibilité du langage (DSL)

? Principe #4 : “One language to rule them all

? Un seul langage pour tout faire + forte intégration

Résultat

MVC le retour

Chaque chose à sa place

Modèle ActiveRecord: d'abord un ORM

Les migrations

Les validations

Les cerbres avant l'entrè    ée des objets dans la base

et le retour utilisateur

Les associations: relation 1:N

has_many et belongs_to

Les associations: relation 1:N

Les méthodes qui en découlent

mon_article.commentaires mon_article.commentaires.count  mon_article( :all, :order => 'created_at' )

mon_article.commentaires <<

Commentaire.new( :titre => 'Mon grain de sel')  un_commentaire.article

Autres associations

?         Relation 1:1

–      has_one, belongs_to

?         Relation N:N

–      has_many_and_belongs_to (habtm) ? Relation N:N (jointure enrichie) – has_many :through =>

   
       

consultations

 
   
   
   
   

lecteur_id

 
   

article_id

 
   

created_at

 

updated_at

 

note

 
 

Contrôleur ActionController

Un mini controleur pour l'application Blog 


Vue ActionView

 # app/views/blog/list.rhtml

<% for article in @articles %>

  <h1><%= article.titre %></h1>

  <p><%= truncate(article.texte, 80) %>&hellip;</p>

<p><%= link_to "suite..", :action => 'show', :id => article %></p>  <% end %>

 # app/views/blog/show.rhtml

 <h1><%= @article.titre %></h1>

 <p><%= @article.texte %></p>

 <% for comment in @article.commentaires %>

   <%= render :partial => 'comment', :object => comment %></p>

 <% end %>

 <p><%= link_to "Retour", :action => 'list' %></p>

ActionView

? Le partiel pour l'affichage du commentaire

 # app/views/store/_comment.rhtml

<p><%= h comment.note %></p>

 <p><%= comment.author %> - <%= comment.created_at %></p>

RJS: Ajax intégré

?         Intégration poussée de Prototype et Scriptaculous

–   Pas de Javascript à écrire

?         Fonctions Javascript prédéfinies:

–   Champs à completion automatique (auto_complete_field_for)

–   Champs éditable (in_place_edit_for)

–   Tri et Drag-Drop des éléments DOM

–   Effet visuel (flash, fade in, hide/show, etc )

RJS: Ajax intégré

?         Templates RJS

– Génère du code Javascript à la volée au lieu de HTML et l'envoie vers le navigateur pour exécution

?         Exemple:  insérer du HTML et notfier l'utilisateur

#

page.insert_html :bottom, 'comment_list',

"<li id=#{}>#{comment.title}</li>" page.visual_effect :pulsate, "#{}"  page.replace_html 'flash_notice' , "Commentaire ajouté avec succès"

  'flash_notice'  page.delay(3) do

page.replace_html 'flash_notice' , ''    page.visual_effect :fade, 'flash_notice'  end

Les Tests Tests Unitaires

  ? Permet de tester le bon fonctionnement du modèle


 #  class ProductTest < Test::Unit::TestCase    fixtures :products

 deftest_should_refuse_product_with_no_title      product =       assert !product.valid?      assert product.errors.invalid?(:title)      assert ! end end

ruby_in_a_nutshell:

  id: 1   titre: Ruby in a nutshell   description: Le langage    prix: 25.50

smalltalk_80:

  id: 2   titre: Smalltalk 80   description: Smalltalk ..

  prix: 32.00


Tests Fonctionnels

? Permet de tester le bon fonctionnement des actions du contrôleur et le contenu de la vue

Couverture

+----------------------------------------------------+-------+-------+--------+

| File                              | Lines |  LOC  |  COV   |

+----------------------------------------------------+-------+-------+--------+

| |   318 |   246 |  85.0% |

| |    92 |    76 |  78.9% |

| |    70 |    56 |  80.4% |

| |    19 |    13 | 100.0% |

| |    62 |    48 |  83.3% |

| |   296 |   234 |  53.8% |

| |    68 |    54 |  68.5% |

| |    67 |    53 |  84.9% |

| |    60 |    37 |  86.5% |

| |    71 |    61 |  86.9% |

| |   102 |    76 |  14.5% |

| |    45 |    33 |  30.3% |

| |   295 |   207 |  69.1% |

| |   357 |   267 |  63.3% |

|      |    11 |     2 | 100.0% |

| |     2 |     2 | 100.0% |

| |     2 |     2 | 100.0% |

| |     2 |     2 | 100.0% |

| |    22 |     9 | 100.0% |

| |    37 |    20 | 100.0% |

| |    15 |     4 | 100.0% |

| |    16 |     6 | 100.0% | | ..

| |   205 |   140 |  92.9% |

| |    92 |    75 | 100.0% |

| |    22 |     9 |  33.3% |

| |    22 |     8 | 100.0% |

| |    23 |     8 | 100.0% |

| |   120 |    62 |  64.5% |

| |   113 |    83 |  41.0% |

| |   122 |    69 |  78.3% |

| |   295 |   214 |  58.4% |

| |    27 |    16 | 100.0% |

+----------------------------------------------------+-------+-------+--------+

|Total                                      |  4956 |  3451 |  73.3% |

+----------------------------------------------------+-------+-------+--------+

Références – Les Sites

?         Sites français

–   Le site Ruby:

–   Le site Rails:

?         Sites anglo-saxons

–   LE site Ruby:

–   Projets Ruby:

–   LE site Rails:

–   Pour les développeurs Java: 10 things every Java Programmer should know about Ruby de Jim Weirich ()

Ouvrages: les indispensables

           Programming              The Ruby Way           Ruby For Rails   Ruby on Rails –

           Ruby                                                         Eyrolles (en français)

 

A ce jour plus de 19 titres en anglais et 8 en français sur Ruby on Rails !!!

Ouvrages: les gratuits

?         Ruby Programming (Pick Axe – 1ère édition)

–   (couvre Ruby 1.6)

?         The Little Book of Ruby Book

–   (une bonne petite introduction)

?         Why's Poignant Guide

–   (l'informatique, l'humour, l'art et un brin de folie réunis )

Questions - Réponses


102