sinatra 1.3.0.d → 1.3.0.e
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sinatra might be problematic. Click here for more details.
- data/.gitignore +6 -0
- data/.yardopts +4 -0
- data/CHANGES +80 -3
- data/Gemfile +18 -12
- data/README.de.rdoc +189 -381
- data/README.es.rdoc +193 -316
- data/README.fr.rdoc +327 -475
- data/README.jp.rdoc +7 -1
- data/README.rdoc +132 -101
- data/README.ru.rdoc +3 -3
- data/README.zh.rdoc +2 -2
- data/Rakefile +19 -27
- data/lib/sinatra/base.rb +186 -262
- data/lib/sinatra/version.rb +3 -0
- data/sinatra.gemspec +12 -128
- data/test/base_test.rb +1 -1
- data/test/builder_test.rb +1 -1
- data/test/coffee_test.rb +1 -1
- data/test/creole_test.rb +1 -1
- data/test/delegator_test.rb +9 -7
- data/test/encoding_test.rb +1 -1
- data/test/erb_test.rb +1 -1
- data/test/extensions_test.rb +1 -1
- data/test/filter_test.rb +7 -4
- data/test/haml_test.rb +1 -1
- data/test/helper.rb +16 -1
- data/test/helpers_test.rb +12 -1
- data/test/less_test.rb +1 -1
- data/test/liquid_test.rb +1 -1
- data/test/mapped_error_test.rb +44 -1
- data/test/markaby_test.rb +1 -1
- data/test/markdown_test.rb +1 -1
- data/test/middleware_test.rb +1 -1
- data/test/nokogiri_test.rb +1 -1
- data/test/radius_test.rb +1 -1
- data/test/rdoc_test.rb +2 -2
- data/test/readme_test.rb +136 -0
- data/test/request_test.rb +1 -1
- data/test/response_test.rb +13 -3
- data/test/result_test.rb +3 -3
- data/test/route_added_hook_test.rb +1 -1
- data/test/routing_test.rb +9 -2
- data/test/sass_test.rb +1 -1
- data/test/scss_test.rb +1 -1
- data/test/server_test.rb +1 -1
- data/test/settings_test.rb +55 -22
- data/test/sinatra_test.rb +1 -1
- data/test/slim_test.rb +1 -1
- data/test/static_test.rb +22 -1
- data/test/templates_test.rb +1 -1
- data/test/textile_test.rb +1 -1
- metadata +47 -59
- data/lib/sinatra/rack.rb +0 -44
data/README.fr.rdoc
CHANGED
@@ -1,22 +1,22 @@
|
|
1
1
|
= Sinatra
|
2
|
-
<i>Attention: Ce document correspond à la traduction de la version anglaise et
|
2
|
+
<i>Attention : Ce document correspond à la traduction de la version anglaise et
|
3
3
|
il n'est peut être plus à jour.</i>
|
4
4
|
|
5
5
|
Sinatra est un DSL pour créer rapidement des applications web en Ruby et sans
|
6
|
-
effort:
|
6
|
+
effort :
|
7
7
|
|
8
8
|
# mon_application.rb
|
9
9
|
require 'sinatra'
|
10
10
|
get '/' do
|
11
|
-
'Bonjour
|
11
|
+
'Bonjour le monde !'
|
12
12
|
end
|
13
13
|
|
14
|
-
Installez
|
14
|
+
Installez la gem et lancez avec :
|
15
15
|
|
16
16
|
gem install sinatra
|
17
17
|
ruby -rubygems mon_application.rb
|
18
18
|
|
19
|
-
Le résultat est visible sur: http://localhost:4567
|
19
|
+
Le résultat est visible sur : http://localhost:4567
|
20
20
|
|
21
21
|
Il est également recommandé d'exécuter <tt>gem install thin</tt>, que Sinatra
|
22
22
|
utilisera si disponible.
|
@@ -25,7 +25,7 @@ utilisera si disponible.
|
|
25
25
|
|
26
26
|
Dans Sinatra, une route est une méthode HTTP couplée à un masque (pattern)
|
27
27
|
URL.
|
28
|
-
Chaque route est associée à un bloc:
|
28
|
+
Chaque route est associée à un bloc :
|
29
29
|
|
30
30
|
get '/' do
|
31
31
|
.. montrer quelque chose ..
|
@@ -55,23 +55,23 @@ Les routes sont comparées dans l'ordre où elles ont été définies. La premi
|
|
55
55
|
route qui correspond à la requête est invoquée.
|
56
56
|
|
57
57
|
Les masques peuvent inclure des paramètres nommés, accessibles par
|
58
|
-
l'intermédiaire du hash <tt>params</tt
|
58
|
+
l'intermédiaire du hash <tt>params</tt> :
|
59
59
|
|
60
60
|
get '/bonjour/:nom' do
|
61
61
|
# répond aux requêtes "GET /bonjour/foo" et "GET /bonjour/bar"
|
62
62
|
# params[:nom] est 'foo' ou 'bar'
|
63
|
-
"Bonjour #{params[:nom]}!"
|
63
|
+
"Bonjour #{params[:nom]} !"
|
64
64
|
end
|
65
65
|
|
66
66
|
Vous pouvez aussi les nommer directement dans les paramètres du bloc comme
|
67
|
-
ceci:
|
67
|
+
ceci :
|
68
68
|
|
69
69
|
get '/bonjour/:nom' do |n|
|
70
|
-
"Bonjour #{n}!"
|
70
|
+
"Bonjour #{n} !"
|
71
71
|
end
|
72
72
|
|
73
73
|
Une route peut contenir un splat (caractère joker), accessible par
|
74
|
-
l'intermédiaire de la liste <tt>params[:splat]</tt
|
74
|
+
l'intermédiaire de la liste <tt>params[:splat]</tt> :
|
75
75
|
|
76
76
|
get '/dire/*/a/*' do
|
77
77
|
# répondrait à /dire/bonjour/a/monde
|
@@ -83,22 +83,22 @@ l'intermédiaire de la liste <tt>params[:splat]</tt>:
|
|
83
83
|
params[:splat] # => ["chemin/vers/fichier", "xml"]
|
84
84
|
end
|
85
85
|
|
86
|
-
Une route peut s'exprimer avec une Expression Régulière:
|
86
|
+
Une route peut s'exprimer avec une Expression Régulière :
|
87
87
|
|
88
88
|
get %r{/bonjour/([\w]+)} do
|
89
|
-
"Bonjour, #{params[:captures].first}!"
|
89
|
+
"Bonjour, #{params[:captures].first} !"
|
90
90
|
end
|
91
91
|
|
92
|
-
Là aussi on peut utiliser les paramètres de bloc:
|
92
|
+
Là aussi on peut utiliser les paramètres de bloc :
|
93
93
|
|
94
94
|
get %r{/bonjour/([\w]+)} do |c|
|
95
|
-
"Bonjour, #{c}!"
|
95
|
+
"Bonjour, #{c} !"
|
96
96
|
end
|
97
97
|
|
98
98
|
=== Conditions
|
99
99
|
|
100
100
|
Les routes peuvent définir toutes sortes de conditions, comme par exemple le
|
101
|
-
"user agent":
|
101
|
+
"user agent" :
|
102
102
|
|
103
103
|
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
|
104
104
|
"Vous utilisez Songbird version #{params[:agent][0]}"
|
@@ -108,10 +108,10 @@ Les routes peuvent définir toutes sortes de conditions, comme par exemple le
|
|
108
108
|
# Correspond à tous les autres navigateurs
|
109
109
|
end
|
110
110
|
|
111
|
-
Les autres conditions disponibles sont +host_name+ et +provides
|
111
|
+
Les autres conditions disponibles sont +host_name+ et +provides+ :
|
112
112
|
|
113
113
|
get '/', :host_name => /^admin\./ do
|
114
|
-
"Zone Administrateur, Accès
|
114
|
+
"Zone Administrateur, Accès refusé !"
|
115
115
|
end
|
116
116
|
|
117
117
|
get '/', :provides => 'html' do
|
@@ -122,12 +122,12 @@ Les autres conditions disponibles sont +host_name+ et +provides+:
|
|
122
122
|
builder :feed
|
123
123
|
end
|
124
124
|
|
125
|
-
Vous pouvez facilement définir vos propres conditions:
|
125
|
+
Vous pouvez facilement définir vos propres conditions :
|
126
126
|
|
127
127
|
set(:probability) { |value| condition { rand <= value } }
|
128
128
|
|
129
129
|
get '/gagner_une_voiture', :probability => 0.1 do
|
130
|
-
"Vous avez
|
130
|
+
"Vous avez gagné !"
|
131
131
|
end
|
132
132
|
|
133
133
|
get '/gagner_une_voiture' do
|
@@ -143,11 +143,11 @@ comme dans les exemples précédents. Cependant, d'autres valeurs sont
|
|
143
143
|
acceptées.
|
144
144
|
|
145
145
|
Vous pouvez renvoyer n'importe quel objet qui soit une réponse Rack valide, un
|
146
|
-
corps de réponse Rack ou un code retour HTTP:
|
146
|
+
corps de réponse Rack ou un code retour HTTP :
|
147
147
|
|
148
|
-
* Un tableau de 3 éléments: <tt>[code retour (Fixnum), entêtes (Hash), corps
|
148
|
+
* Un tableau de 3 éléments : <tt>[code retour (Fixnum), entêtes (Hash), corps
|
149
149
|
de réponse (répondant à #each)]</tt>
|
150
|
-
* Un tableau de 2 élements: <tt>[code retour (Fixnum), corps de réponse
|
150
|
+
* Un tableau de 2 élements : <tt>[code retour (Fixnum), corps de réponse
|
151
151
|
(répondant à #each)]</tt>
|
152
152
|
* Un objet qui répond à <tt>#each</tt> et qui ne transmet que des chaînes de
|
153
153
|
caractères au bloc fourni
|
@@ -209,456 +209,301 @@ Ou bien en utilisant la forme négative :
|
|
209
209
|
|
210
210
|
Par défaut, le dossier <tt>./public</tt> est utilisé pour servir les fichiers
|
211
211
|
statiques. Vous pouvez changer ce dossier pour un autre nom grâce au paramètre
|
212
|
-
<tt>:public</tt
|
212
|
+
<tt>:public</tt> :
|
213
213
|
|
214
214
|
set :public, File.dirname(__FILE__) + '/statique'
|
215
215
|
|
216
216
|
Notez que le nom du dossier public n'est pas inclus dans l'URL. Un fichier
|
217
|
-
sous <tt>./public/css/style.css</tt> est appelé avec l'URL :
|
218
|
-
<tt>http://exemple.com/css/style.css</tt>.
|
217
|
+
sous <tt>./public/css/style.css</tt> est appelé avec l'URL : <tt>http://exemple.com/css/style.css</tt>.
|
219
218
|
|
220
219
|
== Vues / Templates
|
221
220
|
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
set :views, File.dirname(__FILE__) + '/templates'
|
226
|
-
|
227
|
-
Il est important de noter que les templates sont toujours référencés
|
228
|
-
sous forme de symboles, même s'il s'agit d'un sous-répertoire (dans ce
|
229
|
-
cas, utilisez <tt>:'sous_repertoire/template'</tt>). Vous devez utiliser un
|
230
|
-
symbole car les méthodes de rendu évalueront le contenu des chaînes de
|
231
|
-
caractères au lieu de les considérer comme un chemin vers un fichier.
|
232
|
-
|
233
|
-
=== Templates Haml
|
234
|
-
|
235
|
-
Le gem <tt>haml</tt> est nécessaire pour utiliser la fonction de rendu Haml:
|
236
|
-
|
237
|
-
# Chargez la bibliothèque haml dans votre application
|
238
|
-
require 'haml'
|
221
|
+
Chaque langage de template est exposé via sa propre méthode de rendu.
|
222
|
+
Ces méthodes retournent tout simplement une chaîne de caractères.
|
239
223
|
|
240
224
|
get '/' do
|
241
|
-
|
225
|
+
erb :index
|
242
226
|
end
|
243
227
|
|
244
|
-
|
245
|
-
|
246
|
-
{Les options de Haml}[http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#options]
|
247
|
-
peuvent se manipuler directement avec la configuration de Sinatra,
|
248
|
-
voir {Options et Configuration}[http://www.sinatrarb.com/configuration.html],
|
249
|
-
et supportent aussi la réécriture (surcharge) comme dans cet exemple.
|
228
|
+
Ceci effectue le rendu de <tt>views/index.erb</tt>.
|
250
229
|
|
251
|
-
|
230
|
+
Plutôt que le nom d'un template, vous pouvez directement passer le contenu du
|
231
|
+
template :
|
252
232
|
|
253
233
|
get '/' do
|
254
|
-
|
234
|
+
code = "<%= Time.now %>"
|
235
|
+
erb code
|
255
236
|
end
|
256
237
|
|
257
|
-
|
258
|
-
=== Templates Erb
|
259
|
-
|
260
|
-
# Chargez la bibliothèque erb dans votre application
|
261
|
-
require 'erb'
|
238
|
+
Les templates prennent un second paramètre, un hash d'options :
|
262
239
|
|
263
240
|
get '/' do
|
264
|
-
erb :index
|
241
|
+
erb :index, :layout => :post
|
265
242
|
end
|
266
243
|
|
267
|
-
|
244
|
+
Cecie effectue le rendu de <tt>views/index.erb</tt> embarqué dans
|
245
|
+
<tt>views/post.erb</tt> (<tt>views/layout.erb</tt> est la valeur par défaut
|
246
|
+
si ce fichier existe).
|
268
247
|
|
269
|
-
|
270
|
-
|
271
|
-
Le gem <tt>erubis</tt> est nécessaire pour utiliser la fonction de rendu
|
272
|
-
erubis:
|
273
|
-
|
274
|
-
# Chargez la bibliothèque erubis dans votre application
|
275
|
-
require 'erubis'
|
248
|
+
Toute option que Sinatra ne comprends pas sera passée au moteur de rendu :
|
276
249
|
|
277
250
|
get '/' do
|
278
|
-
|
251
|
+
haml :index, :format => :html5
|
279
252
|
end
|
280
253
|
|
281
|
-
|
282
|
-
|
283
|
-
Il est également possible de remplacer Erb par Erubis:
|
254
|
+
Vous pouvez également définir des options par langage de template de façon
|
255
|
+
générale :
|
284
256
|
|
285
|
-
|
286
|
-
Tilt.register :erb, Tilt[:erubis]
|
257
|
+
set :haml, :format => html5
|
287
258
|
|
288
259
|
get '/' do
|
289
|
-
|
260
|
+
haml :index
|
290
261
|
end
|
291
262
|
|
292
|
-
|
263
|
+
Les options passées à la méthode de rendu prennent le pas sur les options
|
264
|
+
définies au moyen de +set+.
|
293
265
|
|
294
|
-
|
266
|
+
Options disponibles :
|
295
267
|
|
296
|
-
|
297
|
-
|
268
|
+
[locals]
|
269
|
+
Liste de variables locales passées au document. Pratique pour les vues
|
270
|
+
partielles.
|
271
|
+
Exemple : <tt>erb "<%= foo %>", :locals => {:foo => "bar"}</tt>.
|
298
272
|
|
299
|
-
|
300
|
-
|
273
|
+
[default_encoding]
|
274
|
+
Encodage de caractères à utiliser en cas d'incertitude. Par défaut, c'est
|
275
|
+
<tt>settings.default_encoding</tt>.
|
301
276
|
|
302
|
-
|
303
|
-
|
304
|
-
|
277
|
+
[views]
|
278
|
+
Dossier de vues dans lequel chercher les templates. Par défaut
|
279
|
+
<tt>settings.views</tt>.
|
305
280
|
|
306
|
-
|
281
|
+
[layout]
|
282
|
+
S'il faut ou non utiliser un +layout+ (+true+ or +false+). Indique le
|
283
|
+
template à utiliser lorsque c'est un Symbol. Exemple : <tt>erb :index,
|
284
|
+
:layout => request.xhr?</tt>.
|
307
285
|
|
308
|
-
|
286
|
+
[content_type]
|
287
|
+
Content-Type que le template produit, dépend par défaut du langage de
|
288
|
+
template.
|
309
289
|
|
310
|
-
|
311
|
-
|
290
|
+
[scope]
|
291
|
+
Contexte sous lequel effectuer le rendu du template. Par défaut il s'agit
|
292
|
+
de l'instance de l'application. Si vous changez cela, les variables
|
293
|
+
d'instance et les méthodes utilitaires ne seront pas disponibles.
|
312
294
|
|
313
|
-
|
314
|
-
|
295
|
+
[layout_engine]
|
296
|
+
Moteur de rendu à utiliser pour le +layout+. Utile pour les langages ne
|
297
|
+
supportant pas les +layouts+. Il s'agit par défaut du moteur utilisé pour
|
298
|
+
le rendu du template. Exemple : <tt>set :rdoc, :layout_engine => :erb</tt>
|
315
299
|
|
316
|
-
|
317
|
-
|
318
|
-
end
|
300
|
+
Les templates sont supposés se trouver directement dans le dossier
|
301
|
+
<tt>./views</tt>. Pour utiliser un dossier de vues différent :
|
319
302
|
|
320
|
-
|
321
|
-
|
322
|
-
=== Templates Sass
|
303
|
+
set :views, settings.root + '/templates'
|
323
304
|
|
324
|
-
|
325
|
-
de
|
305
|
+
Il est important de noter que les templates sont toujours référencés
|
306
|
+
sous forme de symboles, même s'il s'agit d'un sous-répertoire (dans ce
|
307
|
+
cas, utilisez <tt>:'sous_repertoire/template'</tt>). Vous devez utiliser un
|
308
|
+
symbole car les méthodes de rendu évalueront le contenu des chaînes de
|
309
|
+
caractères au lieu de les considérer comme un chemin vers un fichier.
|
326
310
|
|
327
|
-
|
328
|
-
require 'sass'
|
311
|
+
=== Langages de template disponibles
|
329
312
|
|
330
|
-
|
331
|
-
|
332
|
-
|
313
|
+
Certains langages ont plusieurs implémentations. Pour préciser l'implémentation
|
314
|
+
à utiliser (et garantir l'aspect thread-safe), vous devriez simplement la
|
315
|
+
charger au préalable :
|
333
316
|
|
334
|
-
|
317
|
+
require 'rdiscount' # ou require 'bluecloth'
|
318
|
+
get('/') { markdown :index }
|
335
319
|
|
336
|
-
|
337
|
-
peuvent se manipuler directement avec la configuration de Sinatra,
|
338
|
-
voir {Options et Configuration}[http://www.sinatrarb.com/configuration.html],
|
339
|
-
et supportent aussi la réécriture (surcharge) comme dans cet exemple.
|
320
|
+
=== Templates Haml
|
340
321
|
|
341
|
-
|
322
|
+
Dépendances:: {haml}[http://haml-lang.com/]
|
323
|
+
Extensions de fichier:: <tt>.haml</tt>
|
324
|
+
Exemple:: <tt>haml :index, :format => :html5</tt>
|
342
325
|
|
343
|
-
|
344
|
-
sass :stylesheet, :style => :expanded # surcharge
|
345
|
-
end
|
326
|
+
=== Templates Erb
|
346
327
|
|
347
|
-
|
328
|
+
Dépendances:: {erubis}[http://www.kuwata-lab.com/erubis/] ou
|
329
|
+
erb (inclus avec Ruby)
|
330
|
+
Extensions de fichier:: <tt>.erb</tt>, <tt>.rhtml</tt> or <tt>.erubis</tt>
|
331
|
+
(Erubis seulement)
|
332
|
+
Exemple:: <tt>erb :index</tt>
|
348
333
|
|
349
|
-
|
350
|
-
de rendu Scss:
|
334
|
+
=== Templates Builder
|
351
335
|
|
352
|
-
|
353
|
-
|
336
|
+
Dépendances:: {builder}[http://builder.rubyforge.org/]
|
337
|
+
Extensions de fichier:: <tt>.builder</tt>
|
338
|
+
Exemple:: <tt>builder { |xml| xml.em "hi" }</tt>
|
354
339
|
|
355
|
-
|
356
|
-
scss :stylesheet
|
357
|
-
end
|
340
|
+
Ce moteur accepte également un bloc pour des templates en ligne (voir exemple).
|
358
341
|
|
359
|
-
|
342
|
+
=== Templates Nokogiri
|
360
343
|
|
361
|
-
{
|
362
|
-
|
363
|
-
|
364
|
-
et supportent aussi la réécriture (surcharge) comme dans cet exemple.
|
344
|
+
Dépendances:: {nokogiri}[http://nokogiri.org/]
|
345
|
+
Extensions de fichier:: <tt>.nokogiri</tt>
|
346
|
+
Exemple:: <tt>builder { |xml| xml.em "hi" }</tt>
|
365
347
|
|
366
|
-
|
348
|
+
Ce moteur accepte également un bloc pour des templates en ligne (voir exemple).
|
367
349
|
|
368
|
-
|
369
|
-
scss :stylesheet, :style => :expanded # surcharge
|
370
|
-
end
|
350
|
+
=== Templates Sass
|
371
351
|
|
372
|
-
|
352
|
+
Dépendances:: {sass}[http://sass-lang.com/]
|
353
|
+
Extensions de fichier:: <tt>.sass</tt>
|
354
|
+
Exemple:: <tt>sass :stylesheet, :style => :expanded</tt>
|
373
355
|
|
374
|
-
|
356
|
+
=== Templates SCSS
|
375
357
|
|
376
|
-
|
377
|
-
|
358
|
+
Dépendances:: {sass}[http://sass-lang.com/]
|
359
|
+
Extensions de fichier:: <tt>.scss</tt>
|
360
|
+
Exemple:: <tt>scss :stylesheet, :style => :expanded</tt>
|
378
361
|
|
379
|
-
|
380
|
-
less :stylesheet
|
381
|
-
end
|
362
|
+
=== Templates Less
|
382
363
|
|
383
|
-
|
364
|
+
Dépendances:: {less}[http://www.lesscss.org/]
|
365
|
+
Extensions de fichier:: <tt>.less</tt>
|
366
|
+
Exemple:: <tt>less :stylesheet</tt>
|
384
367
|
|
385
368
|
=== Templates Liquid
|
386
369
|
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
# Chargez la bibliothèque liquid dans votre application
|
391
|
-
require 'liquid'
|
392
|
-
|
393
|
-
get '/' do
|
394
|
-
liquid :index
|
395
|
-
end
|
396
|
-
|
397
|
-
Utilisera <tt>./views/index.liquid</tt>.
|
370
|
+
Dépendances:: {liquid}[http://www.liquidmarkup.org/]
|
371
|
+
Extensions de fichier:: <tt>.liquid</tt>
|
372
|
+
Exemple:: <tt>liquid :index, :locals => { :key => 'value' }</tt>
|
398
373
|
|
399
|
-
Comme vous ne pouvez
|
400
|
-
template Liquid,
|
401
|
-
locales:
|
402
|
-
|
403
|
-
liquid :index, :locals => { :key => 'value' }
|
374
|
+
Comme vous ne pouvez appeler de méthodes Ruby (autres que +yield+) dans un
|
375
|
+
template Liquid, vous aurez sûrement à lui passer des variables locales.
|
404
376
|
|
405
377
|
=== Templates Markdown
|
406
378
|
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
markdown :index
|
415
|
-
end
|
416
|
-
|
417
|
-
Utilisera <tt>./views/index.markdown</tt> (les extensions de fichier +md+ et
|
418
|
-
+mkd+ sont également acceptées).
|
379
|
+
Dépendances:: {rdiscount}[https://github.com/rtomayko/rdiscount],
|
380
|
+
{redcarpet}[https://github.com/tanoku/redcarpet],
|
381
|
+
{bluecloth}[http://deveiate.org/projects/BlueCloth],
|
382
|
+
{kramdown}[http://kramdown.rubyforge.org/] *ou*
|
383
|
+
{maruku}[http://maruku.rubyforge.org/]
|
384
|
+
Extensions de fichier:: <tt>.markdown</tt>, <tt>.mkd</tt> and <tt>.md</tt>
|
385
|
+
Exemple:: <tt>markdown :index, :layout_engine => :erb</tt>
|
419
386
|
|
420
387
|
Il n'est pas possible d'appeler des méthodes depuis markdown, ni même de lui
|
421
|
-
passer des variables locales. Par conséquent, il sera
|
422
|
-
|
388
|
+
passer des variables locales. Par conséquent, il sera souvent utilisé en
|
389
|
+
combinaison avec un autre moteur de rendu :
|
423
390
|
|
424
|
-
erb :
|
391
|
+
erb :overview, :locals => { :text => markdown(:introduction) }
|
425
392
|
|
426
393
|
Notez que vous pouvez également appeler la méthode +markdown+ au sein d'autres
|
427
|
-
templates:
|
428
|
-
|
429
|
-
%h1 Bonjour Depuis Haml!
|
430
|
-
%p= markdown(:salutations)
|
431
|
-
|
432
|
-
Comme vous ne pouvez pas faire d'appels Ruby au sein de Markdown, vous ne
|
433
|
-
pouvez pas utiliser des layouts écrits en Markdown. Il est toutefois possible
|
434
|
-
d'utiliser un autre moteur de rendu pour le layout en passant l'option
|
435
|
-
<tt>:layout_engine</tt> :
|
436
|
-
|
437
|
-
get '/' do
|
438
|
-
markdown :index, :layout_engine => :erb
|
439
|
-
end
|
440
|
-
|
441
|
-
Ceci utilisera <tt>./views/index.md</tt> avec <tt>./views/layout.erb</tt> pour
|
442
|
-
layout.
|
443
|
-
|
444
|
-
Souvenez vous que vous pouvez spécifier de telles options de rendu
|
445
|
-
globalement :
|
446
|
-
|
447
|
-
set :markdown, :layout_engine => :haml, :layout => :post
|
448
|
-
|
449
|
-
get '/' do
|
450
|
-
markdown :index
|
451
|
-
end
|
394
|
+
templates :
|
452
395
|
|
453
|
-
|
454
|
-
|
396
|
+
%h1 Hello From Haml !
|
397
|
+
%p= markdown(:greetings)
|
455
398
|
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
Tilt.register 'markdown', BlueClothTemplate
|
462
|
-
Tilt.register 'mkd', BlueClothTemplate
|
463
|
-
Tilt.register 'md', BlueClothTemplate
|
464
|
-
|
465
|
-
get '/' do
|
466
|
-
markdown :index
|
467
|
-
end
|
468
|
-
|
469
|
-
Utilisera <tt>./views/index.md</tt> avec BlueCloth.
|
399
|
+
Comme vous ne pouvez pas appeler de Ruby au sein de Markdown, vous ne pouvez
|
400
|
+
pas utiliser de +layouts+ écrits en Markdown. Toutefois, il est possible
|
401
|
+
d'utiliser un autre moteur de rendu pour le template que pour le +layout+ en
|
402
|
+
utilisant l'option <tt>:layout_engine</tt>.
|
470
403
|
|
471
404
|
=== Templates Textile
|
472
405
|
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
# Chargez la bibliothèqye redcloth dans votre application
|
477
|
-
require "redcloth"
|
478
|
-
|
479
|
-
get '/' do
|
480
|
-
textile :index
|
481
|
-
end
|
482
|
-
|
483
|
-
Utilisera <tt>./views/index.textile</tt>.
|
406
|
+
Dépendances:: {RedCloth}[http://redcloth.org/]
|
407
|
+
Extensions de fichier:: <tt>.textile</tt>
|
408
|
+
Exemple:: <tt>textile :index, :layout_engine => :erb</tt>
|
484
409
|
|
485
410
|
Il n'est pas possible d'appeler des méthodes depuis textile, ni même de lui
|
486
|
-
passer des variables locales. Par conséquent, il sera
|
487
|
-
|
411
|
+
passer des variables locales. Par conséquent, il sera souvent utilisé en
|
412
|
+
combinaison avec un autre moteur de rendu :
|
488
413
|
|
489
|
-
erb :
|
414
|
+
erb :overview, :locals => { :text => textile(:introduction) }
|
490
415
|
|
491
416
|
Notez que vous pouvez également appeler la méthode +textile+ au sein d'autres
|
492
|
-
templates:
|
493
|
-
|
494
|
-
%h1 Bonjour Depuis Haml!
|
495
|
-
%p= textile(:salutations)
|
417
|
+
templates :
|
496
418
|
|
497
|
-
|
498
|
-
|
499
|
-
d'utiliser un autre moteur de rendu pour le layout en passant l'option
|
500
|
-
<tt>:layout_engine</tt> :
|
419
|
+
%h1 Hello From Haml !
|
420
|
+
%p= textile(:greetings)
|
501
421
|
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
Ceci utilisera <tt>./views/index.textile</tt> avec <tt>./views/layout.erb</tt>
|
507
|
-
pour layout.
|
508
|
-
|
509
|
-
Souvenez vous que vous pouvez spécifier de telles options de rendu
|
510
|
-
globalement :
|
511
|
-
|
512
|
-
set :textile, :layout_engine => :haml, :layout => :post
|
513
|
-
|
514
|
-
get '/' do
|
515
|
-
textile :index
|
516
|
-
end
|
517
|
-
|
518
|
-
Ceci utilisera <tt>./views/index.textile</tt> (et tout autre template Textile)
|
519
|
-
avec <tt>./views/post.haml</tt> pour layout.
|
422
|
+
Comme vous ne pouvez pas appeler de Ruby au sein de Textile, vous ne pouvez
|
423
|
+
pas utiliser de +layouts+ écrits en Textile. Toutefois, il est possible
|
424
|
+
d'utiliser un autre moteur de rendu pour le template que pour le +layout+ en
|
425
|
+
utilisant l'option <tt>:layout_engine</tt>.
|
520
426
|
|
521
427
|
=== Templates RDoc
|
522
428
|
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
require "rdoc/markup/to_html"
|
527
|
-
|
528
|
-
get '/' do
|
529
|
-
rdoc :index
|
530
|
-
end
|
531
|
-
|
532
|
-
Utilisera <tt>./views/index.rdoc</tt>.
|
429
|
+
Dépendances:: {rdoc}[http://rdoc.rubyforge.org/]
|
430
|
+
Extensions de fichier:: <tt>.rdoc</tt>
|
431
|
+
Exemple:: <tt>textile :README, :layout_engine => :erb</tt>
|
533
432
|
|
534
433
|
Il n'est pas possible d'appeler des méthodes depuis rdoc, ni même de lui
|
535
|
-
passer des variables locales. Par conséquent, il sera
|
536
|
-
|
434
|
+
passer des variables locales. Par conséquent, il sera souvent utilisé en
|
435
|
+
combinaison avec un autre moteur de rendu :
|
537
436
|
|
538
|
-
erb :
|
437
|
+
erb :overview, :locals => { :text => rdoc(:introduction) }
|
539
438
|
|
540
439
|
Notez que vous pouvez également appeler la méthode +rdoc+ au sein d'autres
|
541
|
-
templates:
|
542
|
-
|
543
|
-
%h1 Bonjour Depuis Haml!
|
544
|
-
%p= rdoc(:salutations)
|
440
|
+
templates :
|
545
441
|
|
546
|
-
|
547
|
-
|
548
|
-
d'utiliser un autre moteur de rendu pour le layout en passant l'option
|
549
|
-
<tt>:layout_engine</tt> :
|
442
|
+
%h1 Hello From Haml !
|
443
|
+
%p= rdoc(:greetings)
|
550
444
|
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
Ceci utilisera <tt>./views/index.rdoc</tt> avec <tt>./views/layout.erb</tt>
|
556
|
-
pour layout.
|
557
|
-
|
558
|
-
Souvenez vous que vous pouvez spécifier de telles options de rendu
|
559
|
-
globalement :
|
560
|
-
|
561
|
-
set :rdoc, :layout_engine => :haml, :layout => :post
|
562
|
-
|
563
|
-
get '/' do
|
564
|
-
rdoc :index
|
565
|
-
end
|
566
|
-
|
567
|
-
Ceci utilisera <tt>./views/index.rdoc</tt> (et tout autre template RDoc)
|
568
|
-
avec <tt>./views/post.haml</tt> pour layout.
|
445
|
+
Comme vous ne pouvez pas appeler de Ruby au sein de RDoc, vous ne pouvez
|
446
|
+
pas utiliser de +layouts+ écrits en RDoc. Toutefois, il est possible
|
447
|
+
d'utiliser un autre moteur de rendu pour le template que pour le +layout+ en
|
448
|
+
utilisant l'option <tt>:layout_engine</tt>.
|
569
449
|
|
570
450
|
=== Templates Radius
|
571
451
|
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
require 'radius'
|
576
|
-
|
577
|
-
get '/' do
|
578
|
-
radius :index
|
579
|
-
end
|
452
|
+
Dépendances:: {radius}[http://radius.rubyforge.org/]
|
453
|
+
Extensions de fichier:: <tt>.radius</tt>
|
454
|
+
Exemple:: <tt>radius :index, :locals => { :key => 'value' }</tt>
|
580
455
|
|
581
|
-
|
582
|
-
|
583
|
-
Comme vous ne pouvez pas appeler des méthodes Ruby (excepté +yield+) dans un
|
584
|
-
template Radius, il sera toujours nécessaire de lui passer des variables
|
585
|
-
locales:
|
586
|
-
|
587
|
-
radius :index, :locals => { :key => 'value' }
|
456
|
+
Comme vous ne pouvez pas appeler de méthodes Ruby depuis un template Radius,
|
457
|
+
vous aurez sûrement à lui passer des variables locales
|
588
458
|
|
589
459
|
=== Templates Markaby
|
590
460
|
|
591
|
-
|
461
|
+
Dépendances:: {markaby}[http://markaby.github.com/]
|
462
|
+
Extensions de fichier:: <tt>.mab</tt>
|
463
|
+
Exemple:: <tt>markaby { h1 "Bienvenue !" }</tt>
|
592
464
|
|
593
|
-
|
594
|
-
require 'markaby'
|
595
|
-
|
596
|
-
get '/' do
|
597
|
-
markaby :index
|
598
|
-
end
|
599
|
-
|
600
|
-
Utilisera <tt>./views/index.mab</tt>.
|
601
|
-
|
602
|
-
Vous pouvez également utiliser Markaby en ligne :
|
603
|
-
|
604
|
-
get '/' do
|
605
|
-
markaby { h1 "Salut !" }
|
606
|
-
end
|
465
|
+
Ce moteur accepte également un bloc pour des templates en ligne (voir exemple).
|
607
466
|
|
608
467
|
=== Templates Slim
|
609
468
|
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
require 'slim'
|
614
|
-
|
615
|
-
get '/' do
|
616
|
-
slim :index
|
617
|
-
end
|
618
|
-
|
619
|
-
Utilisera <tt>./views/index.slim</tt>.
|
469
|
+
Dépendances:: {slim}[http://slim-lang.com/]
|
470
|
+
Extensions de fichier:: <tt>.slim</tt>
|
471
|
+
Exemple:: <tt>slim :index</tt>
|
620
472
|
|
621
473
|
=== Templates Creole
|
622
474
|
|
623
|
-
|
624
|
-
|
475
|
+
Dépendances:: {creole}[https://github.com/minad/creole]
|
476
|
+
Extensions de fichier:: <tt>.creole</tt>
|
477
|
+
Exemple:: <tt>creole :wiki, :layout_engine => :erb</tt>
|
625
478
|
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
get '/' do
|
630
|
-
creole :index
|
631
|
-
end
|
632
|
-
|
633
|
-
Utilisera <tt>./views/index.creole</tt>.
|
634
|
-
|
635
|
-
=== Templates CoffeeScript
|
479
|
+
Il n'est pas possible d'appeler des méthodes depuis creole, ni même de lui
|
480
|
+
passer des variables locales. Par conséquent, il sera souvent utilisé en
|
481
|
+
combinaison avec un autre moteur de rendu :
|
636
482
|
|
637
|
-
|
638
|
-
options suivantes permettant l'exécution de Java script :
|
483
|
+
erb :overview, :locals => { :text => creole(:introduction) }
|
639
484
|
|
640
|
-
|
641
|
-
|
642
|
-
* le gem +therubyracer+
|
485
|
+
Notez que vous pouvez également appeler la méthode +creole+ au sein d'autres
|
486
|
+
templates :
|
643
487
|
|
644
|
-
|
645
|
-
|
488
|
+
%h1 Hello From Haml !
|
489
|
+
%p= creole(:greetings)
|
646
490
|
|
647
|
-
|
491
|
+
Comme vous ne pouvez pas appeler de Ruby au sein de Creole, vous ne pouvez
|
492
|
+
pas utiliser de +layouts+ écrits en Creole. Toutefois, il est possible
|
493
|
+
d'utiliser un autre moteur de rendu pour le template que pour le +layout+ en
|
494
|
+
utilisant l'option <tt>:layout_engine</tt>.
|
648
495
|
|
649
|
-
|
650
|
-
require 'coffee-script'
|
651
|
-
|
652
|
-
get '/application.js' do
|
653
|
-
coffee :application
|
654
|
-
end
|
496
|
+
=== Templates CoffeeScript
|
655
497
|
|
656
|
-
|
498
|
+
Dépendances:: {coffee-script}[https://github.com/josh/ruby-coffee-script]
|
499
|
+
et un {moyen d'exécuter javascript}[https://github.com/sstephenson/execjs/blob/master/README.md#readme]
|
500
|
+
Extensions de fichier:: <tt>.coffee</tt>
|
501
|
+
Exemple:: <tt>coffee :index</tt>
|
657
502
|
|
658
503
|
=== Templates embarqués
|
659
504
|
|
660
505
|
get '/' do
|
661
|
-
haml '%div.title Bonjour
|
506
|
+
haml '%div.title Bonjour le monde'
|
662
507
|
end
|
663
508
|
|
664
509
|
Générera le template embarqué spécifié dans la chaîne de caractères.
|
@@ -667,14 +512,14 @@ Générera le template embarqué spécifié dans la chaîne de caractères.
|
|
667
512
|
|
668
513
|
Un template est évalué dans le même contexte que l'endroit d'où il a été
|
669
514
|
appelé (gestionnaire de route). Les variables d'instance déclarées dans le
|
670
|
-
gestionnaire de route sont directement accessibles dans le template:
|
515
|
+
gestionnaire de route sont directement accessibles dans le template :
|
671
516
|
|
672
517
|
get '/:id' do
|
673
518
|
@foo = Foo.find(params[:id])
|
674
519
|
haml '%h1= @foo.nom'
|
675
520
|
end
|
676
521
|
|
677
|
-
Alternativement, on peut passer un hash contenant des variables locales:
|
522
|
+
Alternativement, on peut passer un hash contenant des variables locales :
|
678
523
|
|
679
524
|
get '/:id' do
|
680
525
|
foo = Foo.find(params[:id])
|
@@ -687,7 +532,7 @@ noms de variables.
|
|
687
532
|
|
688
533
|
=== Templates dans le fichier source
|
689
534
|
|
690
|
-
Des templates peuvent être définis dans le fichier source comme ceci:
|
535
|
+
Des templates peuvent être définis dans le fichier source comme ceci :
|
691
536
|
|
692
537
|
require 'sinatra'
|
693
538
|
|
@@ -702,24 +547,24 @@ Des templates peuvent être définis dans le fichier source comme ceci:
|
|
702
547
|
= yield
|
703
548
|
|
704
549
|
@@ index
|
705
|
-
%div.title Bonjour
|
550
|
+
%div.title Bonjour le monde !
|
706
551
|
|
707
|
-
NOTE: Les templates du fichier source qui contient <tt>require 'sinatra'</tt>
|
552
|
+
NOTE : Les templates du fichier source qui contient <tt>require 'sinatra'</tt>
|
708
553
|
sont automatiquement chargés. Si vous avez des templates dans d'autres
|
709
|
-
fichiers source, il faut explicitement les déclarer
|
554
|
+
fichiers source, il faut explicitement les déclarer avec
|
710
555
|
<tt>enable :inline_templates</tt>.
|
711
556
|
|
712
557
|
=== Templates nommés
|
713
558
|
|
714
559
|
Les templates peuvent aussi être définis grâce à la méthode de haut niveau
|
715
|
-
<tt>template</tt
|
560
|
+
<tt>template</tt> :
|
716
561
|
|
717
562
|
template :layout do
|
718
563
|
"%html\n =yield\n"
|
719
564
|
end
|
720
565
|
|
721
566
|
template :index do
|
722
|
-
'%div.title Bonjour
|
567
|
+
'%div.title Bonjour le monde !'
|
723
568
|
end
|
724
569
|
|
725
570
|
get '/' do
|
@@ -729,7 +574,7 @@ Les templates peuvent aussi être définis grâce à la méthode de haut niveau
|
|
729
574
|
Si un template nommé "layout" existe, il sera utilisé à chaque fois qu'un
|
730
575
|
template sera affiché. Vous pouvez désactivez les layouts au cas par cas en
|
731
576
|
passant <tt>:layout => false</tt> ou bien les désactiver par défaut au moyen
|
732
|
-
de <tt>set :haml, :layout => false</tt
|
577
|
+
de <tt>set :haml, :layout => false</tt> :
|
733
578
|
|
734
579
|
get '/' do
|
735
580
|
haml :index, :layout => !request.xhr?
|
@@ -766,22 +611,22 @@ https://github.com/rtomayko/tilt pour en savoir plus sur Tilt.
|
|
766
611
|
Un filtre <tt>before</tt> est évalué avant n'importe quelle requête, dans le
|
767
612
|
contexte de celle-ci, et peut modifier la requête ou la réponse. Les variables
|
768
613
|
d'instance déclarées dans le filtre sont accessibles au gestionnaire de route
|
769
|
-
et au template:
|
614
|
+
et au template :
|
770
615
|
|
771
616
|
before do
|
772
|
-
@note = 'Coucou!'
|
617
|
+
@note = 'Coucou !'
|
773
618
|
request.path_info = '/foo/bar/baz'
|
774
619
|
end
|
775
620
|
|
776
621
|
get '/foo/*' do
|
777
|
-
@note #=> 'Coucou!'
|
622
|
+
@note #=> 'Coucou !'
|
778
623
|
params[:splat] #=> 'bar/baz'
|
779
624
|
end
|
780
625
|
|
781
626
|
Un filtre <tt>after</tt> est évalué après chaque requête, dans le contexte
|
782
627
|
de celle-ci et peut également modifier la requête et/ou la réponse. Toutes les
|
783
628
|
variables d'instance déclarées dans un filtre <tt>before</tt> et dans le
|
784
|
-
gestionnaire de route sont accessibles dans le filtre <tt>after</tt
|
629
|
+
gestionnaire de route sont accessibles dans le filtre <tt>after</tt> :
|
785
630
|
|
786
631
|
after do
|
787
632
|
puts response.status
|
@@ -793,7 +638,7 @@ pas disponible dans le filtre <tt>after</tt>, étant donné qu'il est généré
|
|
793
638
|
plus tard.
|
794
639
|
|
795
640
|
En option, on peut passer un masque au filtre, ce qui le rend actif uniquement
|
796
|
-
si la requête correspond au masque en question:
|
641
|
+
si la requête correspond au masque en question :
|
797
642
|
|
798
643
|
before '/secret/*' do
|
799
644
|
authentification!
|
@@ -830,7 +675,7 @@ qui seront accessibles dans vos gestionnaires de route et dans vos templates :
|
|
830
675
|
|
831
676
|
=== Utiliser les sessions
|
832
677
|
|
833
|
-
Une session est
|
678
|
+
Une session est utilisée pour conserver un état entre les requêtes. Une fois
|
834
679
|
activées, vous avez un +hash+ de session par session utilisateur :
|
835
680
|
|
836
681
|
enable :sessions
|
@@ -864,19 +709,19 @@ Pour renforcer la sécurité, les données de session dans le cookie sont signé
|
|
864
709
|
avec une clé secrète de session. Une clé secrète est générée pour vous au
|
865
710
|
hasard par Sinatra. Toutefois, comme cette clé change à chaque démarrage de
|
866
711
|
votre application, vous pouvez définir cette clé vous-même afin que toutes
|
867
|
-
les instances de votre application la partage:
|
712
|
+
les instances de votre application la partage :
|
868
713
|
|
869
714
|
set :session_secret, 'super secret'
|
870
715
|
|
871
716
|
Si vous souhaitez avoir plus de contrôle, vous pouvez également enregistrer un
|
872
|
-
+hash+ avec des options lors de la configuration de +sessions
|
717
|
+
+hash+ avec des options lors de la configuration de +sessions+ :
|
873
718
|
|
874
719
|
set :sessions, :domain => 'foo.com'
|
875
720
|
|
876
721
|
== Halt
|
877
722
|
|
878
723
|
Pour arrêter immédiatement la requête dans un filtre ou un gestionnaire de
|
879
|
-
route:
|
724
|
+
route :
|
880
725
|
|
881
726
|
halt
|
882
727
|
|
@@ -890,28 +735,28 @@ Ou le texte ...
|
|
890
735
|
|
891
736
|
Ou les deux ...
|
892
737
|
|
893
|
-
halt 401, 'Partez!'
|
738
|
+
halt 401, 'Partez !'
|
894
739
|
|
895
740
|
Ainsi que les entêtes ...
|
896
741
|
|
897
742
|
halt 402, {'Content-Type' => 'text/plain'}, 'revanche'
|
898
743
|
|
899
|
-
Bien sûr il est possible de
|
744
|
+
Bien sûr il est possible de combiner un template avec +halt+ :
|
900
745
|
|
901
746
|
halt erb(:erreur)
|
902
747
|
|
903
748
|
== Passer
|
904
749
|
|
905
750
|
Une route peut passer le relais aux autres routes qui correspondent également
|
906
|
-
avec <tt>pass</tt
|
751
|
+
avec <tt>pass</tt> :
|
907
752
|
|
908
753
|
get '/devine/:qui' do
|
909
754
|
pass unless params[:qui] == 'Frank'
|
910
|
-
"Tu m'as eu!"
|
755
|
+
"Tu m'as eu !"
|
911
756
|
end
|
912
757
|
|
913
758
|
get '/devine/*' do
|
914
|
-
'
|
759
|
+
'Manqué !'
|
915
760
|
end
|
916
761
|
|
917
762
|
On sort donc immédiatement de ce gestionnaire et on continue à chercher,
|
@@ -973,7 +818,7 @@ retour et les entêtes :
|
|
973
818
|
headers \
|
974
819
|
"Allow" => "BREW, POST, GET, PROPFIND, WHEN"
|
975
820
|
"Refresh" => "Refresh: 20; http://www.ietf.org/rfc/rfc2324.txt"
|
976
|
-
body "
|
821
|
+
body "Je suis une théière !"
|
977
822
|
end
|
978
823
|
|
979
824
|
Comme +body+, +headers+ et +status+ peuvent être utilisés sans arguments
|
@@ -982,7 +827,7 @@ pour accéder à leurs valeurs.
|
|
982
827
|
=== Journalisation (Logging)
|
983
828
|
|
984
829
|
Dans le contexte de la requête, la méthode utilitaire +logger+ expose une
|
985
|
-
instance de +logger
|
830
|
+
instance de +logger+ :
|
986
831
|
|
987
832
|
get '/' do
|
988
833
|
logger.info "chargement des données"
|
@@ -996,7 +841,7 @@ vous n'avez pas à vous en inquiéter dans vos routes en le filtrant.
|
|
996
841
|
|
997
842
|
Notez que la journalisation est seulement activée par défaut pour
|
998
843
|
<tt>Sinatra::Application</tt>, donc si vous héritez de <tt>Sinatra::Base</tt>,
|
999
|
-
vous aurez à l'activer vous-même:
|
844
|
+
vous aurez à l'activer vous-même :
|
1000
845
|
|
1001
846
|
class MonApp < Sinatra::Base
|
1002
847
|
configure(:production, :development) do
|
@@ -1010,7 +855,9 @@ Quand vous utilisez <tt>send_file</tt> ou des fichiers statiques, vous
|
|
1010
855
|
pouvez rencontrer des types mime que Sinatra ne connaît pas. Utilisez
|
1011
856
|
+mime_type+ pour les déclarer par extension de fichier :
|
1012
857
|
|
1013
|
-
|
858
|
+
configure do
|
859
|
+
mime_type :foo, 'text/foo'
|
860
|
+
end
|
1014
861
|
|
1015
862
|
Vous pouvez également les utiliser avec la méthode +content_type+ :
|
1016
863
|
|
@@ -1047,7 +894,7 @@ Tout paramètre additionnel est géré comme des arguments pour la méthode
|
|
1047
894
|
redirect 'http://google.com', 'mauvais endroit mon pote'
|
1048
895
|
|
1049
896
|
Vous pouvez aussi rediriger vers la page dont l'utilisateur venait au moyen de
|
1050
|
-
<tt>redirect back</tt
|
897
|
+
<tt>redirect back</tt> :
|
1051
898
|
|
1052
899
|
get '/foo' do
|
1053
900
|
"<a href='/bar'>faire quelque chose</a>"
|
@@ -1077,7 +924,7 @@ Ou bien utilisez une session :
|
|
1077
924
|
|
1078
925
|
=== Contrôle du cache
|
1079
926
|
|
1080
|
-
Définir correctement vos entêtes à la base pour un bon
|
927
|
+
Définir correctement vos entêtes à la base pour un bon cache HTTP.
|
1081
928
|
|
1082
929
|
Vous pouvez facilement définir l'entête Cache-Control de la manière suivante :
|
1083
930
|
|
@@ -1086,7 +933,7 @@ Vous pouvez facilement définir l'entête Cache-Control de la manière suivante
|
|
1086
933
|
"met le en cache !"
|
1087
934
|
end
|
1088
935
|
|
1089
|
-
Conseil de pro : définir le cache dans un filtre +before
|
936
|
+
Conseil de pro : définir le cache dans un filtre +before+ :
|
1090
937
|
|
1091
938
|
before do
|
1092
939
|
cache_control :public, :must_revalidate, :max_age => 60
|
@@ -1101,8 +948,8 @@ Si vous utilisez la méthode +expires+ pour définir l'entête correspondant,
|
|
1101
948
|
|
1102
949
|
Pour utiliser correctement les caches, vous devriez utiliser +etag+ et
|
1103
950
|
+last_modified+. Il est recommandé d'utiliser ces méthodes *avant* de faire
|
1104
|
-
d'
|
1105
|
-
si le client a déjà la version courante dans son cache:
|
951
|
+
d'importantes modifications, car elles vont immédiatement déclencher la réponse
|
952
|
+
si le client a déjà la version courante dans son cache :
|
1106
953
|
|
1107
954
|
get '/article/:id' do
|
1108
955
|
@article = Article.find params[:id]
|
@@ -1112,14 +959,14 @@ si le client a déjà la version courante dans son cache:
|
|
1112
959
|
end
|
1113
960
|
|
1114
961
|
Il est également possible d'utiliser un
|
1115
|
-
{weak ETag}[http://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation]:
|
962
|
+
{weak ETag}[http://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation] :
|
1116
963
|
|
1117
964
|
etag @article.sha1, :weak
|
1118
965
|
|
1119
966
|
Ces méthodes ne sont pas chargées de mettre des données en cache, mais elles
|
1120
967
|
fournissent les informations nécessaires pour votre cache. Si vous êtes à la
|
1121
968
|
recherche de solutions rapides de cache, essayez
|
1122
|
-
{rack-cache}[http://rtomayko.github.com/rack-cache/]:
|
969
|
+
{rack-cache}[http://rtomayko.github.com/rack-cache/] :
|
1123
970
|
|
1124
971
|
require "rack/cache"
|
1125
972
|
require "sinatra"
|
@@ -1173,7 +1020,7 @@ automatiquement les requêtes de type +range+.
|
|
1173
1020
|
|
1174
1021
|
L'objet correspondant à la requête envoyée peut être récupéré dans le contexte
|
1175
1022
|
de la requête (filtres, routes, gestionnaires d'erreur) au moyen de la méthode
|
1176
|
-
|
1023
|
+
+request+ :
|
1177
1024
|
|
1178
1025
|
# application tournant à l'adresse http://exemple.com/exemple
|
1179
1026
|
get '/foo' do
|
@@ -1210,7 +1057,7 @@ de la requête (filtres, routes, gestionnaires d'erreur) au moyen de la méthode
|
|
1210
1057
|
end
|
1211
1058
|
|
1212
1059
|
Certaines options, telles que <tt>script_name</tt> ou <tt>path_info</tt>
|
1213
|
-
peuvent également être modifiées:
|
1060
|
+
peuvent également être modifiées :
|
1214
1061
|
|
1215
1062
|
before { request.path_info = "/" }
|
1216
1063
|
|
@@ -1218,18 +1065,18 @@ peuvent également être modifiées:
|
|
1218
1065
|
"toutes les requêtes arrivent ici"
|
1219
1066
|
end
|
1220
1067
|
|
1221
|
-
<tt>request.body</tt> est un objet IO ou StringIO:
|
1068
|
+
<tt>request.body</tt> est un objet IO ou StringIO :
|
1222
1069
|
|
1223
1070
|
post "/api" do
|
1224
1071
|
request.body.rewind # au cas où il a déjà été lu
|
1225
1072
|
donnees = JSON.parse request.body.read
|
1226
|
-
"Bonjour #{donnees['nom']}!"
|
1073
|
+
"Bonjour #{donnees['nom']} !"
|
1227
1074
|
end
|
1228
1075
|
|
1229
1076
|
=== Fichiers joints
|
1230
1077
|
|
1231
1078
|
Vous pouvez utiliser la méthode +attachment+ pour indiquer au navigateur que
|
1232
|
-
la réponse devrait être stockée sur le disque plutôt qu'affichée:
|
1079
|
+
la réponse devrait être stockée sur le disque plutôt qu'affichée :
|
1233
1080
|
|
1234
1081
|
get '/' do
|
1235
1082
|
attachment
|
@@ -1289,7 +1136,7 @@ devriez garder cela en tête si vous écrivez une méthode vraiment dingue.
|
|
1289
1136
|
|
1290
1137
|
== Configuration
|
1291
1138
|
|
1292
|
-
Lancé une seule fois au démarrage de tous les environnements:
|
1139
|
+
Lancé une seule fois au démarrage de tous les environnements :
|
1293
1140
|
|
1294
1141
|
configure do
|
1295
1142
|
# définir un paramètre
|
@@ -1298,10 +1145,10 @@ Lancé une seule fois au démarrage de tous les environnements:
|
|
1298
1145
|
# définir plusieurs paramètre
|
1299
1146
|
set :a => 1, :b => 2
|
1300
1147
|
|
1301
|
-
# identique à
|
1148
|
+
# identique à "set :option, true"
|
1302
1149
|
enable :option
|
1303
1150
|
|
1304
|
-
# identique à
|
1151
|
+
# identique à "set :option, false""
|
1305
1152
|
disable :option
|
1306
1153
|
|
1307
1154
|
# vous pouvez également avoir des paramètres dynamiques avec des blocs
|
@@ -1309,14 +1156,14 @@ Lancé une seule fois au démarrage de tous les environnements:
|
|
1309
1156
|
end
|
1310
1157
|
|
1311
1158
|
Lancé si l'environnement (variable d'environnement RACK_ENV) est défini comme
|
1312
|
-
<tt>:production</tt
|
1159
|
+
<tt>:production</tt> :
|
1313
1160
|
|
1314
1161
|
configure :production do
|
1315
1162
|
...
|
1316
1163
|
end
|
1317
1164
|
|
1318
1165
|
Lancé si l'environnement est <tt>:production</tt> ou
|
1319
|
-
<tt>:test</tt
|
1166
|
+
<tt>:test</tt> :
|
1320
1167
|
|
1321
1168
|
configure :production, :test do
|
1322
1169
|
...
|
@@ -1363,7 +1210,7 @@ Vous pouvez accéder à ces paramètres via <tt>settings</tt> :
|
|
1363
1210
|
dossier de vues ainsi que pour les templates en ligne.
|
1364
1211
|
|
1365
1212
|
[bind] adresse IP sur laquelle se brancher
|
1366
|
-
(par défaut: 0.0.0.0).
|
1213
|
+
(par défaut : 0.0.0.0).
|
1367
1214
|
Utiliser seulement pour le serveur intégré.
|
1368
1215
|
|
1369
1216
|
[default_encoding] encodage à utiliser si inconnu (par défaut
|
@@ -1425,7 +1272,8 @@ Vous pouvez accéder à ces paramètres via <tt>settings</tt> :
|
|
1425
1272
|
fichiers statiques.
|
1426
1273
|
Désactivez si vous utilisez un serveur capable de le
|
1427
1274
|
gérer lui même. Le désactiver augmentera la performance.
|
1428
|
-
Activé par défaut
|
1275
|
+
Activé par défaut pour le style classique, désactivé pour
|
1276
|
+
le style modulaire.
|
1429
1277
|
|
1430
1278
|
[views] dossier des vues.
|
1431
1279
|
|
@@ -1435,43 +1283,43 @@ Les gestionnaires d'erreur s'exécutent dans le même contexte que les routes ou
|
|
1435
1283
|
les filtres, ce qui veut dire que vous avez accès (entre autres) aux bons
|
1436
1284
|
vieux <tt>haml</tt>, <tt>erb</tt>, <tt>halt</tt>, etc.
|
1437
1285
|
|
1438
|
-
===
|
1286
|
+
=== NotFound
|
1439
1287
|
|
1440
1288
|
Quand une exception <tt>Sinatra::NotFound</tt> est soulevée, ou que le code
|
1441
|
-
retour est 404, le gestionnaire <tt>not_found</tt> est
|
1289
|
+
retour est 404, le gestionnaire <tt>not_found</tt> est invoqué :
|
1442
1290
|
|
1443
1291
|
not_found do
|
1444
1292
|
'Pas moyen de trouver ce que vous cherchez'
|
1445
1293
|
end
|
1446
1294
|
|
1447
|
-
===
|
1295
|
+
=== Error
|
1448
1296
|
|
1449
1297
|
Le gestionnaire +error+ est invoqué à chaque fois qu'une exception est
|
1450
1298
|
soulevée dans une route ou un filtre. L'objet exception est accessible via la
|
1451
|
-
variable Rack <tt>sinatra.error</tt
|
1299
|
+
variable Rack <tt>sinatra.error</tt> :
|
1452
1300
|
|
1453
1301
|
error do
|
1454
1302
|
'Désolé mais une méchante erreur est survenue - ' + env['sinatra.error'].name
|
1455
1303
|
end
|
1456
1304
|
|
1457
|
-
Erreur sur mesure:
|
1305
|
+
Erreur sur mesure :
|
1458
1306
|
|
1459
1307
|
error MonErreurSurMesure do
|
1460
1308
|
'Donc il est arrivé ceci...' + env['sinatra.error'].message
|
1461
1309
|
end
|
1462
1310
|
|
1463
|
-
Donc si ceci arrive:
|
1311
|
+
Donc si ceci arrive :
|
1464
1312
|
|
1465
1313
|
get '/' do
|
1466
1314
|
raise MonErreurSurMesure, 'quelque chose de mal'
|
1467
1315
|
end
|
1468
1316
|
|
1469
|
-
Vous obtenez ça:
|
1317
|
+
Vous obtenez ça :
|
1470
1318
|
|
1471
1319
|
Donc il est arrivé ceci... quelque chose de mal
|
1472
1320
|
|
1473
1321
|
Alternativement, vous pouvez avoir un gestionnaire d'erreur associé à un code
|
1474
|
-
particulier:
|
1322
|
+
particulier :
|
1475
1323
|
|
1476
1324
|
error 403 do
|
1477
1325
|
'Accès interdit'
|
@@ -1481,7 +1329,7 @@ particulier:
|
|
1481
1329
|
403
|
1482
1330
|
end
|
1483
1331
|
|
1484
|
-
Ou un intervalle:
|
1332
|
+
Ou un intervalle :
|
1485
1333
|
|
1486
1334
|
error 400..510 do
|
1487
1335
|
'Boom'
|
@@ -1501,7 +1349,7 @@ visualiser/manipuler la requête/réponse HTTP, et d'offrir diverses
|
|
1501
1349
|
fonctionnalités classiques.
|
1502
1350
|
|
1503
1351
|
Sinatra permet de construire facilement des middlewares Rack via la méthode de
|
1504
|
-
haut niveau +use
|
1352
|
+
haut niveau +use+ :
|
1505
1353
|
|
1506
1354
|
require 'sinatra'
|
1507
1355
|
require 'mon_middleware_perso'
|
@@ -1510,13 +1358,13 @@ haut niveau +use+:
|
|
1510
1358
|
use MonMiddlewarePerso
|
1511
1359
|
|
1512
1360
|
get '/bonjour' do
|
1513
|
-
'Bonjour
|
1361
|
+
'Bonjour le monde'
|
1514
1362
|
end
|
1515
1363
|
|
1516
1364
|
La sémantique de +use+ est identique à celle définie dans le DSL de
|
1517
1365
|
Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html]
|
1518
1366
|
(le plus souvent utilisé dans un fichier rackup). Par exemple, la méthode
|
1519
|
-
+use+ accepte divers arguments ainsi que des blocs:
|
1367
|
+
+use+ accepte divers arguments ainsi que des blocs :
|
1520
1368
|
|
1521
1369
|
use Rack::Auth::Basic do |login, password|
|
1522
1370
|
login == 'admin' && password == 'secret'
|
@@ -1531,7 +1379,7 @@ configuration, donc pour ceux-ci vous n'aurez pas à utiliser la méthode +use+.
|
|
1531
1379
|
|
1532
1380
|
Les tests pour Sinatra peuvent être écrit avec n'importe quelle bibliothèque
|
1533
1381
|
basée sur Rack. {Rack::Test}[http://gitrdoc.com/brynary/rack-test] est
|
1534
|
-
|
1382
|
+
recommandé :
|
1535
1383
|
|
1536
1384
|
require 'mon_application_sinatra'
|
1537
1385
|
require 'test/unit'
|
@@ -1546,23 +1394,20 @@ recommandé:
|
|
1546
1394
|
|
1547
1395
|
def test_ma_racine
|
1548
1396
|
get '/'
|
1549
|
-
assert_equal 'Bonjour
|
1397
|
+
assert_equal 'Bonjour le monde !', last_response.body
|
1550
1398
|
end
|
1551
1399
|
|
1552
1400
|
def test_avec_des_parametres
|
1553
1401
|
get '/rencontrer', :name => 'Frank'
|
1554
|
-
assert_equal 'Salut Frank!', last_response.body
|
1402
|
+
assert_equal 'Salut Frank !', last_response.body
|
1555
1403
|
end
|
1556
1404
|
|
1557
1405
|
def test_avec_rack_env
|
1558
1406
|
get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
|
1559
|
-
assert_equal "Vous utilisez Songbird!", last_response.body
|
1407
|
+
assert_equal "Vous utilisez Songbird !", last_response.body
|
1560
1408
|
end
|
1561
1409
|
end
|
1562
1410
|
|
1563
|
-
NOTE: Le module intégré Sinatra::Test et la classe Sinatra::TestHarness
|
1564
|
-
sont désapprouvés depuis la version 0.9.2 .
|
1565
|
-
|
1566
1411
|
== Sinatra::Base - Les Middlewares, les Bibliothèques, et les Applications Modulaires
|
1567
1412
|
|
1568
1413
|
Définir votre application au niveau supérieur fonctionne bien pour les
|
@@ -1571,8 +1416,8 @@ de créer des composants réutilisables comme des middlewares Rack, faire
|
|
1571
1416
|
du Rails metal, ou de simples bibliothèques avec un composant serveur, ou
|
1572
1417
|
même une extension pour Sinatra. Le DSL de haut niveau pollue l'espace de noms
|
1573
1418
|
et est une configuration adaptée à une micro-application (un fichier unique
|
1574
|
-
pour l'application, les dossiers
|
1575
|
-
d'erreur, etc.). C'est là que Sinatra::Base entre en jeu:
|
1419
|
+
pour l'application, les dossiers <tt>./public</tt> et <tt>./views</tt>, les
|
1420
|
+
logs, pages d'erreur, etc.). C'est là que <tt>Sinatra::Base</tt> entre en jeu :
|
1576
1421
|
|
1577
1422
|
require 'sinatra/base'
|
1578
1423
|
|
@@ -1581,20 +1426,20 @@ d'erreur, etc.). C'est là que Sinatra::Base entre en jeu:
|
|
1581
1426
|
set :foo, 'bar'
|
1582
1427
|
|
1583
1428
|
get '/' do
|
1584
|
-
'Bonjour
|
1429
|
+
'Bonjour le monde !'
|
1585
1430
|
end
|
1586
1431
|
end
|
1587
1432
|
|
1588
|
-
Les méthodes disponibles dans Sinatra::Base sont exactement identiques
|
1589
|
-
celles disponibles dans le DSL de haut niveau. La plupart des applications
|
1590
|
-
de haut niveau peuvent être converties en composant Sinatra::Base avec
|
1591
|
-
deux modifications:
|
1433
|
+
Les méthodes disponibles dans <tt>Sinatra::Base</tt> sont exactement identiques
|
1434
|
+
à celles disponibles dans le DSL de haut niveau. La plupart des applications
|
1435
|
+
de haut niveau peuvent être converties en composant <tt>Sinatra::Base</tt> avec
|
1436
|
+
deux modifications :
|
1592
1437
|
|
1593
|
-
* Votre fichier doit charger +sinatra/base+ au lieu de +sinatra
|
1438
|
+
* Votre fichier doit charger +sinatra/base+ au lieu de +sinatra+ ;
|
1594
1439
|
autrement, toutes les méthodes de la DSL seront chargées dans l'espace
|
1595
|
-
|
1440
|
+
de noms.
|
1596
1441
|
* Mettre vos gestionnaires de route, vos gestionnaires d'erreur, vos filtres
|
1597
|
-
|
1442
|
+
et options dans une sous-classe de <tt>Sinatra::Base</tt>.
|
1598
1443
|
|
1599
1444
|
<tt>Sinatra::Base</tt> est plutôt épuré. La plupart des options sont
|
1600
1445
|
désactivées par défaut, ceci inclus le serveur. Voir {Options et
|
@@ -1619,7 +1464,7 @@ Il n'y a que deux inconvénient au style classique comparé au style modulaire :
|
|
1619
1464
|
Il n'y pas d'empêchement à mélanger style classic et style modulaire.
|
1620
1465
|
|
1621
1466
|
Si vous passez d'un style à l'autre, vous devriez être vigilant à quelques
|
1622
|
-
légères différences dans les paramètres :
|
1467
|
+
légères différences dans les paramètres par défaut :
|
1623
1468
|
|
1624
1469
|
Paramètre Classique Modulaire
|
1625
1470
|
|
@@ -1628,6 +1473,7 @@ légères différences dans les paramètres :
|
|
1628
1473
|
logging true false
|
1629
1474
|
method_override true false
|
1630
1475
|
inline_templates true false
|
1476
|
+
static true false
|
1631
1477
|
|
1632
1478
|
|
1633
1479
|
=== Servir une application modulaire
|
@@ -1653,7 +1499,7 @@ Ou alors avec un fichier <tt>config.ru</tt>, qui permet d'utiliser n'importe
|
|
1653
1499
|
quel gestionnaire Rack :
|
1654
1500
|
|
1655
1501
|
# config.ru
|
1656
|
-
require 'my_app'
|
1502
|
+
require './my_app'
|
1657
1503
|
run MyApp
|
1658
1504
|
|
1659
1505
|
Exécutez :
|
@@ -1668,12 +1514,12 @@ Ecrivez votre application :
|
|
1668
1514
|
require 'sinatra'
|
1669
1515
|
|
1670
1516
|
get '/' do
|
1671
|
-
'
|
1517
|
+
'Bonjour le monde !'
|
1672
1518
|
end
|
1673
1519
|
|
1674
1520
|
Et un fichier <tt>config.ru</tt> correspondant :
|
1675
1521
|
|
1676
|
-
require 'app'
|
1522
|
+
require './app'
|
1677
1523
|
run Sinatra::Application
|
1678
1524
|
|
1679
1525
|
=== Quand utiliser un fichier config.ru ?
|
@@ -1696,7 +1542,7 @@ Non seulement Sinatra peut utiliser d'autres middlewares Rack, il peut
|
|
1696
1542
|
également être à son tour utilisé au-dessus de n'importe quel +endpoint+ Rack
|
1697
1543
|
en tant que middleware. Ce +endpoint+ peut très bien être une autre
|
1698
1544
|
application Sinatra, ou n'importe quelle application basée sur Rack
|
1699
|
-
(Rails/Ramaze/Camping/...):
|
1545
|
+
(Rails/Ramaze/Camping/...) :
|
1700
1546
|
|
1701
1547
|
require 'sinatra/base'
|
1702
1548
|
|
@@ -1706,7 +1552,7 @@ application Sinatra, ou n'importe quelle application basée sur Rack
|
|
1706
1552
|
get('/connexion') { haml :connexion }
|
1707
1553
|
|
1708
1554
|
post('/connexion') do
|
1709
|
-
if params[:nom] = 'admin'
|
1555
|
+
if params[:nom] = 'admin' && params[:motdepasse] = 'admin'
|
1710
1556
|
session['nom_utilisateur'] = params[:nom]
|
1711
1557
|
else
|
1712
1558
|
redirect '/connexion'
|
@@ -1731,13 +1577,13 @@ application Sinatra, ou n'importe quelle application basée sur Rack
|
|
1731
1577
|
|
1732
1578
|
Il se peut que vous ayez besoin de créer une nouvelle application à l'exécution
|
1733
1579
|
sans avoir à les assigner à une constante, vous pouvez le faire grâce à
|
1734
|
-
|
1580
|
+
<tt>Sinatra.new</tt> :
|
1735
1581
|
|
1736
1582
|
require 'sinatra/base'
|
1737
1583
|
mon_app = Sinatra.new { get('/') { "salut" } }
|
1738
1584
|
mon_app.run!
|
1739
1585
|
|
1740
|
-
L'application dont elle hérite peut être passé en argument optionnel:
|
1586
|
+
L'application dont elle hérite peut être passé en argument optionnel :
|
1741
1587
|
|
1742
1588
|
require 'sinatra/base'
|
1743
1589
|
|
@@ -1757,7 +1603,7 @@ L'application dont elle hérite peut être passé en argument optionnel:
|
|
1757
1603
|
C'est notamment utile pour tester des extensions à Sinatra ou bien pour
|
1758
1604
|
utiliser Sinatra dans votre propre bibliothèque.
|
1759
1605
|
|
1760
|
-
Cela permet également d'utiliser très facilement Sinatra comme middleware:
|
1606
|
+
Cela permet également d'utiliser très facilement Sinatra comme middleware :
|
1761
1607
|
|
1762
1608
|
require 'sinatra/base'
|
1763
1609
|
|
@@ -1774,50 +1620,50 @@ disponibles.
|
|
1774
1620
|
|
1775
1621
|
=== Contexte de l'application/classe
|
1776
1622
|
|
1777
|
-
Toute application Sinatra correspond à une sous-classe de Sinatra::Base
|
1778
|
-
vous utilisez le DSL haut niveau (<tt>require 'sinatra'</tt>), alors cette
|
1779
|
-
classe est Sinatra::Application
|
1780
|
-
avez définie. Dans le contexte de la classe, vous avez accès aux méthodes
|
1781
|
-
telles que
|
1782
|
-
ou
|
1623
|
+
Toute application Sinatra correspond à une sous-classe de <tt>Sinatra::Base</tt>.
|
1624
|
+
Si vous utilisez le DSL haut niveau (<tt>require 'sinatra'</tt>), alors cette
|
1625
|
+
classe est <tt>Sinatra::Application</tt>, sinon il s'agit de la sous-classe que
|
1626
|
+
vous avez définie. Dans le contexte de la classe, vous avez accès aux méthodes
|
1627
|
+
telles que +get+ ou +before+, mais vous n'avez pas accès aux objets +request+
|
1628
|
+
ou +session+ car c'est la même classe d'application qui traitera toutes les
|
1783
1629
|
requêtes.
|
1784
1630
|
|
1785
|
-
Les options définies au moyen de
|
1631
|
+
Les options définies au moyen de +set+ deviennent des méthodes de classe :
|
1786
1632
|
|
1787
1633
|
class MonApp < Sinatra::Base
|
1788
|
-
# Eh, je suis dans le contexte de l'application!
|
1634
|
+
# Eh, je suis dans le contexte de l'application !
|
1789
1635
|
set :foo, 42
|
1790
1636
|
foo # => 42
|
1791
1637
|
|
1792
1638
|
get '/foo' do
|
1793
|
-
# Eh, je ne suis plus dans le contexte de l'application!
|
1639
|
+
# Eh, je ne suis plus dans le contexte de l'application !
|
1794
1640
|
end
|
1795
1641
|
end
|
1796
1642
|
|
1797
|
-
Vous avez le binding du contexte de l'application dans:
|
1643
|
+
Vous avez le binding du contexte de l'application dans :
|
1798
1644
|
|
1799
1645
|
* Le corps de la classe d'application
|
1800
1646
|
* Les méthodes définies par les extensions
|
1801
|
-
* Le bloc passé à
|
1802
|
-
* Les procs/blocs utilisés comme argument pour
|
1647
|
+
* Le bloc passé à +helpers+
|
1648
|
+
* Les procs/blocs utilisés comme argument pour +set+
|
1803
1649
|
* Le bloc passé à <tt>Sinatra.new</tt>
|
1804
1650
|
|
1805
|
-
Vous pouvez atteindre ce contexte (donc la classe) de la façon suivante:
|
1651
|
+
Vous pouvez atteindre ce contexte (donc la classe) de la façon suivante :
|
1806
1652
|
|
1807
|
-
* Via l'objet passé dans les blocs
|
1808
|
-
* En utilisant
|
1653
|
+
* Via l'objet passé dans les blocs +configure+ (<tt>configure { |c| ... }</tt>)
|
1654
|
+
* En utilisant +settings+ dans le contexte de la requête
|
1809
1655
|
|
1810
1656
|
=== Contexte de la requête/instance
|
1811
1657
|
|
1812
1658
|
Pour tout traitement d'une requête, une nouvelle instance de votre classe
|
1813
1659
|
d'application est créée et tous vos gestionnaires sont exécutés dans ce
|
1814
|
-
contexte. Dans ce dernier, vous pouvez accéder aux objets
|
1815
|
-
|
1660
|
+
contexte. Dans ce dernier, vous pouvez accéder aux objets +request+ et
|
1661
|
+
+session+ et faire appel aux fonctions de rendu telles que +erb+ ou +haml+.
|
1816
1662
|
Vous pouvez accéder au contexte de l'application depuis le contexte de la
|
1817
|
-
requête au moyen de
|
1663
|
+
requête au moyen de +settings+ :
|
1818
1664
|
|
1819
1665
|
class MonApp < Sinatra::Base
|
1820
|
-
# Eh, je suis dans le contexte de l'application!
|
1666
|
+
# Eh, je suis dans le contexte de l'application !
|
1821
1667
|
get '/ajouter_route/:nom' do
|
1822
1668
|
# Contexte de la requête pour '/ajouter_route/:nom'
|
1823
1669
|
@value = 42
|
@@ -1827,44 +1673,43 @@ requête au moyen de `settings`:
|
|
1827
1673
|
@value # => nil (on est pas au sein de la même requête)
|
1828
1674
|
end
|
1829
1675
|
|
1830
|
-
"Route ajoutée!"
|
1676
|
+
"Route ajoutée !"
|
1831
1677
|
end
|
1832
1678
|
end
|
1833
1679
|
|
1834
|
-
Vous avez le binding du contexte de la requête dans:
|
1680
|
+
Vous avez le binding du contexte de la requête dans :
|
1835
1681
|
|
1836
1682
|
* les blocs get/head/post/put/delete/options
|
1837
1683
|
* les filtres before/after
|
1838
|
-
* les méthodes utilitaires (définies au moyen de
|
1684
|
+
* les méthodes utilitaires (définies au moyen de +helpers+)
|
1839
1685
|
* les vues/templates
|
1840
1686
|
|
1841
1687
|
=== Le contexte de délégation
|
1842
1688
|
|
1843
1689
|
Le contexte de délégation se contente de transmettre les appels de méthodes au
|
1844
1690
|
contexte de classe. Toutefois, il ne se comporte pas à 100% comme le contexte
|
1845
|
-
de classe car vous n'avez pas le binding de la classe: seules les méthodes
|
1691
|
+
de classe car vous n'avez pas le binding de la classe : seules les méthodes
|
1846
1692
|
spécifiquement déclarées pour délégation sont disponibles et il n'est pas
|
1847
1693
|
possible de partager des variables/états avec le contexte de classe
|
1848
|
-
(comprenez:
|
1694
|
+
(comprenez : +self+ n'est pas le même). Vous pouvez ajouter des délégation de
|
1849
1695
|
méthodes en appelant <tt>Sinatra::Delegator.delegate :method_name</tt>.
|
1850
1696
|
|
1851
|
-
Vous avez le binding du contexte de délégation dans:
|
1697
|
+
Vous avez le binding du contexte de délégation dans :
|
1852
1698
|
|
1853
1699
|
* Le binding de haut niveau, si vous avez utilisé <tt>require "sinatra"</tt>
|
1854
|
-
* Un objet qui inclut le module
|
1700
|
+
* Un objet qui inclut le module +Sinatra::Delegator+
|
1855
1701
|
|
1856
|
-
Jetez un oeil
|
1857
|
-
pour vous faire une idée: voici le mixin
|
1702
|
+
Jetez un oeil pour vous faire une idée : voici le mixin
|
1858
1703
|
{Sinatra::Delegator}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/base.rb#L1128]
|
1859
1704
|
qui est {inclus dans l'espace de noms principal}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/main.rb#L28]
|
1860
1705
|
|
1861
1706
|
== Ligne de commande
|
1862
1707
|
|
1863
|
-
Les applications en Sinatra peuvent être lancées directement:
|
1708
|
+
Les applications en Sinatra peuvent être lancées directement :
|
1864
1709
|
|
1865
1710
|
ruby mon_application.rb [-h] [-x] [-e ENVIRONNEMENT] [-p PORT] [-o HOTE] [-s SERVEUR]
|
1866
1711
|
|
1867
|
-
Les options sont:
|
1712
|
+
Les options sont :
|
1868
1713
|
|
1869
1714
|
-h # aide
|
1870
1715
|
-p # déclare le port (4567 par défaut)
|
@@ -1891,7 +1736,7 @@ Les versions suivantes de Ruby sont officiellement supportées :
|
|
1891
1736
|
y compris tous les langages de template.
|
1892
1737
|
|
1893
1738
|
[ JRuby ]
|
1894
|
-
JRuby est officiellement supporté (JRuby >= 1.6.
|
1739
|
+
JRuby est officiellement supporté (JRuby >= 1.6.1). Aucune anomalie avec
|
1895
1740
|
des bibliothèques de templates tierces ne sont connues. Toutefois, si vous
|
1896
1741
|
choisissez JRuby, alors tournez vous vers des gestionnaires Rack JRuby car
|
1897
1742
|
le serveur Thin n'est pas complètement supporté par JRuby. Le support des
|
@@ -1908,7 +1753,6 @@ sont toujours connues comme permettant à Sinatra de fonctionner :
|
|
1908
1753
|
* Plus anciennes versions de JRuby et Rubinius
|
1909
1754
|
* MacRuby, Maglev, IronRuby
|
1910
1755
|
* Ruby 1.9.0 et 1.9.1
|
1911
|
-
* Ruby 1.8.6 avec {backports}[https://github.com/marcandre/backports/#readme]
|
1912
1756
|
|
1913
1757
|
Ne pas être officiellement supporté signifie que si les choses se passent mal
|
1914
1758
|
sur ces plateformes et non sur celles supportées, nous considérons que
|
@@ -1927,12 +1771,12 @@ Si vous voulez utiliser la toute dernière version de Sinatra, n'ayez pas peur
|
|
1927
1771
|
de faire tourner votre application sur la branche master, cela devrait être
|
1928
1772
|
stable.
|
1929
1773
|
|
1930
|
-
Nous publions également une gem de +prerelease+ de temps en temps
|
1931
|
-
pouvez
|
1774
|
+
Nous publions également une gem de +prerelease+ de temps en temps que vous
|
1775
|
+
pouvez installer comme suit :
|
1932
1776
|
|
1933
1777
|
gem install sinatra --pre
|
1934
1778
|
|
1935
|
-
afin d'avoir
|
1779
|
+
afin d'avoir les toutes dernières fonctionnalités.
|
1936
1780
|
|
1937
1781
|
=== Avec Bundler
|
1938
1782
|
|
@@ -1998,8 +1842,16 @@ SemVer que SemVerTag.
|
|
1998
1842
|
* {Site internet}[http://www.sinatrarb.com/] - Plus de documentation,
|
1999
1843
|
de news, et des liens vers d'autres ressources.
|
2000
1844
|
* {Contribuer}[http://www.sinatrarb.com/contributing] - Vous avez trouvé un
|
2001
|
-
bug? Besoin d'aide? Vous avez un patch?
|
1845
|
+
bug ? Besoin d'aide ? Vous avez un patch ?
|
2002
1846
|
* {Suivi des problèmes}[http://github.com/sinatra/sinatra/issues]
|
2003
1847
|
* {Twitter}[http://twitter.com/sinatra]
|
2004
1848
|
* {Mailing List}[http://groups.google.com/group/sinatrarb/topics]
|
2005
|
-
* {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] sur http://freenode.net
|
1849
|
+
* {IRC : #sinatra}[irc://chat.freenode.net/#sinatra] sur http://freenode.net
|
1850
|
+
* {IRC : #sinatra}[irc://chat.freenode.net/#sinatra] on http://freenode.net
|
1851
|
+
* {Sinatra Book}[http://sinatra-book.gittr.com] Tutoriels et recettes
|
1852
|
+
* {Sinatra Book Contrib}[http://sinatra-book-contrib.com/] Recettes contribuées
|
1853
|
+
par la communauté
|
1854
|
+
* Documentation API de la {dernière version}[http://rubydoc.info/gems/sinatra]
|
1855
|
+
ou du {HEAD courant}[http://rubydoc.info/github/sinatra/sinatra] sur
|
1856
|
+
http://rubydoc.info/
|
1857
|
+
|