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:
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
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)
Imaginez rails 3 comme une chaîne de middlewares, chacun ayant un travail bien précis à réaliser. Par exemple:
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.