Hébergement ruby on rails

Débuter avec ruby on rails

Pourquoi ruby on rails ?

Si vous avez déjà développé un site internet ou une petite application web, vous avez du vous en rendre compte, on passe son temps à se répeter, quel que soit le langage que l'on utilise, tant que l'on utilise pas un framwork on utilise son énergie à programmer son propre framework de manière inconsciente.

Cela se manifeste par essayer de se créer une convention, une manière d'organiser son code, de rassembler les choses qui se ressemble pour qu'elles partagent leur code, répéter un mécanisme sur l'ensemble des fonctionnalités, par exemple exécution de la tache puis redirection sur une page avec en paramètre l'id du message à afficher.

Tout ça c'est une forme de cadre de développement que l'on se donne pour être logique et s'y retrouver facilement. Dans la pratique c'est souvent quelque chose qui fait appel à pas mal d'astuces qui rompent cette logique. De plus cette logique est souvent très incomplète car elle est basée sur une manière de programmer qui ne lui est pas appropriée. Car quoi que l'on face une page correspond a un fichier. Alors pour contrer ce problème on est poussé a créer une "super" page souvent l'index, qui contient la logique pour afficher toutes les autres pages, au moyen d'arguments qu'on lui passe. C'est comme cela que fonctionne la plus part des CMS en PHP. Cette solution fonctionne mais est très loin d'être satisfaisante. A chaque hait (requête) l'ensemble du CMS est réveillé et traite la requête. Pour contrer ce problème on est amené a créer des caches qui permettent d'éviter de réveiller trop de code.

