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

This commit is contained in:
Konstantin Haase 2011-09-01 11:09:41 -06:00
commit a37e6f7f62
3 changed files with 144 additions and 4 deletions

View File

@ -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 File

@ -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 File

@ -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"