Expérimentations avec Ruby : Projet web MVC avec Sinatra

Un certain soir, j’étais en recherche d’idées pour un article de blogue. Ce que j’avais en tête, c’est de trouver quelque chose de nouveau à expérimenter et à apprendre.

L’idée qui m’est venue à ce moment-là, c’est de tenter quelque chose avec Ruby. Ce langage de programmation est très populaire grâce à la venue du framework de développement web Rails. Toutefois, dans mon cas, je ne voulais pas me lancer dans la mise en place d’un projet Rails. Le projet était trop ambitieux pour ce que j’avais d’ambition à donner ce soir-là.

Hello Sinatra!

Mes recherches m’ont mené directement à Sinatra. Un tout petit framework MVC permettant le développement d’applications web et cela très rapidement grâce à un langage dédié (DSL, pour les anglophiles) spécifiquement pour ses besoins.

D’ailleurs, cela est l’un des principaux avantages de Ruby. La possibilité de créer des langages dédiés grâce à la souplesse syntaxique qu’il permet.

La documentation de Sinatra le mentionne très clairement. Il suffit de très peu pour avoir un projet minimalement fonctionnel. La mise en œuvre d’un projet avec Sinatra nécessite vraiment deux lignes de codes. Seulement si vous avez installé Ruby, au préalable.

Les principaux arguments de vente derrière Sinatra sont les suivants :

  • Simplicité et facilité d’utilisation
  • Résultats instantanés
  • Alternative rapide à Rails

Du côté de la facilité d’utilisation, la configuration de Sinatra se résume à :

gem install sinatra

Au minimum, votre fichier Ruby devra contenir le code suivant pour fonctionner avec Sinatra :


require 'sinatra'
get '/' do
'FrenchCoding'
end

view raw

Sinatra.rb

hosted with ❤ by GitHub

De plus, pour l’exécuter vous n’aurez qu’à taper

ruby -rubygems frenchcoding.rb

Le résultat est celui que vous vous attendez. Vous aurez, affiché dans la fenêtre de votre navigateur, la chaîne « FrenchCoding ». Génial, non?

Utilisation

Il s’avère que Sinatra offre un peu plus que ce qui a été précédemment illustré. Directement tiré de la boîte, vous avez accès à un engin de routage complet qui permet de contrôler chaque méthode HTTP à partir de vos contrôleurs et la possibilité d’utiliser l’engin de vues de votre choix.

Mon projet a été basé sur cette idée. Créer un petit service web permettant de recevoir une image encodée en une chaîne base64, l’enregistrer sur le disque et la retourner au demandeur. Simple? Jugez-en par vous-même.


require 'sinatra'
require 'base64'
require 'haml'
require 'securerandom'
set :static, true
set :public_folder, '/uploads'
get '/' do
haml :index
end
get '/uploads/:file' do |f|
send_file 'uploads/' + f
end
post '/image' do
hostUrl = 'http://' + request.host_with_port()
filePath = 'uploads/' + params['imageName']+SecureRandom.uuid.gsub('-','') + ".png"
File.open(filePath, "wb") do |f|
f.write(Base64.decode64(params['imageData']))
end
return 'http://' + request.host_with_port() + '/' + filePath
end

view raw

PostImage.rb

hosted with ❤ by GitHub

Au total, c’est 24 lignes bien espacées de code assez léger. Voilà comment il se décompose :

get / : Retourne la page d’accueil du service. En toute honnêteté, j’en avais pas besoin mais je voulais voir comment fonctionnait Haml. D’ailleurs, vous pouvez consulter le contenu de cette vue ici.

get ‘/uploads/:file’ : Retourne un fichier par le nom qui lui est demandé en paramètre. Vous l’invoquez de cette façon : http://localhost/uploads/fichier.jpg.

post ‘/image’ : Tout ce qui est décrit, plus haut dans ce paragraphe, se passe dans cette action.

Mot final

Parfois, il n’est pas nécessaire d’aller à la chasse à l’ours avec un arsenal nucléaire. La force de Ruby est de pouvoir faire de petites choses simples avec très peu.

Alors, lorsqu’il est temps de pouvoir mettre en place un petit projet jetable. Ruby s’impose, pour moi, comme un outil de prédilection. D’ailleurs, pour ce petit bout de code, j’ai passé plus de temps à figurer comment enregistrer un fichier que de mettre en place Sinatra.

C’est peu dire!