diff --git a/README.fr.rdoc b/README.fr.rdoc index b423a44f..0c8bec4c 100644 --- a/README.fr.rdoc +++ b/README.fr.rdoc @@ -146,6 +146,25 @@ Vous pouvez facilement définir vos propres conditions : "Désolé, vous avez perdu." end +Utilisez un splat (caractère joker) dans le cas d'une condition qui prend +plusieurs valeurs : + + set(:auth) do |*roles| # <- ici on utilise un splat + condition do + unless logged_in? && roles.any? {|role| current_user.in_role? role } + redirect "/login/", 303 + end + end + end + + get "/mon/compte/", :auth => [:user, :admin] do + "Informations sur votre compte" + end + + get "/reserve/aux/admins/", :auth => :admin do + "Seuls les administrateurs sont acceptés ici !" + end + === Valeurs de retour La valeur renvoyée par le bloc correspondant à une route constitue le corps de @@ -175,6 +194,10 @@ Avec cela, on peut facilement implémenter un streaming par exemple : get('/') { Stream.new } +Vous pouvez aussi utiliser le helper +stream+ (présenté un peu plus loin) pour +éviter la surcharge et intégrer le traitement relatif au streaming dans le bloc +de code de la route. + === Masques de route spécifiques Comme cela a été vu auparavant, Sinatra offre la possibilité d'utiliser des @@ -840,6 +863,56 @@ retour et les entêtes : Comme +body+, +headers+ et +status+ peuvent être utilisés sans arguments pour accéder à leurs valeurs. +=== Faire du streaming + +Il y a des cas où vous voulez commencer à renvoyer des données pendant que +vous êtes en train de générer le reste de la réponse. Dans les cas les plus +extrèmes, vous souhaitez continuer à envoyer des données tant que le client +n'abandonne pas la connection. Vous pouvez alors utiliser le helper +stream+ +pour éviter de créer votre propre système : + + get '/' do + stream do |out| + out << "Ca va être hallu -\n" + sleep 0.5 + out << " (attends la suite) \n" + sleep 1 + out << "- cinant !\n" + end + end + +Cela permet d'implémenter des API de streaming ou de +{Server Sent Events}[http://dev.w3.org/html5/eventsource/] et peut servir de +base pour des {WebSockets}[http://en.wikipedia.org/wiki/WebSocket]. Vous +pouvez aussi l'employer pour augmenter le débit quand une partie du contenu +provient d'une resource lente. + +Le fonctionnement du streaming, notamment le nombre de requêtes simultanées, +dépend énormément du serveur web utilisé. Certains ne prennent pas du tout en +charge le streaming (WEBRick par exemple). Lorsque le serveur ne gère pas le +streaming, la partie body de la réponse sera envoyée au client en une seule +fois, après que l'exécution du bloc passé au helper +stream+ sera terminée. + +En utilisant le helper +stream+ avec le paramètre +false+, il n'appelera pas +la méthode +close+ du flux, vous laissant la possibilité de le fermer à tout +moment au cours de l'exécution. Ceci ne fonctionne qu'avec les serveurs +evented (ie non threadés) tels que Thin et Rainbows. Les autres serveurs +fermeront malgré tout le flux. + + set :server, :thin + connections = [] + + get '/' do + # conserve le flux ouvert + stream(false) { |out| connections << out } + end + + post '/' do + # écrit dans tous les flux ouverts + connections.each { |out| out << params[:message] << "\n" } + "message sent" + end + === Journalisation (Logging) Dans le contexte de la requête, la méthode utilitaire +logger+ expose une @@ -962,7 +1035,7 @@ Si vous utilisez la méthode +expires+ pour définir l'entête correspondant, expires 500, :public, :must_revalidate end -Pour utiliser correctement les caches, vous devriez utiliser +etag+ et +Pour utiliser correctement les caches, vous devriez utiliser +etag+ ou +last_modified+. Il est recommandé d'utiliser ces méthodes *avant* de faire d'importantes modifications, car elles vont immédiatement déclencher la réponse si le client a déjà la version courante dans son cache : @@ -981,7 +1054,7 @@ Il est également possible d'utiliser un Ces méthodes ne sont pas chargées de mettre des données en cache, mais elles fournissent les informations nécessaires pour votre cache. Si vous êtes à la -recherche de solutions rapides de cache, essayez +recherche de solutions rapides pour un reverse-proxy de cache, essayez {rack-cache}[http://rtomayko.github.com/rack-cache/] : require "rack/cache" @@ -1106,6 +1179,38 @@ Vous pouvez également lui passer un nom de fichier : "enregistre-le !" end +=== Gérer Date et Time + +Sinatra fourni un helper +time_for+ pour convertir une valeur donnée en +objet +Time+. Il peut aussi faire la conversion à partir d'objets +DateTime+, ++Date+ ou de classes similaires. + + get '/' do + pass if Time.now > time_for('Dec 23, 2012') + "encore temps" + end + +Cette méthode est utilisée en interne par +expires+, +last_modified+ et +consorts. Par conséquent, vous pouvez très facilement étendre le +fonctionnement de ces méthodes en surchargeant le helper +time_for+ dans +votre application : + + helpers do + def time_for(value) + case value + when :yesterday then Time.now - 24*60*60 + when :tomorrow then Time.now + 24*60*60 + else super + end + end + end + + get '/' do + last_modified :yesterday + expires :tomorrow + "salut" + end + === Chercher les fichiers de templates La méthode find_template est utilisée pour trouver les fichiers de @@ -1291,6 +1396,9 @@ Vous pouvez accéder à ces paramètres via settings : Activé par défaut pour le style classique, désactivé pour le style modulaire. +[threaded] à définir à +true+ pour indiquer à Thin d'utiliser + EventMachine.defer pour traiter la requête. + [views] dossier des vues. == Gérer les erreurs