De PHP à Ruby : votre premier index.php en Ruby

Je suis un développeur PHP depuis environ 10 ans maintenant, et j’en suis plutôt content à vrai dire. J’aime écrire des web apps, et ça tombe bien, PHP a été initialement créé pour ça. Bien. Et après ? Je suis curieux. Diantre. Il m’a donc fallu aller satisfaire ma curiosité. J’ai essayé Ruby on Rails, mais comme je voulais aussi apprendre le Ruby, ce n’était pour moi pas la bonne façon de commencer. J’ai donc voulu écrire ma première web app en Ruby, comme je l’ai fait il y a 10 ans de cela avec mon premier dans un index.php. Nous y voici.
PHP : un langage web
Comme je l’ai dit, PHP est un langage web. Il propose donc de base un ensemble de choses utiles pour interagir avec un environnement HTTP (entre autres). Vous n’avez pas pu passer à côté de nos chers amis $_GET et $_POST par exemple (sauf si vous avez appris PHP avec symfony mais bon, pas sur que ce soit le meilleur moyen). Ensuite PHP est un langage de template à lui tout seul. Vous mélangez du PHP au sein d’un fichier HTML et vous obtenez ce que vous souhaitez, sans effort particulier. Prenons le fichier index.php suivant :
<h1>Hello world</h1> <p> Hello <?php echo $_GET['name']; ?> </p>
Vous utilisez ensuite Apache et mod_php pour l’afficher (avec MAMP, WAMP, ou ce que vous voulez) en appelant index.php?name=Karamazof et vous êtes les rois du monde. Admettons. Attaquons les choses sérieuses.
Ruby : un langage tout court
C’est là que ça se gâte. Tout d’abord je tiens à dire que je n’ai pas beaucoup d’expérience en Ruby, il y a de ça un mois je n’en avais encore jamais fait, soyez indulgents ;-). Mais j’ai tout de suite été confronté à l’évidence : Ruby (comme Python d’ailleurs) n’est pas un langage web. Pas qu’on ne peut pas faire de web avec (ça se saurait), mais il n’a pas été initialement prévu pour cela. Qu’est-ce que cela implique ? Vous n’avez pas de raccourcis/fonctions pour accéder à l’environnement HTTP comme vous pouvez avoir avec PHP et ses $_GET et $_POST.
Il faut donc en Ruby utiliser une couche standardisée (ou presque) entre votre code et le serveur web, couche qui vous donnera la possibilité d’accéder aux éléments d’une requête HTTP et de renvoyer une réponse à afficher. En Ruby le « standard de facto » est maintenant Rack (rien à voir avec Rake). Rack est une couche d’abstraction entre le serveur web (peu importe lequel) et votre code. Vous devrez bien sûr adapter votre code pour qu’il soit compatible Rack et puisse être exécuté sur n’importe quel serveur web qui propose une interface Rack (à peu prêt tous maintenant). C’est ce que je vous montre ci-dessous.
À noter que le problème est le même pour Pyhon et que Rack a d’ailleurs été inspiré de la solution trouvée pour Python qui s’appelle WSGI.
Une application Rack
Une application Rack qu’est-ce que c’est ? C’est une application qui a comme point d’entrée une méthode call qui prend un tableau en paramètre (souvent nommé env) et qui renvoie un tableau contenant le statut HTTP, les headers HTTP, et le contenu. Vous pouvez aller consulter le post de blog d’origine ou l’article Wikipedia.
class HelloWorld def call(env) [200, {"Content-Type" => "text/plain"}, ["Hello world!"]] end end
Heureusement vous pouvez inclure des modules rack pour vous faciliter la vie, et notamment pour construire un object Request à partir de cet environnement et un objet Response pour faciliter la création de la réponse à envoyer au navigateur. À noter que vous pouvez très bien utiliser env et retourner un tableau de contenu vous même comme l’exemple ci dessus, mais c’est je trouve pas le plus pratique. Voici un exemple de code ci-dessous :
#hello_world.rb require 'rack/request' require 'rack/response' class HelloWorld def call(env) request = Rack::Request.new(env) response = Rack::Response.new response.write "<h1>Hello world</h1>" response.write "<p>" response.write " Hello " + request.GET['name'] response.write "</p>" response.finish end end
Pour tester votre application vous avez plusieurs choix (dont Apache si vous le souhaitez) mais je vous conseille pour commencer d’utiliser rackup qui vous permettra d’avoir un serveur de test assez facilement. Pour ce faire créez un fichier config.ru avec le contenu suivant dedans :
#config.ru require 'hello_world' run HelloWorld.new
Rien de bien compliqué ici, on inclut le fichier hello_word.rb précédemment créé et on dit à rackup de lancer notre application.
Installez ensuite les gem nécessaires :
sudo gem install webrick rackup
Puis pour lancez le serveur web (webrick par défaut) avec rackup, placez vous dans le répertoire contenant vos fichiers puis exécutez la commande suivante :
rackup -I.
Vous devriez pouvoir vous rendre sur http://127.0.0.1:9292/?name=Vincent et voir votre première page web en Ruby !
Petite précision, si vous souhaitez modifier votre code et voir les modifications sans relancer le serveur web, utilisez shotgun à la place de rackup (à n’utiliser qu’en développement) :
sudo gem install shotgun shotgun -I.
Conclusion
Ruby est un langage fort sympathique avec beaucoup de possibilités que PHP ne permet même pas d’entrevoir. En revanche en ce qui concerne le web on comprend un peu mieux pourquoi PHP est beaucoup plus populaire que Ruby pour faire du web : PHP a été prévu pour, pas Ruby. Mais je ne saurais vous conseiller d’essayer le Ruby, on y prend vite goût.
Crédit photo : http://www.flickr.com/photos/pswansen/41832591/
