Permalink
Browse files

Merge branch 'master' of github.com:sinatra/sinatra

  • Loading branch information...
2 parents b7b2890 + d03d1d9 commit a37e6f7f62fca69520ce717eadb78a1179f7c80f @rkh rkh committed Sep 1, 2011
Showing with 144 additions and 4 deletions.
  1. +32 −0 README.es.rdoc
  2. +110 −2 README.fr.rdoc
  3. +2 −2 README.rdoc
View
@@ -1157,6 +1157,38 @@ También podés pasarle un nombre de archivo:
"guardalo!"
end
+=== Fecha y Hora
+
+Sinatra pone a tu disposición el helper +time_for+, que genera un objeto +Time+
+a partir del valor que recibe como argumento. Este valor puede ser un
++String+, pero también es capaz de convertir objetos +DateTime+, +Date+ y de
+otras clases similares.
+
+ get '/' do
+ pass if Time.now > time_for('Dec 23, 2012')
+ "todavía hay tiempo"
+ end
+
+Este método es usado internamente por métodos como +expires+ y +last_modified+,
+entre otros. Por lo tanto, es posible extender el comportamiento de estos
+métodos sobreescribiendo +time_for+ en tu aplicación:
+
+ helpers do
+ def time_for(value)
+ case value
+ when :ayer then Time.now - 24*60*60
+ when :mañana then Time.now + 24*60*60
+ else super
+ end
+ end
+ end
+
+ get '/' do
+ last_modified :ayer
+ expires :mañana
+ "hola"
+ end
+
=== Buscando los Archivos de las Plantillas
El helper <tt>find_template</tt> se utiliza para encontrar los archivos de las
View
@@ -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 <tt>find_template</tt> est utilisée pour trouver les fichiers de
@@ -1291,6 +1396,9 @@ Vous pouvez accéder à ces paramètres via <tt>settings</tt> :
Activé par défaut pour le style classique, désactivé pour
le style modulaire.
+[threaded] à définir à +true+ pour indiquer à Thin d'utiliser
+ <tt>EventMachine.defer</tt> pour traiter la requête.
+
[views] dossier des vues.
== Gérer les erreurs
View
@@ -980,7 +980,7 @@ If you are using the +expires+ helper to set the corresponding header,
expires 500, :public, :must_revalidate
end
-To properly use caches, you should consider using +etag+ and +last_modified+.
+To properly use caches, you should consider using +etag+ or +last_modified+.
It is recommended to call those helpers *before* doing heavy lifting, as they
will immediately flush a response if the client already has the current
version in its cache:
@@ -998,7 +998,7 @@ It is also possible to use a
etag @article.sha1, :weak
These helpers will not do any caching for you, but rather feed the necessary
-information to your cache. If you are looking for a quick caching solutions,
+information to your cache. If you are looking for a quick reverse-proxy caching solution,
try {rack-cache}[http://rtomayko.github.com/rack-cache/]:
require "rack/cache"

0 comments on commit a37e6f7

Please sign in to comment.