Alors, Ruby on rails dans tout ça ? Déjà, ruby on rails utilise le langage ruby, dans le quel tout est objet, permet de programmer de manière objet. Ensuite Ruby on rails disposant de son propre serveur http, il n'est pas a la merci d'un serveur web qui restreindra a une fichier == une page. De plus ruby on rails apportera une base saine a votre application web/site web. Mais en contrepartie de tout ces avantages vous allez devoir bouleverser vos habitues, et apprendre un nouveau langage ! (mais cela n'est en rien un obstacle, je vous assure)

Mais il va falloir que j'apprenne un nouveau langage !

Et bien oui ! Mais rassurez vous, c'est très simple, ce n'est pas un concept radicalement diffèrent comme ce que serait le VHDL au PHP. Si vous vennez de PHP, dans les rares choses qui changent il y a la syntaxe (plus besoin de tout ces $) et le fait que les variables aient un type. Et aussi c'est un langage fait pour faire de la programmation orientée objet. (vous allez me dire PHP5 aussi).

Au final c'est pas un boulversement infranchissable que se mettre au Ruby, c'est simplement quelques habitudes à prendre, qui sont en plus de bonnes habitudes qui favorisent une logique de programmation. (notamment pour la portée des variables, et les symboles)

Le ruby d'un peux plus près

Ruby est un langage interprété, ou tout est objet. (même les nombres, les dates, ... tout)

Le fait que dans ruby tout soit objet permet d'avoir une cohérence et une logique globale dans le langage. L'objet sera ensuite utilisé comme base dans l'architecture que ruby on rails nous impose, suivant le concept Model Vue Controlleur.

Les symboles

C'est une particulartité de Ruby, qui est d'ailleurs très utilisée dans Ruby on rails. Cela a la forme de deux points et d'une chaine de caractères.

            :test
            :"test"
            

Un symbole est un identifiant, vue qu'il a un nom lisible par un humain et il lui correspond un identifiant qui est fixe par rapport au nom. Vous allez en croiser beaucoup dans la configuration de divers fonctions dans Rails.

Pour illustrer la chose :
            >> "test".object_id
            => 2159507240
            >> "test".object_id
            => 2159502920
             
            >> :test.object_id
            => 168508
            >> :test.object_id
            

Ce n'est pas bien grave de ne pas avoir compris vraiment ce que c'est, leurs utilisation dans rails sera naturelle sans avoir à se poser de question sur comment ça marche.

Rails c'est quoi ?

Un petit exemple de chose de très haut niveau que Rails rend extrêmement accessible.
            >> 1.month+6.month+3.day+3.hour-1.year
            => -1 years, 7 months, 3 days, and 10800 seconds
            

ou encore

            Articles.all
            

Qui retournera l'ensemble des articles sous forme d'un tableau d'objets articles, et cela quel que soit la base de donnée utilisée, il n'y a absolument pas a penser a la base de donnée, c'est totalement abstrait.

Les relations entre les tables sont aussi abstraites, par exemple pour récupérer l'email de la personne qui a posté un article on procédera ainsi :

            article = Article.find_by_title("test")
            article.user.email
            

Par quel bout prendre la réalisation de son premier projet en rails

Se poser des questions

  • A quel besoin l'application doit t'elle répondre ?
  • Quelle base de donnée vais-je utiliser ? (sqlite/mysql/postgresql/oracle ... )
  • Quels sont les pricipaux Models ? et quel sont leur attributs ?
  • Quelles sont les liaisons entre mes Models ?
  • Quels sont les principales actions que je souhaite effectuer sur les Models ?

Une fois que l'on a une idée de tout ca sous forme de gribouillage sur un brouillon, on peux commencer a créer le squelette de l'application. Mais avant de toucher a quoi que ce soit, il faut avoir une vision globale de ce que l'on souhaite faire.

Installer son environnement de développement

Ruby

Vous trouverez toutes les explications nécessaires en français sur le site officiel : http://www.ruby-lang.org/fr/downloads/

Rails

Il faut simplement exécuter avec les privilèges du super utilisateur :

            gem install rails
            

Ruby on rails ainsi que toutes ses dépendances seront installées automatiquement.

Comment se présente une application ruby on rails ?

Une application ruby on rails est un dossier contenant plusieurs sous dossier, avec un dossier dans le quel il y a l'ensemble des exécutables qui agiront uniquement sur l'application courante. Ils feront tous appel a Ruby on Rails qui est installé dans votre installation de Ruby. Mais nous allons pas créer manuellement cette arborescence, nous allons plutôt utiliser l'exécutable rails qui nous créera une application vierge en créant l'arborescence et les différents squelettes.

            rails test
            

Note : Ici test serait le nom de l'application, qui sera crée dans le dossier courant du shell.

Ensuite pour voir notre application vierge il faut démarrer le serveur de développement de l'application. Si on ne spécifie pas que l'on est en production on est forcément en développement.

Le serveur se lance par la commande :
            script/server
            

Note : Il faut bien sur être dans le dossier de l'application pour lancer le serveur.

Ensuite vous pouvez lancer votre navigateur préféré sur l'adresse http://127.0.0.1:3000 Vous devriez y trouver une page d'accueil par défaut de ruby on rails.

Générer la base de son application

Dans une grande majorité de cas, notre application est résumable (ou du moins une partie) comme ajouter un objet X qui a tels attributs, lister tout ces objets X, editer un objet X, et effacer un objet X. Rails nous propose de générer une base fonctionnelle de toute cette mécanique. Ensuite vous aurez plus qu'a l'adapter a votre utilisation. En plus ce que nous génére rails est une architecture REST. Ce qui veux dire qu'il sera aisé de l'utiliser a distance.

Donc nous allons créer le Modele article, qui aura deux attributs, l'un le titre qui sera un string, et l'autre le corp, qui sera de type text.

            script/generate scaffold article titre:string corp:text
            

Note : Article est au singulier, car c'est le nom de l'objet, l'objet article.

Autres types utilisables ici :
  • boolean => true/false
  • float => flotant
  • integer => nombre entier
  • decimal

Maintennant regardons ce que la commande a généré.

            $ script/generate scaffold article titre:string corp:text
                  exists  app/models/
                  exists  app/controllers/
                  exists  app/helpers/
                  create  app/views/articles
                  exists  app/views/layouts/
                  exists  test/functional/
                  exists  test/unit/
                  create  test/unit/helpers/
                  exists  public/stylesheets/
                  create  app/views/articles/index.html.erb
                  create  app/views/articles/show.html.erb
                  create  app/views/articles/new.html.erb
                  create  app/views/articles/edit.html.erb
                  create  app/views/layouts/articles.html.erb
                  create  public/stylesheets/scaffold.css
                  create  app/controllers/articles_controller.rb
                  create  test/functional/articles_controller_test.rb
                  create  app/helpers/articles_helper.rb
                  create  test/unit/helpers/articles_helper_test.rb
                   route  map.resources :articles
              dependency  model
                  exists    app/models/
                  exists    test/unit/
                  exists    test/fixtures/
                  create    app/models/article.rb
                  create    test/unit/article_test.rb
                  create    test/fixtures/articles.yml
                  create    db/migrate
                  create    db/migrate/20100209121826_create_articles.rb
            

Maintenant observons ce qui a été généré dans un navigateur, mais avant il faut créer la base de donnée, car il faut bien que l'on puisse stocker des objets articles de manière persistante. D'ailleurs on remarque qu'une migration a été générée ( db/migrate/20100209121826_create_articles.rb dans notre cas ), elle contient une description des champs de l'objet articles, de façon a pouvoir le stocker. Il va donc falloir demander a rails de générer cette base de donnée en suivant le schéma décrit par la migration. Il va aussi falloir indiquer a rails quelle base de donnée utiliser. Par défaut, il utilisera une base de donnée sqlite, qui sera dans db/developpement.sqlite3 si on est en développement, et db/production.sqlite3 si on est en production. Dans beaucoup de cas une base de donnée sqlite suffit.
Pour que rails cré la base de donnée suivant le schéma, il suffit d'exécuter :

            rake db:migrate
            

Maintenant que la base de donnée est créer, nous pouvons lancer le serveur de développement.

            scripts/server
            

Maintenant en lançant un navigateur sur l'adresse http://127.0.0.1:3000/articles on doit voir apparaitre une interface basique qui permet de lister, d'ajouter, d'éditer, de supprimer des articles. Maintenant regardons de plus près le code qui a été généré et qui nous permet d'avoir cette interface. Ce code sera la base saine de notre application.

Ajouter une action sur l'objet Article a la mode REST

Admettons que l'on souhaite ajouter une action a l'objet article, pour par exemple que la personne puis télécharger cet article. Nous allons avoir besoin de :

  • Ajouter une fonction dans le contrôleur article
  • Ajouter une vue pour cette action dans le dossier des vues des articles
  • Ajouter une route qui permet d'acceder a cette fonction
  • Modifier une vue existante pour permettre l'accès a la nouvelle fonction

Pour ajouter la fonction exporter dans le contrôleur article il suffit de simplement éditer le fichier app/controllers/articles_controller.rb et d'ajouter un bloc de définition de fonction :

            def exporter
              #votre code d'export d'article
            end
            

Ensuite il va falloir ajouter une vue pour que l'on puisse afficher ce que rend cette fonction, pour cela il suffit de créer le fichier app/views/articles/exporter.html.erb

Note : Il est fortement conseillé d'utiliser un système de template comme HAML ( http://haml-lang.com/ ) qui va permettre de faire de l'HTML de manière très esthétique.

Maintenant il faut que l'on ajoute une route pour que la fonction exporter soit prise en compte dans l'architecture REST de l'application, et qu'elle bénéficie ainsi des facilités pour connaitre son chemin. Ils faut donc éditer config/routes.rb

Actuellement dans ce fichier on doit remarquer une ligne avec :

            map.resources :articles
            

Pour ajouter notre fonction d'export nous devons ajouter en paramètre :

            :member => { :exporter => :get}
            # Si exporter est appelé avec en paramètre l'identifiant d'un article, et appelé avec la méthode get.
            
            :collection => { :exporter => :get}
            # Si exporter est appelé sans paramètres et donc valable pour l'ensemble des articles, et appelé avec la méthode get.
            

Ensuite, maintenant que notre fonction est inscrite dans les routes, nous pouvons appeler son chemin très simplement par :

            exporter_article_path # Si c'est un :member 
            exporter_articles_path # Si c'est une :collection
            

Note : Dans certains ça il sera nécessaire de donner en argument l'objet article sur le quel pointer.

Julien.N
Merci de me contacter avant d'utiliser ailleurs ce contenu.

Valid XHTML 1.0 Transitional