Introduction à rack

Publié le 28 décembre 2010 par Martin Catty | back

Cet article est publié sous licence CC BY-NC-SA

Qu’est ce que rack ?

Rack est une interface entre votre application et votre serveur web. Son but est d’unifier les API pour simplifier la communication entre l’application et le serveur web. Grâce à rack vous pouvez:

  • interchanger votre serveur, pourvu qu’il soit rack compatible (comme thin, unicorn, passenger…)
  • extraire un morceau d’application pour la transformer en application autonome
  • intégrer une application existante dans une autre application (ex: une application sinatra dans une application rails)

Rack porte bien son nom et son logo puisque l’idée sous jacente est de pouvoir empiler des applications qui vont prendre en entrée la requête pour préparer la réponse.

Dans rails 3, chaque contrôleur est une application rack.

Exemple d’app rack basique:

  use Rack::ContentLength

  app = lambda { |env| [200, { 'Content-Type' => 'text/html' }, 'Hello World'] }
  run app

Ce petit bout de code est une app rack en soit et peut être lancé via:

rackup app.ru -s thin -p 4000

équivalent à:

thin -R app.ru -p 4000 start

Rack monte à bord de rails

Rails 3 étant compatible rack, vous pouvez parfaitement mapper une url directement sur votre mini-app rack:

  # config/routes.rb
  Foo::Application.routes.draw do
    root :to => WelcomeApp
  end

  # lib/welcome_app.rb
  class WelcomeApp
    def self.call(env)
      [200, { 'Content-Type' => 'text/html' }, 'Hello World']
    end
  end

(N’oubliez pas de mettre le dossier lib dans l’autoload_path)

Un empilement de middlewares

Imaginez rails 3 comme une chaîne de middlewares, chacun ayant un travail bien précis à réaliser. Par exemple:

  • Parser la requête pour extraire le path, les params etc…
  • Gérer les cookies
  • Gérer la connexion à la base de données

Pour avoir un listing complet, en console:

  Rails.application.middleware

Pas moins de 18 middlewares sont déjà chargés de base.

Tous agissent de façon autonome, ce qui garantit une grande modularité et granularité. Par exemple si vous souhaitez créer une application web qui aura juste quelques contrôleurs et qui ne sauve pas de données en base, vous pouvez charger uniquement ce dont vous avez besoin dans votre config/application.rb.

Par défaut à la création d’une application rails 3 on a:

  require 'rails/all'

Ce qui nous charge les middlewares suivants:

[ActionDispatch::Static, Rack::Lock, ActiveSupport::Cache::Strategy::LocalCache, Rack::Runtime, Rails::Rack::Logger, ActionDispatch::ShowExceptions, ActionDispatch::RemoteIp, Rack::Sendfile, ActionDispatch::Callbacks, ActiveRecord::ConnectionAdapters::ConnectionManagement, ActiveRecord::QueryCache, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, ActionDispatch::ParamsParser, Rack::MethodOverride, ActionDispatch::Head, ActionDispatch::BestStandardsSupport]

Si on décide de charger uniquement action_controller:

  require "action_controller/railtie"
[ActionDispatch::Static, Rack::Lock, ActiveSupport::Cache::Strategy::LocalCache, Rack::Runtime, Rails::Rack::Logger, ActionDispatch::ShowExceptions, ActionDispatch::RemoteIp, Rack::Sendfile, ActionDispatch::Callbacks, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, ActionDispatch::ParamsParser, Rack::MethodOverride, ActionDispatch::Head, ActionDispatch::BestStandardsSupport]

Les deux middlewares ActiveRecord::ConnectionAdapters::ConnectionManagement et ActiveRecord::QueryCache ne sont plus chargés.

Dans notre prochain article sur rack nous verrons comment créer son propre middleware.

L’équipe Synbioz.

Libres d’être ensemble.