sinatra 1.4.6 → 1.4.7
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.
- checksums.yaml +4 -4
- data/AUTHORS.md +5 -2
- data/{CHANGES → CHANGELOG.md} +17 -1
- data/CONTRIBUTING.md +100 -0
- data/LICENSE +2 -2
- data/README.de.md +78 -41
- data/README.es.md +200 -165
- data/README.fr.md +364 -338
- data/README.hu.md +7 -7
- data/README.ja.md +199 -167
- data/README.ko.md +222 -183
- data/README.md +218 -179
- data/README.pt-br.md +146 -112
- data/README.pt-pt.md +63 -63
- data/README.ru.md +158 -35
- data/README.zh.md +1941 -1235
- data/Rakefile +2 -2
- data/lib/sinatra/base.rb +16 -24
- data/lib/sinatra/ext.rb +17 -0
- data/lib/sinatra/show_exceptions.rb +13 -7
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +1 -1
- data/test/public/hello+world.txt +1 -0
- data/test/routing_test.rb +44 -0
- data/test/static_test.rb +30 -0
- metadata +9 -6
data/README.fr.md
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
# Sinatra
|
2
2
|
*Attention : Ce document correspond à la traduction de la version anglaise et
|
3
|
-
il n'est peut
|
3
|
+
il n'est peut-être plus à jour.*
|
4
4
|
|
5
|
-
Sinatra est un [DSL](
|
5
|
+
Sinatra est un [DSL](https://fr.wikipedia.org/wiki/Langage_dédié) pour
|
6
6
|
créer rapidement et facilement des applications web en Ruby :
|
7
7
|
|
8
|
-
```
|
8
|
+
```ruby
|
9
9
|
# mon_application.rb
|
10
10
|
require 'sinatra'
|
11
11
|
|
@@ -16,17 +16,18 @@ end
|
|
16
16
|
|
17
17
|
Installez la gem Sinatra :
|
18
18
|
|
19
|
-
```
|
19
|
+
```shell
|
20
20
|
gem install sinatra
|
21
21
|
```
|
22
22
|
|
23
23
|
Puis lancez votre programme :
|
24
24
|
|
25
|
-
```
|
25
|
+
```shell
|
26
26
|
ruby mon_application.rb
|
27
27
|
```
|
28
28
|
|
29
|
-
Le résultat est visible sur :
|
29
|
+
Le résultat est visible sur :
|
30
|
+
[http://localhost:4567](http://localhost:4567)
|
30
31
|
|
31
32
|
Il est recommandé d'exécuter également `gem install thin`, pour que
|
32
33
|
Sinatra utilise le server Thin quand il est disponible.
|
@@ -75,7 +76,7 @@ Sinatra utilise le server Thin quand il est disponible.
|
|
75
76
|
* [Halt](#halt)
|
76
77
|
* [Passer](#passer)
|
77
78
|
* [Déclencher une autre route](#déclencher-une-autre-route)
|
78
|
-
* [Définir le corps, le code retour et les
|
79
|
+
* [Définir le corps, le code retour et les en-têtes](#définir-le-corps-le-code-retour-et-les-en-têtes)
|
79
80
|
* [Faire du streaming](#faire-du-streaming)
|
80
81
|
* [Journalisation (Logging)](#journalisation-logging)
|
81
82
|
* [Types Mime](#types-mime)
|
@@ -108,6 +109,7 @@ Sinatra utilise le server Thin quand il est disponible.
|
|
108
109
|
* [Contexte de la requête/instance](#contexte-de-la-requêteinstance)
|
109
110
|
* [Le contexte de délégation](#le-contexte-de-délégation)
|
110
111
|
* [Ligne de commande](#ligne-de-commande)
|
112
|
+
* [Multi-threading](#multi-threading)
|
111
113
|
* [Configuration nécessaire](#configuration-nécessaire)
|
112
114
|
* [Essuyer les plâtres](#essuyer-les-plâtres)
|
113
115
|
* [Installer avec Bundler](#installer-avec-bundler)
|
@@ -121,7 +123,7 @@ Sinatra utilise le server Thin quand il est disponible.
|
|
121
123
|
Dans Sinatra, une route est une méthode HTTP couplée à un masque (pattern)
|
122
124
|
URL. Chaque route est associée à un bloc :
|
123
125
|
|
124
|
-
```
|
126
|
+
```ruby
|
125
127
|
get '/' do
|
126
128
|
.. montrer quelque chose ..
|
127
129
|
end
|
@@ -161,7 +163,7 @@ route qui correspond à la requête est appelée.
|
|
161
163
|
Les masques peuvent inclure des paramètres nommés, accessibles par
|
162
164
|
l'intermédiaire du hash `params` :
|
163
165
|
|
164
|
-
```
|
166
|
+
```ruby
|
165
167
|
get '/bonjour/:nom' do
|
166
168
|
# répond aux requêtes "GET /bonjour/foo" et "GET /bonjour/bar"
|
167
169
|
# params['nom'] est 'foo' ou 'bar'
|
@@ -172,7 +174,7 @@ end
|
|
172
174
|
Vous pouvez aussi accéder aux paramètres nommés directement grâce aux
|
173
175
|
paramètres du bloc comme ceci :
|
174
176
|
|
175
|
-
```
|
177
|
+
```ruby
|
176
178
|
get '/bonjour/:nom' do |n|
|
177
179
|
# répond aux requêtes "GET /bonjour/foo" et "GET /bonjour/bar"
|
178
180
|
# params['nom'] est 'foo' ou 'bar'
|
@@ -181,10 +183,10 @@ get '/bonjour/:nom' do |n|
|
|
181
183
|
end
|
182
184
|
```
|
183
185
|
|
184
|
-
Une route peut contenir un splat (caractère joker), accessible par
|
186
|
+
Une route peut contenir un `splat` (caractère joker), accessible par
|
185
187
|
l'intermédiaire du tableau `params['splat']` :
|
186
188
|
|
187
|
-
```
|
189
|
+
```ruby
|
188
190
|
get '/dire/*/a/*' do
|
189
191
|
# répond à /dire/bonjour/a/monde
|
190
192
|
params['splat'] # => ["bonjour", "monde"]
|
@@ -198,7 +200,7 @@ end
|
|
198
200
|
|
199
201
|
Ou par l'intermédiaire des paramètres du bloc :
|
200
202
|
|
201
|
-
```
|
203
|
+
```ruby
|
202
204
|
get '/telecharger/*.*' do |chemin, ext|
|
203
205
|
[chemin, ext] # => ["path/to/file", "xml"]
|
204
206
|
end
|
@@ -206,7 +208,7 @@ end
|
|
206
208
|
|
207
209
|
Une route peut aussi être définie par une expression régulière :
|
208
210
|
|
209
|
-
```
|
211
|
+
```ruby
|
210
212
|
get /\A\/bonjour\/([\w]+)\z/ do
|
211
213
|
"Bonjour, #{params['captures'].first} !"
|
212
214
|
end
|
@@ -214,28 +216,29 @@ end
|
|
214
216
|
|
215
217
|
Là encore on peut utiliser les paramètres de bloc :
|
216
218
|
|
217
|
-
```
|
219
|
+
```ruby
|
218
220
|
get %r{/bonjour/([\w]+)} do |c|
|
221
|
+
# répond à "GET /meta/bonjour/monde", "GET /bonjour/monde/1234" etc.
|
219
222
|
"Bonjour, #{c} !"
|
220
223
|
end
|
221
224
|
```
|
222
225
|
|
223
226
|
Les routes peuvent aussi comporter des paramètres optionnels :
|
224
227
|
|
225
|
-
```
|
226
|
-
get '/
|
227
|
-
# répond à "GET /
|
228
|
+
```ruby
|
229
|
+
get '/articles/:format?' do
|
230
|
+
# répond à "GET /articles/" ou avec une extension "GET /articles/json", "GET /articles/xml" etc...
|
228
231
|
end
|
229
232
|
```
|
230
233
|
|
231
234
|
Ainsi que des paramètres d'URL :
|
232
235
|
|
233
|
-
```
|
234
|
-
get '/
|
235
|
-
# répond à "GET /
|
236
|
+
```ruby
|
237
|
+
get '/articles' do
|
238
|
+
# répond à "GET /articles?titre=foo&auteur=bar"
|
236
239
|
titre = params['titre']
|
237
240
|
auteur = params['auteur']
|
238
|
-
# utilise les variables titre et auteur
|
241
|
+
# utilise les variables titre et auteur qui sont des paramètres d'URL optionnels pour la route /articles
|
239
242
|
end
|
240
243
|
```
|
241
244
|
|
@@ -248,7 +251,7 @@ avant d'être comparée à vos routes.
|
|
248
251
|
Les routes peuvent définir toutes sortes de conditions, comme par exemple le
|
249
252
|
"user agent" :
|
250
253
|
|
251
|
-
```
|
254
|
+
```ruby
|
252
255
|
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
|
253
256
|
"Vous utilisez Songbird version #{params['agent'][0]}"
|
254
257
|
end
|
@@ -260,7 +263,7 @@ end
|
|
260
263
|
|
261
264
|
Les autres conditions disponibles sont `host_name` et `provides` :
|
262
265
|
|
263
|
-
```
|
266
|
+
```ruby
|
264
267
|
get '/', :host_name => /^admin\./ do
|
265
268
|
"Zone Administrateur, Accès refusé !"
|
266
269
|
end
|
@@ -273,13 +276,14 @@ get '/', :provides => ['rss', 'atom', 'xml'] do
|
|
273
276
|
builder :feed
|
274
277
|
end
|
275
278
|
```
|
279
|
+
`provides` se base sur l'en-tête `Accept` de la requête.
|
276
280
|
|
277
281
|
Vous pouvez facilement définir vos propres conditions :
|
278
282
|
|
279
|
-
```
|
280
|
-
set(:
|
283
|
+
```ruby
|
284
|
+
set(:chance) { |valeur| condition { rand <= valeur } }
|
281
285
|
|
282
|
-
get '/gagner_une_voiture', :
|
286
|
+
get '/gagner_une_voiture', :chance => 0.1 do
|
283
287
|
"Vous avez gagné !"
|
284
288
|
end
|
285
289
|
|
@@ -288,10 +292,10 @@ get '/gagner_une_voiture' do
|
|
288
292
|
end
|
289
293
|
```
|
290
294
|
|
291
|
-
Utilisez un splat (caractère joker) dans le cas d'une condition qui prend
|
295
|
+
Utilisez un `splat` (caractère joker) dans le cas d'une condition qui prend
|
292
296
|
plusieurs valeurs :
|
293
297
|
|
294
|
-
```
|
298
|
+
```ruby
|
295
299
|
set(:auth) do |*roles| # <- ici on utilise un splat
|
296
300
|
condition do
|
297
301
|
unless logged_in? && roles.any? {|role| current_user.in_role? role }
|
@@ -312,7 +316,7 @@ end
|
|
312
316
|
## Valeurs de retour
|
313
317
|
|
314
318
|
La valeur renvoyée par le bloc correspondant à une route constitue le corps de
|
315
|
-
la réponse qui sera transmise au client HTTP ou du moins au prochain middleware
|
319
|
+
la réponse qui sera transmise au client HTTP ou du moins au prochain `middleware`
|
316
320
|
dans la pile Rack. Le plus souvent, il s'agit d'une chaîne de caractères,
|
317
321
|
comme dans les exemples précédents. Cependant, d'autres valeurs sont
|
318
322
|
acceptées.
|
@@ -320,7 +324,7 @@ acceptées.
|
|
320
324
|
Vous pouvez renvoyer n'importe quel objet qu'il s'agisse d'une réponse Rack
|
321
325
|
valide, d'un corps de réponse Rack ou d'un code statut HTTP :
|
322
326
|
|
323
|
-
* Un tableau de 3 éléments : `[code statut (Fixnum),
|
327
|
+
* Un tableau de 3 éléments : `[code statut (Fixnum), en-têtes (Hash), corps
|
324
328
|
de la réponse (répondant à #each)]`
|
325
329
|
* Un tableau de 2 élements : `[code statut (Fixnum), corps de la réponse
|
326
330
|
(répondant à #each)]`
|
@@ -328,9 +332,9 @@ valide, d'un corps de réponse Rack ou d'un code statut HTTP :
|
|
328
332
|
caractères au bloc fourni
|
329
333
|
* Un Fixnum représentant le code statut
|
330
334
|
|
331
|
-
|
335
|
+
Ainsi, on peut facilement implémenter un exemple de streaming :
|
332
336
|
|
333
|
-
```
|
337
|
+
```ruby
|
334
338
|
class Stream
|
335
339
|
def each
|
336
340
|
100.times { |i| yield "#{i}\n" }
|
@@ -341,7 +345,7 @@ get('/') { Stream.new }
|
|
341
345
|
```
|
342
346
|
|
343
347
|
Vous pouvez aussi utiliser le helper `stream` (présenté un peu plus loin) pour
|
344
|
-
éviter
|
348
|
+
éviter les répétitions et intégrer le traitement relatif au streaming dans le bloc
|
345
349
|
de code de la route.
|
346
350
|
|
347
351
|
## Masques de route spécifiques
|
@@ -351,7 +355,7 @@ masques sous forme de chaines de caractères ou des expressions régulières
|
|
351
355
|
pour définir les routes. Mais il est possible de faire bien plus. Vous pouvez
|
352
356
|
facilement définir vos propres masques :
|
353
357
|
|
354
|
-
```
|
358
|
+
```ruby
|
355
359
|
class MasqueToutSauf
|
356
360
|
Masque = Struct.new(:captures)
|
357
361
|
|
@@ -374,19 +378,18 @@ get tout_sauf("/index") do
|
|
374
378
|
end
|
375
379
|
```
|
376
380
|
|
377
|
-
Notez que l'exemple ci-dessus est
|
378
|
-
peut être obtenu avec :
|
381
|
+
Notez que l'exemple ci-dessus est plus compliqué qu'il ne devrait et peut être implémenté de la façon suivante :
|
379
382
|
|
380
|
-
```
|
383
|
+
```ruby
|
381
384
|
get // do
|
382
385
|
pass if request.path_info == "/index"
|
383
386
|
# ...
|
384
387
|
end
|
385
388
|
```
|
386
389
|
|
387
|
-
Ou bien en utilisant
|
390
|
+
Ou bien en utilisant cette expression regulière :
|
388
391
|
|
389
|
-
```
|
392
|
+
```ruby
|
390
393
|
get %r{^(?!/index$)} do
|
391
394
|
# ...
|
392
395
|
end
|
@@ -394,68 +397,64 @@ end
|
|
394
397
|
|
395
398
|
## Fichiers statiques
|
396
399
|
|
397
|
-
Les fichiers du dossier `./public` sont servis de façon statique. Vous
|
398
|
-
avez la possibilité d'utiliser un autre répertoire en définissant le paramètre
|
399
|
-
`:public_folder` :
|
400
|
+
Les fichiers du dossier `./public` sont servis de façon statique. Vous pouvez spécifier un autre dossier avec le paramètre `:public_folder` :
|
400
401
|
|
401
|
-
```
|
402
|
+
```ruby
|
402
403
|
set :public_folder, File.dirname(__FILE__) + '/statique'
|
403
404
|
```
|
404
405
|
|
405
406
|
Notez que le nom du dossier public n'apparait pas dans l'URL. Le fichier
|
406
|
-
`./public/css/style.css` sera
|
407
|
+
`./public/css/style.css` sera accessible à l'URL :
|
407
408
|
`http://exemple.com/css/style.css`.
|
408
409
|
|
409
410
|
Utilisez le paramètre `:static_cache_control` pour ajouter l'information
|
410
|
-
d'en-tête
|
411
|
+
d'en-tête `Cache-Control` (voir plus bas).
|
411
412
|
|
412
413
|
## Vues / Templates
|
413
414
|
|
414
|
-
|
415
|
+
Chaque langage de template est disponible via sa propre méthode de rendu,
|
415
416
|
lesquelles renvoient tout simplement une chaîne de caractères.
|
416
417
|
|
417
|
-
```
|
418
|
+
```ruby
|
418
419
|
get '/' do
|
419
420
|
erb :index
|
420
421
|
end
|
421
422
|
```
|
422
423
|
|
423
|
-
Ceci
|
424
|
+
Ceci génère la vue `views/index.erb`.
|
424
425
|
|
425
426
|
Plutôt que d'utiliser le nom d'un template, vous pouvez directement passer
|
426
427
|
le contenu du template :
|
427
428
|
|
428
|
-
```
|
429
|
+
```ruby
|
429
430
|
get '/' do
|
430
431
|
code = "<%= Time.now %>"
|
431
432
|
erb code
|
432
433
|
end
|
433
434
|
```
|
434
435
|
|
435
|
-
Les méthodes de templates acceptent un
|
436
|
+
Les méthodes de templates acceptent un hash d'options comme second argument :
|
436
437
|
|
437
|
-
```
|
438
|
+
```ruby
|
438
439
|
get '/' do
|
439
440
|
erb :index, :layout => :post
|
440
441
|
end
|
441
442
|
```
|
442
443
|
|
443
|
-
Ceci
|
444
|
-
au *layout* `views/post.erb` (les vues Erb sont intégrées par défaut
|
445
|
-
au *layout* `views/layout.erb` quand ce fichier existe).
|
444
|
+
Ceci génèrera la vue `views/index.erb` en l'intégrant au *layout* `views/post.erb` (`views/layout.erb` est la valeur par défaut si ce fichier existe).
|
446
445
|
|
447
446
|
Toute option que Sinatra ne comprend pas sera passée au moteur de rendu :
|
448
447
|
|
449
|
-
```
|
448
|
+
```ruby
|
450
449
|
get '/' do
|
451
450
|
haml :index, :format => :html5
|
452
451
|
end
|
453
452
|
```
|
454
453
|
|
455
|
-
Vous pouvez également définir
|
454
|
+
Vous pouvez également définir les options de chaque langage de template de façon
|
456
455
|
générale :
|
457
456
|
|
458
|
-
```
|
457
|
+
```ruby
|
459
458
|
set :haml, :format => html5
|
460
459
|
|
461
460
|
get '/' do
|
@@ -463,8 +462,7 @@ get '/' do
|
|
463
462
|
end
|
464
463
|
```
|
465
464
|
|
466
|
-
Les
|
467
|
-
définies au moyen de `set`.
|
465
|
+
Les arguments passés à la méthode de rendu prennent le pas sur les options définies au moyen de `set`.
|
468
466
|
|
469
467
|
Options disponibles :
|
470
468
|
|
@@ -478,7 +476,7 @@ Options disponibles :
|
|
478
476
|
|
479
477
|
<dt>default_encoding</dt>
|
480
478
|
<dd>
|
481
|
-
Encodage de caractères à utiliser en cas d'incertitude. Par défaut
|
479
|
+
Encodage de caractères à utiliser en cas d'incertitude. Par défaut
|
482
480
|
<tt>settings.default_encoding</tt>.
|
483
481
|
</dd>
|
484
482
|
|
@@ -491,19 +489,18 @@ Options disponibles :
|
|
491
489
|
<dt>layout</dt>
|
492
490
|
<dd>
|
493
491
|
S'il faut ou non utiliser un layout (<tt>true</tt> ou <tt>false</tt>).
|
494
|
-
|
492
|
+
Ou indique le template à utiliser lorsque c'est un symbole. Exemple :
|
495
493
|
<tt>erb :index, :layout => !request.xhr?</tt>.
|
496
494
|
</dd>
|
497
495
|
|
498
496
|
<dt>content_type</dt>
|
499
497
|
<dd>
|
500
|
-
Content-Type que le template
|
501
|
-
template.
|
498
|
+
Content-Type que le template génère. La valeur par défaut dépend du langage de template.
|
502
499
|
</dd>
|
503
500
|
|
504
501
|
<dt>scope</dt>
|
505
502
|
<dd>
|
506
|
-
Contexte
|
503
|
+
Contexte dans lequel effectuer le rendu du template. Par défaut il s'agit
|
507
504
|
de l'instance de l'application. Si vous changez cela, les variables
|
508
505
|
d'instance et les méthodes utilitaires ne seront pas disponibles.
|
509
506
|
</dd>
|
@@ -517,7 +514,7 @@ Options disponibles :
|
|
517
514
|
|
518
515
|
<dt>layout_options</dt>
|
519
516
|
<dd>
|
520
|
-
Options spécifiques
|
517
|
+
Options spécifiques à la génération du layout. Exemple : <tt>set :rdoc,
|
521
518
|
:layout_options => { :views => 'views/layouts' }</tt>
|
522
519
|
</dd>
|
523
520
|
</dl>
|
@@ -525,7 +522,7 @@ Options disponibles :
|
|
525
522
|
Les templates sont supposés se trouver directement dans le dossier
|
526
523
|
`./views`. Pour utiliser un dossier de vues différent :
|
527
524
|
|
528
|
-
```
|
525
|
+
```ruby
|
529
526
|
set :views, settings.root + '/templates'
|
530
527
|
```
|
531
528
|
|
@@ -537,13 +534,13 @@ caractères au lieu de les considérer comme un chemin vers un fichier.
|
|
537
534
|
|
538
535
|
### Templates littéraux
|
539
536
|
|
540
|
-
```
|
537
|
+
```ruby
|
541
538
|
get '/' do
|
542
539
|
haml '%div.title Bonjour le monde'
|
543
540
|
end
|
544
541
|
```
|
545
542
|
|
546
|
-
|
543
|
+
Utilisera la chaine de caractères comme template pour générer la réponse.
|
547
544
|
|
548
545
|
### Langages de template disponibles
|
549
546
|
|
@@ -551,7 +548,7 @@ Certains langages ont plusieurs implémentations. Pour préciser l'implémentati
|
|
551
548
|
à utiliser (et garantir l'aspect thread-safe), vous devez simplement l'avoir
|
552
549
|
chargée au préalable :
|
553
550
|
|
554
|
-
```
|
551
|
+
```ruby
|
555
552
|
require 'rdiscount' # ou require 'bluecloth'
|
556
553
|
get('/') { markdown :index }
|
557
554
|
```
|
@@ -620,7 +617,7 @@ exemple).
|
|
620
617
|
<table>
|
621
618
|
<tr>
|
622
619
|
<td>Dépendances</td>
|
623
|
-
<td><a href="http://nokogiri.org/" title="nokogiri">nokogiri</a></td>
|
620
|
+
<td><a href="http://www.nokogiri.org/" title="nokogiri">nokogiri</a></td>
|
624
621
|
</tr>
|
625
622
|
<tr>
|
626
623
|
<td>Extensions de fichier</td>
|
@@ -676,7 +673,7 @@ exemple).
|
|
676
673
|
<table>
|
677
674
|
<tr>
|
678
675
|
<td>Dépendances</td>
|
679
|
-
<td><a href="http://
|
676
|
+
<td><a href="http://lesscss.org/" title="less">less</a></td>
|
680
677
|
</tr>
|
681
678
|
<tr>
|
682
679
|
<td>Extensions de fichier</td>
|
@@ -694,7 +691,7 @@ exemple).
|
|
694
691
|
<table>
|
695
692
|
<tr>
|
696
693
|
<td>Dépendances</td>
|
697
|
-
<td><a href="http://
|
694
|
+
<td><a href="http://liquidmarkup.org/" title="liquid">liquid</a></td>
|
698
695
|
</tr>
|
699
696
|
<tr>
|
700
697
|
<td>Extensions de fichier</td>
|
@@ -717,7 +714,7 @@ locales.
|
|
717
714
|
<td><p>Dépendances</p></td>
|
718
715
|
<td>
|
719
716
|
Au choix :
|
720
|
-
<a href="https://github.com/
|
717
|
+
<a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
|
721
718
|
<a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
|
722
719
|
<a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
|
723
720
|
<a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
|
@@ -736,22 +733,21 @@ locales.
|
|
736
733
|
</table>
|
737
734
|
|
738
735
|
Il n’est pas possible d’appeler des méthodes depuis markdown, ni de
|
739
|
-
lui passer
|
736
|
+
lui passer de variables locales. Par conséquent, il sera souvent utilisé
|
740
737
|
en combinaison avec un autre moteur de rendu :
|
741
738
|
|
742
|
-
```
|
743
|
-
erb :
|
739
|
+
```ruby
|
740
|
+
erb :accueil, :locals => { :text => markdown(:introduction) }
|
744
741
|
```
|
745
742
|
|
746
|
-
Notez que vous pouvez également appeler la méthode `markdown`
|
747
|
-
sein d’autres templates :
|
743
|
+
Notez que vous pouvez également appeler la méthode `markdown` depuis un autre template :
|
748
744
|
|
749
|
-
```
|
750
|
-
%h1
|
751
|
-
%p= markdown(:
|
745
|
+
```ruby
|
746
|
+
%h1 Bonjour depuis Haml !
|
747
|
+
%p= markdown(:bienvenue)
|
752
748
|
```
|
753
749
|
|
754
|
-
Comme vous ne pouvez pas appeler de Ruby
|
750
|
+
Comme vous ne pouvez pas appeler de méthode Ruby depuis Markdown, vous ne
|
755
751
|
pouvez pas utiliser de layouts écrits en Markdown. Toutefois, il
|
756
752
|
est possible d’utiliser un moteur de rendu différent pour le template et
|
757
753
|
pour le layout en utilisant l’option `:layout_engine`.
|
@@ -773,23 +769,22 @@ pour le layout en utilisant l’option `:layout_engine`.
|
|
773
769
|
</tr>
|
774
770
|
</table>
|
775
771
|
|
776
|
-
Il n’est pas possible d’appeler
|
777
|
-
passer
|
772
|
+
Il n’est pas possible d’appeler de méthodes depuis textile, ni de lui
|
773
|
+
passer de variables locales. Par conséquent, il sera souvent utilisé en
|
778
774
|
combinaison avec un autre moteur de rendu :
|
779
775
|
|
780
|
-
```
|
781
|
-
erb :
|
776
|
+
```ruby
|
777
|
+
erb :accueil, :locals => { :text => textile(:introduction) }
|
782
778
|
```
|
783
779
|
|
784
|
-
Notez que vous pouvez également appeler la méthode `textile`
|
785
|
-
sein d’autres templates :
|
780
|
+
Notez que vous pouvez également appeler la méthode `textile` depuis un autre template :
|
786
781
|
|
787
|
-
```
|
788
|
-
%h1
|
789
|
-
%p= textile(:
|
782
|
+
```ruby
|
783
|
+
%h1 Bonjour depuis Haml !
|
784
|
+
%p= textile(:bienvenue)
|
790
785
|
```
|
791
786
|
|
792
|
-
Comme vous ne pouvez pas appeler de Ruby
|
787
|
+
Comme vous ne pouvez pas appeler de méthode Ruby depuis Textile, vous ne pouvez
|
793
788
|
pas utiliser de layouts écrits en Textile. Toutefois, il est
|
794
789
|
possible d’utiliser un moteur de rendu différent pour le template et
|
795
790
|
pour le layout en utilisant l’option `:layout_engine`.
|
@@ -811,23 +806,22 @@ pour le layout en utilisant l’option `:layout_engine`.
|
|
811
806
|
</tr>
|
812
807
|
</table>
|
813
808
|
|
814
|
-
Il n’est pas possible d’appeler
|
815
|
-
passer
|
809
|
+
Il n’est pas possible d’appeler de méthodes Ruby depuis rdoc, ni de lui
|
810
|
+
passer de variables locales. Par conséquent, il sera souvent utilisé en
|
816
811
|
combinaison avec un autre moteur de rendu :
|
817
812
|
|
818
|
-
```
|
819
|
-
erb :
|
813
|
+
```ruby
|
814
|
+
erb :accueil, :locals => { :text => rdoc(:introduction) }
|
820
815
|
```
|
821
816
|
|
822
|
-
Notez que vous pouvez également appeler la méthode `rdoc`
|
823
|
-
d’autres templates :
|
817
|
+
Notez que vous pouvez également appeler la méthode `rdoc` depuis un autre template :
|
824
818
|
|
825
|
-
```
|
826
|
-
%h1
|
827
|
-
%p= rdoc(:
|
819
|
+
```ruby
|
820
|
+
%h1 Bonjour depuis Haml !
|
821
|
+
%p= rdoc(:bienvenue)
|
828
822
|
```
|
829
823
|
|
830
|
-
Comme vous ne pouvez pas appeler de Ruby
|
824
|
+
Comme vous ne pouvez pas appeler de méthodes Ruby depuis RDoc, vous ne pouvez
|
831
825
|
pas utiliser de layouts écrits en RDoc. Toutefois, il est
|
832
826
|
possible d’utiliser un moteur de rendu différent pour le template et
|
833
827
|
pour le layout en utilisant l’option `:layout_engine`.
|
@@ -856,7 +850,7 @@ Radius, vous aurez sûrement à lui passer des variables locales.
|
|
856
850
|
<table>
|
857
851
|
<tr>
|
858
852
|
<td>Dépendances</td>
|
859
|
-
<td><a href="http://markaby.github.
|
853
|
+
<td><a href="http://markaby.github.io/" title="Markaby">Markaby</a></td>
|
860
854
|
</tr>
|
861
855
|
<tr>
|
862
856
|
<td>Extensions de fichier</td>
|
@@ -922,23 +916,22 @@ exemple).
|
|
922
916
|
</tr>
|
923
917
|
</table>
|
924
918
|
|
925
|
-
Il n'est pas possible d'appeler
|
926
|
-
passer
|
919
|
+
Il n'est pas possible d'appeler de méthodes Ruby depuis creole, ni de lui
|
920
|
+
passer de variables locales. Par conséquent, il sera souvent utilisé en
|
927
921
|
combinaison avec un autre moteur de rendu :
|
928
922
|
|
929
|
-
```
|
930
|
-
erb :
|
923
|
+
```ruby
|
924
|
+
erb :accueil, :locals => { :text => markdown(:introduction) }
|
931
925
|
```
|
932
926
|
|
933
|
-
Notez que vous pouvez également appeler la méthode `creole`
|
934
|
-
templates :
|
927
|
+
Notez que vous pouvez également appeler la méthode `creole` depuis un autre template :
|
935
928
|
|
936
|
-
```
|
937
|
-
%h1
|
938
|
-
%p= creole(:
|
929
|
+
```ruby
|
930
|
+
%h1 Bonjour depuis Haml !
|
931
|
+
%p= creole(:bienvenue)
|
939
932
|
```
|
940
933
|
|
941
|
-
Comme vous ne pouvez pas appeler de Ruby
|
934
|
+
Comme vous ne pouvez pas appeler de méthodes Ruby depuis Creole, vous ne pouvez
|
942
935
|
pas utiliser de layouts écrits en Creole. Toutefois, il est possible
|
943
936
|
d'utiliser un moteur de rendu différent pour le template et pour le layout
|
944
937
|
en utilisant l'option `:layout_engine`.
|
@@ -974,7 +967,7 @@ en utilisant l'option `:layout_engine`.
|
|
974
967
|
<tr>
|
975
968
|
<td>Dépendances</td>
|
976
969
|
<td>
|
977
|
-
<a href="https://github.com/
|
970
|
+
<a href="https://github.com/forgecrafted/ruby-stylus" title="Ruby Stylus">
|
978
971
|
Stylus
|
979
972
|
</a>
|
980
973
|
et un
|
@@ -996,7 +989,7 @@ en utilisant l'option `:layout_engine`.
|
|
996
989
|
Avant de pouvoir utiliser des templates Stylus, vous devez auparavant charger
|
997
990
|
`stylus` et `stylus/tilt` :
|
998
991
|
|
999
|
-
```
|
992
|
+
```ruby
|
1000
993
|
require 'sinatra'
|
1001
994
|
require 'stylus'
|
1002
995
|
require 'stylus/tilt'
|
@@ -1021,15 +1014,15 @@ end
|
|
1021
1014
|
</tr>
|
1022
1015
|
<tr>
|
1023
1016
|
<td>Exemple</td>
|
1024
|
-
<td><tt>yajl :index, :locals => { :key => 'qux' }, :callback => 'present', :variable => '
|
1017
|
+
<td><tt>yajl :index, :locals => { :key => 'qux' }, :callback => 'present', :variable => 'ressource'</tt></p>
|
1025
1018
|
</td>
|
1026
1019
|
</tr>
|
1027
1020
|
</table>
|
1028
1021
|
|
1029
|
-
|
1022
|
+
La source du template est évaluée en tant que chaine Ruby, puis la
|
1030
1023
|
variable json obtenue est convertie avec #to_json.
|
1031
1024
|
|
1032
|
-
```
|
1025
|
+
```ruby
|
1033
1026
|
json = { :foo => 'bar' }
|
1034
1027
|
json[:baz] = key
|
1035
1028
|
```
|
@@ -1037,8 +1030,8 @@ json[:baz] = key
|
|
1037
1030
|
Les options `:callback` et `:variable` peuvent être utilisées pour décorer
|
1038
1031
|
l’objet retourné.
|
1039
1032
|
|
1040
|
-
```
|
1041
|
-
var
|
1033
|
+
```ruby
|
1034
|
+
var ressource = {"foo":"bar","baz":"qux"}; present(ressource);</pre>
|
1042
1035
|
```
|
1043
1036
|
|
1044
1037
|
#### Templates WLang
|
@@ -1059,7 +1052,7 @@ var resource = {"foo":"bar","baz":"qux"}; present(resource);</pre>
|
|
1059
1052
|
</table>
|
1060
1053
|
|
1061
1054
|
L’appel de code ruby au sein des templates n’est pas idiomatique en wlang.
|
1062
|
-
L’écriture de templates sans logique est
|
1055
|
+
L’écriture de templates sans logique est encouragée, via le passage de variables
|
1063
1056
|
locales. Il est néanmoins possible d’écrire un layout en wlang et d’y utiliser
|
1064
1057
|
`yield`.
|
1065
1058
|
|
@@ -1069,7 +1062,7 @@ Un template est évalué dans le même contexte que l'endroit d'où il a été
|
|
1069
1062
|
appelé (gestionnaire de route). Les variables d'instance déclarées dans le
|
1070
1063
|
gestionnaire de route sont directement accessibles dans le template :
|
1071
1064
|
|
1072
|
-
```
|
1065
|
+
```ruby
|
1073
1066
|
get '/:id' do
|
1074
1067
|
@foo = Foo.find(params['id'])
|
1075
1068
|
haml '%h1= @foo.nom'
|
@@ -1078,17 +1071,14 @@ end
|
|
1078
1071
|
|
1079
1072
|
Alternativement, on peut passer un hash contenant des variables locales :
|
1080
1073
|
|
1081
|
-
```
|
1074
|
+
```ruby
|
1082
1075
|
get '/:id' do
|
1083
1076
|
foo = Foo.find(params['id'])
|
1084
1077
|
haml '%h1= foo.nom', :locals => { :foo => foo }
|
1085
1078
|
end
|
1086
1079
|
```
|
1087
1080
|
|
1088
|
-
Ceci est généralement
|
1089
|
-
partiel (depuis un autre template) et qu'il est donc nécessaire d'adapter les
|
1090
|
-
noms de variables.
|
1091
|
-
|
1081
|
+
Ceci est généralement nécessaire lorsque l'on veut utiliser un template depuis un autre template (partiel) et qu'il faut donc adapter le nom des variables.
|
1092
1082
|
|
1093
1083
|
### Templates avec `yield` et layouts imbriqués
|
1094
1084
|
|
@@ -1096,30 +1086,30 @@ En général, un layout est un simple template qui appelle `yield`. Ce genre de
|
|
1096
1086
|
template peut s'utiliser via l'option `:template` comme décrit précédemment ou
|
1097
1087
|
peut être rendu depuis un bloc :
|
1098
1088
|
|
1099
|
-
```
|
1089
|
+
```ruby
|
1100
1090
|
erb :post, :layout => false do
|
1101
1091
|
erb :index
|
1102
1092
|
end
|
1103
1093
|
```
|
1104
1094
|
|
1105
|
-
Ce code est
|
1095
|
+
Ce code est plus ou moins équivalent à `erb :index, :layout => :post`.
|
1106
1096
|
|
1107
1097
|
Le fait de passer des blocs aux méthodes de rendu est particulièrement utile
|
1108
1098
|
pour gérer des templates imbriqués :
|
1109
1099
|
|
1110
|
-
```
|
1111
|
-
erb :
|
1112
|
-
erb :
|
1113
|
-
erb :
|
1100
|
+
```ruby
|
1101
|
+
erb :layout_principal, :layout => false do
|
1102
|
+
erb :layout_admin do
|
1103
|
+
erb :utilisateur
|
1114
1104
|
end
|
1115
1105
|
end
|
1116
1106
|
```
|
1117
1107
|
|
1118
|
-
|
1108
|
+
Ou plus brièvement :
|
1119
1109
|
|
1120
|
-
```
|
1121
|
-
erb :
|
1122
|
-
erb :
|
1110
|
+
```ruby
|
1111
|
+
erb :layout_admin, :layout => :layout_principal do
|
1112
|
+
erb :utilisateur
|
1123
1113
|
end
|
1124
1114
|
```
|
1125
1115
|
|
@@ -1132,7 +1122,7 @@ un bloc.
|
|
1132
1122
|
|
1133
1123
|
Des templates peuvent être définis dans le fichier source comme ceci :
|
1134
1124
|
|
1135
|
-
```
|
1125
|
+
```ruby
|
1136
1126
|
require 'sinatra'
|
1137
1127
|
|
1138
1128
|
get '/' do
|
@@ -1159,7 +1149,7 @@ fichiers source, il faut explicitement les déclarer avec
|
|
1159
1149
|
|
1160
1150
|
Les templates peuvent aussi être définis grâce à la méthode de haut niveau `template` :
|
1161
1151
|
|
1162
|
-
```
|
1152
|
+
```ruby
|
1163
1153
|
template :layout do
|
1164
1154
|
"%html\n =yield\n"
|
1165
1155
|
end
|
@@ -1178,7 +1168,7 @@ template sera affiché. Vous pouvez désactivez les layouts au cas par cas en
|
|
1178
1168
|
passant `:layout => false` ou bien les désactiver par défaut au moyen
|
1179
1169
|
de `set :haml, :layout => false` :
|
1180
1170
|
|
1181
|
-
```
|
1171
|
+
```ruby
|
1182
1172
|
get '/' do
|
1183
1173
|
haml :index, :layout => !request.xhr?
|
1184
1174
|
end
|
@@ -1190,7 +1180,7 @@ Pour associer une extension de fichier avec un moteur de rendu, utilisez
|
|
1190
1180
|
`Tilt.register`. Par exemple, si vous désirez utiliser l'extension
|
1191
1181
|
de fichier `tt` pour les templates Textile, vous pouvez faire comme suit :
|
1192
1182
|
|
1193
|
-
```
|
1183
|
+
```ruby
|
1194
1184
|
Tilt.register :tt, Tilt[:textile]
|
1195
1185
|
```
|
1196
1186
|
|
@@ -1199,8 +1189,8 @@ Tilt.register :tt, Tilt[:textile]
|
|
1199
1189
|
En premier lieu, déclarez votre moteur de rendu avec Tilt, ensuite créez
|
1200
1190
|
votre méthode de rendu :
|
1201
1191
|
|
1202
|
-
```
|
1203
|
-
Tilt.register :monmoteur,
|
1192
|
+
```ruby
|
1193
|
+
Tilt.register :monmoteur, MonMerveilleuxMoteurDeRendu
|
1204
1194
|
|
1205
1195
|
helpers do
|
1206
1196
|
def monmoteur(*args) render(:monmoteur, *args) end
|
@@ -1211,16 +1201,16 @@ get '/' do
|
|
1211
1201
|
end
|
1212
1202
|
```
|
1213
1203
|
|
1214
|
-
Utilisera `./views/index.monmoteur`. Voir [le
|
1204
|
+
Utilisera `./views/index.monmoteur`. Voir [le projet Github](https://github.com/rtomayko/tilt) pour en savoir plus sur Tilt.
|
1215
1205
|
|
1216
1206
|
## Filtres
|
1217
1207
|
|
1218
|
-
Les filtres before sont exécutés avant chaque requête, dans le même contexte
|
1208
|
+
Les filtres `before` sont exécutés avant chaque requête, dans le même contexte
|
1219
1209
|
que les routes, et permettent de modifier la requête et sa réponse. Les
|
1220
1210
|
variables d'instance déclarées dans les filtres sont accessibles au niveau
|
1221
1211
|
des routes et des templates :
|
1222
1212
|
|
1223
|
-
```
|
1213
|
+
```ruby
|
1224
1214
|
before do
|
1225
1215
|
@note = 'Coucou !'
|
1226
1216
|
request.path_info = '/foo/bar/baz'
|
@@ -1232,25 +1222,25 @@ get '/foo/*' do
|
|
1232
1222
|
end
|
1233
1223
|
```
|
1234
1224
|
|
1235
|
-
Les filtres after sont exécutés après chaque requête à l'intérieur du même
|
1225
|
+
Les filtres `after` sont exécutés après chaque requête à l'intérieur du même
|
1236
1226
|
contexte et permettent de modifier la requête et sa réponse. Les variables
|
1237
|
-
d'instance déclarées dans les filtres before ou les routes sont accessibles
|
1238
|
-
au niveau des filtres after :
|
1227
|
+
d'instance déclarées dans les filtres `before` ou les routes sont accessibles
|
1228
|
+
au niveau des filtres `after` :
|
1239
1229
|
|
1240
|
-
```
|
1230
|
+
```ruby
|
1241
1231
|
after do
|
1242
1232
|
puts response.status
|
1243
1233
|
end
|
1244
1234
|
```
|
1245
1235
|
|
1246
|
-
Note : Le corps de la réponse n'est pas disponible au niveau du filtre after
|
1236
|
+
Note : Le corps de la réponse n'est pas disponible au niveau du filtre `after`
|
1247
1237
|
car il ne sera généré que plus tard (sauf dans le cas où vous utilisez la
|
1248
1238
|
méthode `body` au lieu de simplement renvoyer une chaine depuis vos routes).
|
1249
1239
|
|
1250
1240
|
Les filtres peuvent être associés à un masque, ce qui permet de limiter leur
|
1251
1241
|
exécution aux cas où la requête correspond à ce masque :
|
1252
1242
|
|
1253
|
-
```
|
1243
|
+
```ruby
|
1254
1244
|
before '/secret/*' do
|
1255
1245
|
authentification!
|
1256
1246
|
end
|
@@ -1262,7 +1252,7 @@ end
|
|
1262
1252
|
|
1263
1253
|
Tout comme les routes, les filtres acceptent également des conditions :
|
1264
1254
|
|
1265
|
-
```
|
1255
|
+
```ruby
|
1266
1256
|
before :agent => /Songbird/ do
|
1267
1257
|
# ...
|
1268
1258
|
end
|
@@ -1274,10 +1264,10 @@ end
|
|
1274
1264
|
|
1275
1265
|
## Helpers
|
1276
1266
|
|
1277
|
-
Utilisez la méthode de haut niveau `helpers` pour définir des
|
1267
|
+
Utilisez la méthode de haut niveau `helpers` pour définir des méthodes
|
1278
1268
|
qui seront accessibles dans vos gestionnaires de route et dans vos templates :
|
1279
1269
|
|
1280
|
-
```
|
1270
|
+
```ruby
|
1281
1271
|
helpers do
|
1282
1272
|
def bar(nom)
|
1283
1273
|
"#{nom}bar"
|
@@ -1291,7 +1281,7 @@ end
|
|
1291
1281
|
|
1292
1282
|
Vous pouvez aussi définir les méthodes helper dans un module séparé :
|
1293
1283
|
|
1294
|
-
```
|
1284
|
+
```ruby
|
1295
1285
|
module FooUtils
|
1296
1286
|
def foo(nom) "#{nom}foo" end
|
1297
1287
|
end
|
@@ -1308,17 +1298,17 @@ l'application.
|
|
1308
1298
|
|
1309
1299
|
### Utiliser les sessions
|
1310
1300
|
|
1311
|
-
|
1301
|
+
Les sessions sont utilisées pour conserver un état entre les requêtes. Une fois
|
1312
1302
|
activées, vous avez un hash de session par session utilisateur :
|
1313
1303
|
|
1314
|
-
```
|
1304
|
+
```ruby
|
1315
1305
|
enable :sessions
|
1316
1306
|
|
1317
1307
|
get '/' do
|
1318
1308
|
"valeur = " << session['valeur'].inspect
|
1319
1309
|
end
|
1320
1310
|
|
1321
|
-
get '/:
|
1311
|
+
get '/:valeur' do
|
1322
1312
|
session['valeur'] = params['valeur']
|
1323
1313
|
end
|
1324
1314
|
```
|
@@ -1330,14 +1320,14 @@ quel middleware Rack de session afin d'éviter cela. N'utilisez **pas**
|
|
1330
1320
|
`enable :sessions` dans ce cas mais chargez le middleware de votre
|
1331
1321
|
choix comme vous le feriez pour n'importe quel autre middleware :
|
1332
1322
|
|
1333
|
-
```
|
1323
|
+
```ruby
|
1334
1324
|
use Rack::Session::Pool, :expire_after => 2592000
|
1335
1325
|
|
1336
1326
|
get '/' do
|
1337
1327
|
"valeur = " << session['valeur'].inspect
|
1338
1328
|
end
|
1339
1329
|
|
1340
|
-
get '/:
|
1330
|
+
get '/:valeur' do
|
1341
1331
|
session['valeur'] = params['valeur']
|
1342
1332
|
end
|
1343
1333
|
```
|
@@ -1348,21 +1338,21 @@ hasard par Sinatra. Toutefois, comme cette clé change à chaque démarrage de
|
|
1348
1338
|
votre application, vous pouvez définir cette clé vous-même afin que toutes
|
1349
1339
|
les instances de votre application la partage :
|
1350
1340
|
|
1351
|
-
```
|
1341
|
+
```ruby
|
1352
1342
|
set :session_secret, 'super secret'
|
1353
1343
|
```
|
1354
1344
|
|
1355
1345
|
Si vous souhaitez avoir plus de contrôle, vous pouvez également enregistrer un
|
1356
1346
|
hash avec des options lors de la configuration de `sessions` :
|
1357
1347
|
|
1358
|
-
```
|
1348
|
+
```ruby
|
1359
1349
|
set :sessions, :domain => 'foo.com'
|
1360
1350
|
```
|
1361
1351
|
|
1362
|
-
Pour que les différents sous-domaines de foo.com
|
1363
|
-
vous devez
|
1352
|
+
Pour que les différents sous-domaines de foo.com puissent partager une session,
|
1353
|
+
vous devez précéder le domaine d'un *.* (point) :
|
1364
1354
|
|
1365
|
-
```
|
1355
|
+
```ruby
|
1366
1356
|
set :sessions, :domain => '.foo.com'
|
1367
1357
|
```
|
1368
1358
|
|
@@ -1372,37 +1362,37 @@ set :sessions, :domain => '.foo.com'
|
|
1372
1362
|
Pour arrêter immédiatement la requête dans un filtre ou un gestionnaire de
|
1373
1363
|
route :
|
1374
1364
|
|
1375
|
-
```
|
1365
|
+
```ruby
|
1376
1366
|
halt
|
1377
1367
|
```
|
1378
1368
|
|
1379
1369
|
Vous pouvez aussi passer le code retour ...
|
1380
1370
|
|
1381
|
-
```
|
1371
|
+
```ruby
|
1382
1372
|
halt 410
|
1383
1373
|
```
|
1384
1374
|
|
1385
1375
|
Ou le texte ...
|
1386
1376
|
|
1387
|
-
```
|
1377
|
+
```ruby
|
1388
1378
|
halt 'Ceci est le texte'
|
1389
1379
|
```
|
1390
1380
|
|
1391
1381
|
Ou les deux ...
|
1392
1382
|
|
1393
|
-
```
|
1383
|
+
```ruby
|
1394
1384
|
halt 401, 'Partez !'
|
1395
1385
|
```
|
1396
1386
|
|
1397
|
-
Ainsi que les
|
1387
|
+
Ainsi que les en-têtes ...
|
1398
1388
|
|
1399
|
-
```
|
1389
|
+
```ruby
|
1400
1390
|
halt 402, {'Content-Type' => 'text/plain'}, 'revanche'
|
1401
1391
|
```
|
1402
1392
|
|
1403
1393
|
Bien sûr il est possible de combiner un template avec `halt` :
|
1404
1394
|
|
1405
|
-
```
|
1395
|
+
```ruby
|
1406
1396
|
halt erb(:erreur)
|
1407
1397
|
```
|
1408
1398
|
|
@@ -1411,7 +1401,7 @@ halt erb(:erreur)
|
|
1411
1401
|
Une route peut passer le relais aux autres routes qui correspondent également
|
1412
1402
|
avec `pass` :
|
1413
1403
|
|
1414
|
-
```
|
1404
|
+
```ruby
|
1415
1405
|
get '/devine/:qui' do
|
1416
1406
|
pass unless params['qui'] == 'Frank'
|
1417
1407
|
"Tu m'as eu !"
|
@@ -1432,7 +1422,7 @@ Parfois, `pass` n'est pas ce que vous recherchez, au lieu de cela vous
|
|
1432
1422
|
souhaitez obtenir le résultat d'une autre route. Pour cela, utilisez
|
1433
1423
|
simplement `call` :
|
1434
1424
|
|
1435
|
-
```
|
1425
|
+
```ruby
|
1436
1426
|
get '/foo' do
|
1437
1427
|
status, headers, body = call env.merge("PATH_INFO" => '/bar')
|
1438
1428
|
[status, headers, body.map(&:upcase)]
|
@@ -1447,14 +1437,14 @@ Notez que dans l'exemple ci-dessus, vous faciliterez les tests et améliorerez
|
|
1447
1437
|
la performance en déplaçant simplement `"bar"` dans un helper
|
1448
1438
|
utilisé à la fois par `/foo` et `/bar`.
|
1449
1439
|
|
1450
|
-
Si vous
|
1440
|
+
Si vous souhaitez que la requête soit envoyée à la même instance de
|
1451
1441
|
l'application plutôt qu'à une copie, utilisez `call!` au lieu de
|
1452
1442
|
`call`.
|
1453
1443
|
|
1454
1444
|
Lisez la spécification Rack si vous souhaitez en savoir plus sur
|
1455
1445
|
`call`.
|
1456
1446
|
|
1457
|
-
### Définir le corps, le code retour et les
|
1447
|
+
### Définir le corps, le code retour et les en-têtes
|
1458
1448
|
|
1459
1449
|
Il est possible et recommandé de définir le code retour et le corps de la
|
1460
1450
|
réponse au moyen de la valeur de retour d'un bloc définissant une route.
|
@@ -1463,7 +1453,7 @@ le coprs de la réponse à un moment arbitraire de l'exécution. Vous pouvez le
|
|
1463
1453
|
faire au moyen de la méthode `body`. Si vous faites ainsi, vous pouvez alors
|
1464
1454
|
utiliser cette même méthode pour accéder au corps de la réponse :
|
1465
1455
|
|
1466
|
-
```
|
1456
|
+
```ruby
|
1467
1457
|
get '/foo' do
|
1468
1458
|
body "bar"
|
1469
1459
|
end
|
@@ -1478,9 +1468,9 @@ gestionnaire Rack (ceci peut être utilisé pour implémenter un streaming,
|
|
1478
1468
|
voir "Valeurs de retour").
|
1479
1469
|
|
1480
1470
|
Pareillement au corps de la réponse, vous pouvez également définir le code
|
1481
|
-
retour et les
|
1471
|
+
retour et les en-têtes :
|
1482
1472
|
|
1483
|
-
```
|
1473
|
+
```ruby
|
1484
1474
|
get '/foo' do
|
1485
1475
|
status 418
|
1486
1476
|
headers \
|
@@ -1490,7 +1480,7 @@ get '/foo' do
|
|
1490
1480
|
end
|
1491
1481
|
```
|
1492
1482
|
|
1493
|
-
Comme `body
|
1483
|
+
Comme pour `body`, `headers` et `status` peuvent être utilisés sans arguments
|
1494
1484
|
pour accéder à leurs valeurs.
|
1495
1485
|
|
1496
1486
|
### Faire du streaming
|
@@ -1498,10 +1488,10 @@ pour accéder à leurs valeurs.
|
|
1498
1488
|
Il y a des cas où vous voulez commencer à renvoyer des données pendant que
|
1499
1489
|
vous êtes en train de générer le reste de la réponse. Dans les cas les plus
|
1500
1490
|
extrèmes, vous souhaitez continuer à envoyer des données tant que le client
|
1501
|
-
n'abandonne pas la
|
1491
|
+
n'abandonne pas la connexion. Vous pouvez alors utiliser le helper `stream`
|
1502
1492
|
pour éviter de créer votre propre système :
|
1503
1493
|
|
1504
|
-
```
|
1494
|
+
```ruby
|
1505
1495
|
get '/' do
|
1506
1496
|
stream do |out|
|
1507
1497
|
out << "Ca va être hallu -\n"
|
@@ -1514,25 +1504,25 @@ end
|
|
1514
1504
|
```
|
1515
1505
|
|
1516
1506
|
Cela permet d'implémenter des API de streaming ou de
|
1517
|
-
[Server Sent Events](
|
1518
|
-
base pour des [WebSockets](
|
1507
|
+
[Server Sent Events](https://w3c.github.io/eventsource/) et peut servir de
|
1508
|
+
base pour des [WebSockets](https://en.wikipedia.org/wiki/WebSocket). Vous
|
1519
1509
|
pouvez aussi l'employer pour augmenter le débit quand une partie du contenu
|
1520
|
-
provient d'une
|
1510
|
+
provient d'une ressource lente.
|
1521
1511
|
|
1522
1512
|
Le fonctionnement du streaming, notamment le nombre de requêtes simultanées,
|
1523
1513
|
dépend énormément du serveur web utilisé. Certains ne prennent pas du tout en
|
1524
|
-
charge le streaming
|
1525
|
-
|
1526
|
-
|
1527
|
-
|
1514
|
+
charge le streaming. Lorsque le serveur ne gère pas le streaming, la partie
|
1515
|
+
body de la réponse sera envoyée au client en une seule fois, après
|
1516
|
+
l'exécution du bloc passé au helper `stream`. Le streaming ne
|
1517
|
+
fonctionne pas du tout avec Shotgun.
|
1528
1518
|
|
1529
|
-
En utilisant le helper stream avec le paramètre `keep_open`, il n'appelera
|
1519
|
+
En utilisant le helper `stream` avec le paramètre `keep_open`, il n'appelera
|
1530
1520
|
pas la méthode `close` du flux, vous laissant la possibilité de le fermer à
|
1531
1521
|
tout moment au cours de l'exécution. Ceci ne fonctionne qu'avec les serveurs
|
1532
1522
|
evented (ie non threadés) tels que Thin et Rainbows. Les autres serveurs
|
1533
1523
|
fermeront malgré tout le flux :
|
1534
1524
|
|
1535
|
-
```
|
1525
|
+
```ruby
|
1536
1526
|
# interrogation prolongée
|
1537
1527
|
|
1538
1528
|
set :server, :thin
|
@@ -1566,7 +1556,7 @@ end
|
|
1566
1556
|
Dans le contexte de la requête, la méthode utilitaire `logger` expose une
|
1567
1557
|
instance de `Logger` :
|
1568
1558
|
|
1569
|
-
```
|
1559
|
+
```ruby
|
1570
1560
|
get '/' do
|
1571
1561
|
logger.info "chargement des données"
|
1572
1562
|
# ...
|
@@ -1582,7 +1572,7 @@ Notez que la journalisation est seulement activée par défaut pour
|
|
1582
1572
|
`Sinatra::Application`, donc si vous héritez de `>Sinatra::Base`,
|
1583
1573
|
vous aurez à l'activer vous-même :
|
1584
1574
|
|
1585
|
-
```
|
1575
|
+
```ruby
|
1586
1576
|
class MonApp < Sinatra::Base
|
1587
1577
|
configure :production, :development do
|
1588
1578
|
enable :logging
|
@@ -1601,7 +1591,7 @@ Quand vous utilisez `send_file` ou des fichiers statiques, vous
|
|
1601
1591
|
pouvez rencontrer des types mime que Sinatra ne connaît pas. Utilisez
|
1602
1592
|
`mime_type` pour les déclarer par extension de fichier :
|
1603
1593
|
|
1604
|
-
```
|
1594
|
+
```ruby
|
1605
1595
|
configure do
|
1606
1596
|
mime_type :foo, 'text/foo'
|
1607
1597
|
end
|
@@ -1609,7 +1599,7 @@ end
|
|
1609
1599
|
|
1610
1600
|
Vous pouvez également les utiliser avec la méthode `content_type` :
|
1611
1601
|
|
1612
|
-
```
|
1602
|
+
```ruby
|
1613
1603
|
get '/' do
|
1614
1604
|
content_type :foo
|
1615
1605
|
"foo foo foo"
|
@@ -1621,7 +1611,7 @@ end
|
|
1621
1611
|
Pour former des URLs, vous devriez utiliser la méthode `url`, par exemple en
|
1622
1612
|
Haml :
|
1623
1613
|
|
1624
|
-
```
|
1614
|
+
```ruby
|
1625
1615
|
%a{:href => url('/foo')} foo
|
1626
1616
|
```
|
1627
1617
|
|
@@ -1635,24 +1625,24 @@ pour un exemple).
|
|
1635
1625
|
Vous pouvez déclencher une redirection du navigateur avec la méthode
|
1636
1626
|
`redirect` :
|
1637
1627
|
|
1638
|
-
```
|
1628
|
+
```ruby
|
1639
1629
|
get '/foo' do
|
1640
1630
|
redirect to('/bar')
|
1641
1631
|
end
|
1642
1632
|
```
|
1643
1633
|
|
1644
|
-
Tout paramètre additionnel
|
1634
|
+
Tout paramètre additionnel sera utilisé comme argument pour la méthode
|
1645
1635
|
`halt` :
|
1646
1636
|
|
1647
|
-
```
|
1637
|
+
```ruby
|
1648
1638
|
redirect to('/bar'), 303
|
1649
|
-
redirect 'http://google.com', 'mauvais endroit mon pote'
|
1639
|
+
redirect 'http://www.google.com/', 'mauvais endroit mon pote'
|
1650
1640
|
```
|
1651
1641
|
|
1652
1642
|
Vous pouvez aussi rediriger vers la page dont l'utilisateur venait au moyen de
|
1653
1643
|
`redirect back` :
|
1654
1644
|
|
1655
|
-
```
|
1645
|
+
```ruby
|
1656
1646
|
get '/foo' do
|
1657
1647
|
"<a href='/bar'>faire quelque chose</a>"
|
1658
1648
|
end
|
@@ -1665,13 +1655,13 @@ end
|
|
1665
1655
|
|
1666
1656
|
Pour passer des arguments à une redirection, ajoutez-les soit à la requête :
|
1667
1657
|
|
1668
|
-
```
|
1658
|
+
```ruby
|
1669
1659
|
redirect to('/bar?sum=42')
|
1670
1660
|
```
|
1671
1661
|
|
1672
1662
|
Ou bien utilisez une session :
|
1673
1663
|
|
1674
|
-
```
|
1664
|
+
```ruby
|
1675
1665
|
enable :sessions
|
1676
1666
|
|
1677
1667
|
get '/foo' do
|
@@ -1686,11 +1676,11 @@ end
|
|
1686
1676
|
|
1687
1677
|
### Contrôle du cache
|
1688
1678
|
|
1689
|
-
|
1679
|
+
Définissez correctement vos en-têtes à la base pour un bon cache HTTP.
|
1690
1680
|
|
1691
|
-
Vous pouvez facilement définir l'
|
1681
|
+
Vous pouvez facilement définir l'en-tête Cache-Control de la manière suivante :
|
1692
1682
|
|
1693
|
-
```
|
1683
|
+
```ruby
|
1694
1684
|
get '/' do
|
1695
1685
|
cache_control :public
|
1696
1686
|
"met le en cache !"
|
@@ -1699,27 +1689,27 @@ end
|
|
1699
1689
|
|
1700
1690
|
Conseil de pro : définir le cache dans un filtre before :
|
1701
1691
|
|
1702
|
-
```
|
1692
|
+
```ruby
|
1703
1693
|
before do
|
1704
1694
|
cache_control :public, :must_revalidate, :max_age => 60
|
1705
1695
|
end
|
1706
1696
|
```
|
1707
1697
|
|
1708
|
-
Si vous utilisez la méthode `expires` pour définir l'
|
1698
|
+
Si vous utilisez la méthode `expires` pour définir l'en-tête correspondant,
|
1709
1699
|
`Cache-Control` sera alors défini automatiquement :
|
1710
1700
|
|
1711
|
-
```
|
1701
|
+
```ruby
|
1712
1702
|
before do
|
1713
1703
|
expires 500, :public, :must_revalidate
|
1714
1704
|
end
|
1715
1705
|
```
|
1716
1706
|
|
1717
|
-
Pour utiliser correctement
|
1707
|
+
Pour utiliser correctement le cache, vous devriez utiliser `etag` ou
|
1718
1708
|
`last_modified`. Il est recommandé d'utiliser ces méthodes *avant* de faire
|
1719
1709
|
d'importantes modifications, car elles vont immédiatement déclencher la réponse
|
1720
1710
|
si le client a déjà la version courante dans son cache :
|
1721
1711
|
|
1722
|
-
```
|
1712
|
+
```ruby
|
1723
1713
|
get '/article/:id' do
|
1724
1714
|
@article = Article.find params['id']
|
1725
1715
|
last_modified @article.updated_at
|
@@ -1729,18 +1719,18 @@ end
|
|
1729
1719
|
```
|
1730
1720
|
|
1731
1721
|
Il est également possible d'utiliser un
|
1732
|
-
[weak ETag](
|
1722
|
+
[weak ETag](https://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation) :
|
1733
1723
|
|
1734
|
-
```
|
1724
|
+
```ruby
|
1735
1725
|
etag @article.sha1, :weak
|
1736
1726
|
```
|
1737
1727
|
|
1738
1728
|
Ces méthodes ne sont pas chargées de mettre des données en cache, mais elles
|
1739
|
-
fournissent les informations nécessaires pour votre
|
1740
|
-
recherche
|
1729
|
+
fournissent les informations nécessaires pour le cache de votre navigateur. Si vous êtes à la
|
1730
|
+
recherche d'une solution rapide pour un reverse-proxy de cache, essayez
|
1741
1731
|
[rack-cache](https://github.com/rtomayko/rack-cache) :
|
1742
1732
|
|
1743
|
-
```
|
1733
|
+
```ruby
|
1744
1734
|
require "rack/cache"
|
1745
1735
|
require "sinatra"
|
1746
1736
|
|
@@ -1758,23 +1748,23 @@ d'en-tête `Cache-Control` (voir plus loin).
|
|
1758
1748
|
|
1759
1749
|
D'après la RFC 2616, votre application devrait se comporter différement lorsque
|
1760
1750
|
l'en-tête If-Match ou If-None-Match est défini à `*` en tenant compte du
|
1761
|
-
fait que la
|
1762
|
-
requêtes portant sur des
|
1763
|
-
put) existent déjà et pour les autres
|
1764
|
-
de requêtes post) qu'il s'agit de nouvelles
|
1751
|
+
fait que la ressource demandée existe déjà ou pas. Sinatra considère que les
|
1752
|
+
requêtes portant sur des ressources sûres (tel que get) ou idempotentes (tel que
|
1753
|
+
put) existent déjà et pour les autres ressources (par exemple dans le cas
|
1754
|
+
de requêtes post) qu'il s'agit de nouvelles ressources. Vous pouvez modifier ce
|
1765
1755
|
comportement en passant une option `:new_resource` :
|
1766
1756
|
|
1767
|
-
```
|
1757
|
+
```ruby
|
1768
1758
|
get '/create' do
|
1769
1759
|
etag '', :new_resource => true
|
1770
1760
|
Article.create
|
1771
|
-
erb :
|
1761
|
+
erb :nouvel_article
|
1772
1762
|
end
|
1773
1763
|
```
|
1774
1764
|
|
1775
|
-
Si vous souhaitez
|
1765
|
+
Si vous souhaitez avoir un ETag faible, utilisez l'option `:kind` :
|
1776
1766
|
|
1777
|
-
```
|
1767
|
+
```ruby
|
1778
1768
|
etag '', :new_resource => true, :kind => :weak
|
1779
1769
|
```
|
1780
1770
|
|
@@ -1782,7 +1772,7 @@ etag '', :new_resource => true, :kind => :weak
|
|
1782
1772
|
|
1783
1773
|
Pour envoyer des fichiers, vous pouvez utiliser la méthode `send_file` :
|
1784
1774
|
|
1785
|
-
```
|
1775
|
+
```ruby
|
1786
1776
|
get '/' do
|
1787
1777
|
send_file 'foo.png'
|
1788
1778
|
end
|
@@ -1790,7 +1780,7 @@ end
|
|
1790
1780
|
|
1791
1781
|
Quelques options sont également acceptées :
|
1792
1782
|
|
1793
|
-
```
|
1783
|
+
```ruby
|
1794
1784
|
send_file 'foo.png', :type => :jpg
|
1795
1785
|
```
|
1796
1786
|
|
@@ -1804,8 +1794,8 @@ Les options sont :
|
|
1804
1794
|
|
1805
1795
|
<dt>last_modified</dt>
|
1806
1796
|
<dd>
|
1807
|
-
valeur pour l’
|
1808
|
-
fichier
|
1797
|
+
valeur pour l’en-tête Last-Modified, par défaut la date de modification du
|
1798
|
+
fichier.
|
1809
1799
|
</dd>
|
1810
1800
|
|
1811
1801
|
<dt>type</dt>
|
@@ -1816,35 +1806,35 @@ Les options sont :
|
|
1816
1806
|
|
1817
1807
|
<dt>disposition</dt>
|
1818
1808
|
<dd>
|
1819
|
-
utilisé pour Content-Disposition, les
|
1809
|
+
utilisé pour Content-Disposition, les valeurs possibles étant : <tt>nil</tt>
|
1820
1810
|
(par défaut), <tt>:attachment</tt> et <tt>:inline</tt>
|
1821
1811
|
</dd>
|
1822
1812
|
|
1823
1813
|
<dt>length</dt>
|
1824
|
-
<dd>
|
1814
|
+
<dd>en-tête Content-Length, par défaut la taille du fichier</dd>
|
1825
1815
|
|
1826
1816
|
<dt>status</dt>
|
1827
1817
|
<dd>
|
1828
1818
|
code état à renvoyer. Utile quand un fichier statique sert de page d’erreur.
|
1819
|
+
|
1820
|
+
Si le gestionnaire Rack le supporte, d'autres moyens que le streaming via le
|
1821
|
+
processus Ruby seront utilisés. Si vous utilisez cette méthode, Sinatra gérera
|
1822
|
+
automatiquement les requêtes de type range.
|
1829
1823
|
</dd>
|
1830
1824
|
</dl>
|
1831
1825
|
|
1832
|
-
Si le gestionnaire Rack le supporte, d'autres moyens que le streaming via le
|
1833
|
-
processus Ruby seront utilisés. Si vous utilisez cette méthode, Sinatra gérera
|
1834
|
-
automatiquement les requêtes de type range.
|
1835
|
-
|
1836
1826
|
### Accéder à l'objet requête
|
1837
1827
|
|
1838
1828
|
L'objet correspondant à la requête envoyée peut être récupéré dans le contexte
|
1839
1829
|
de la requête (filtres, routes, gestionnaires d'erreur) au moyen de la méthode
|
1840
1830
|
`request` :
|
1841
1831
|
|
1842
|
-
```
|
1832
|
+
```ruby
|
1843
1833
|
# application tournant à l'adresse http://exemple.com/exemple
|
1844
1834
|
get '/foo' do
|
1845
1835
|
t = %w[text/css text/html application/javascript]
|
1846
1836
|
request.accept # ['text/html', '*/*']
|
1847
|
-
request.accept? 'text/xml' #
|
1837
|
+
request.accept? 'text/xml' # vrai
|
1848
1838
|
request.preferred_type(t) # 'text/html'
|
1849
1839
|
request.body # corps de la requête envoyée par le client
|
1850
1840
|
# (voir ci-dessous)
|
@@ -1857,10 +1847,10 @@ get '/foo' do
|
|
1857
1847
|
request.content_length # taille de request.body
|
1858
1848
|
request.media_type # type de média pour request.body
|
1859
1849
|
request.host # "exemple.com"
|
1860
|
-
request.get? #
|
1850
|
+
request.get? # vrai (méthodes similaires pour les autres
|
1861
1851
|
# verbes HTTP)
|
1862
|
-
request.form_data? #
|
1863
|
-
request["UN_ENTETE"] # valeur de l'
|
1852
|
+
request.form_data? # faux
|
1853
|
+
request["UN_ENTETE"] # valeur de l'en-tête UN_ENTETE
|
1864
1854
|
request.referrer # référant du client ou '/'
|
1865
1855
|
request.user_agent # user agent (utilisé par la condition :agent)
|
1866
1856
|
request.cookies # tableau contenant les cookies du navigateur
|
@@ -1868,7 +1858,7 @@ get '/foo' do
|
|
1868
1858
|
request.url # "http://exemple.com/exemple/foo"
|
1869
1859
|
request.path # "/exemple/foo"
|
1870
1860
|
request.ip # adresse IP du client
|
1871
|
-
request.secure? #
|
1861
|
+
request.secure? # faux
|
1872
1862
|
request.forwarded? # vrai (si on est derrière un proxy inverse)
|
1873
1863
|
request.env # tableau brut de l'environnement fourni par Rack
|
1874
1864
|
end
|
@@ -1877,7 +1867,7 @@ end
|
|
1877
1867
|
Certaines options, telles que `script_name` ou `path_info`
|
1878
1868
|
peuvent également être modifiées :
|
1879
1869
|
|
1880
|
-
```
|
1870
|
+
```ruby
|
1881
1871
|
before { request.path_info = "/" }
|
1882
1872
|
|
1883
1873
|
get "/" do
|
@@ -1887,7 +1877,7 @@ end
|
|
1887
1877
|
|
1888
1878
|
`request.body` est un objet IO ou StringIO :
|
1889
1879
|
|
1890
|
-
```
|
1880
|
+
```ruby
|
1891
1881
|
post "/api" do
|
1892
1882
|
request.body.rewind # au cas où il a déjà été lu
|
1893
1883
|
donnees = JSON.parse request.body.read
|
@@ -1901,7 +1891,7 @@ Vous pouvez utiliser la méthode `attachment` pour indiquer au navigateur que
|
|
1901
1891
|
la réponse devrait être stockée sur le disque plutôt qu'affichée :
|
1902
1892
|
|
1903
1893
|
|
1904
|
-
```
|
1894
|
+
```ruby
|
1905
1895
|
get '/' do
|
1906
1896
|
attachment
|
1907
1897
|
"enregistre-le !"
|
@@ -1910,7 +1900,7 @@ end
|
|
1910
1900
|
|
1911
1901
|
Vous pouvez également lui passer un nom de fichier :
|
1912
1902
|
|
1913
|
-
```
|
1903
|
+
```ruby
|
1914
1904
|
get '/' do
|
1915
1905
|
attachment "info.txt"
|
1916
1906
|
"enregistre-le !"
|
@@ -1923,7 +1913,7 @@ Sinatra fourni un helper `time_for` pour convertir une valeur donnée en
|
|
1923
1913
|
objet `Time`. Il peut aussi faire la conversion à partir d'objets `DateTime`,
|
1924
1914
|
`Date` ou de classes similaires :
|
1925
1915
|
|
1926
|
-
```
|
1916
|
+
```ruby
|
1927
1917
|
get '/' do
|
1928
1918
|
pass if Time.now > time_for('Dec 23, 2012')
|
1929
1919
|
"encore temps"
|
@@ -1935,7 +1925,7 @@ consorts. Par conséquent, vous pouvez très facilement étendre le
|
|
1935
1925
|
fonctionnement de ces méthodes en surchargeant le helper `time_for` dans
|
1936
1926
|
votre application :
|
1937
1927
|
|
1938
|
-
```
|
1928
|
+
```ruby
|
1939
1929
|
helpers do
|
1940
1930
|
def time_for(value)
|
1941
1931
|
case value
|
@@ -1958,17 +1948,17 @@ end
|
|
1958
1948
|
La méthode `find_template` est utilisée pour trouver les fichiers de
|
1959
1949
|
templates à générer :
|
1960
1950
|
|
1961
|
-
```
|
1951
|
+
```ruby
|
1962
1952
|
find_template settings.views, 'foo', Tilt[:haml] do |file|
|
1963
1953
|
puts "pourrait être #{file}"
|
1964
1954
|
end
|
1965
1955
|
```
|
1966
1956
|
|
1967
|
-
Ce n'est pas très
|
1957
|
+
Ce n'est pas très utile. En revanche, il est utile de pouvoir surcharger
|
1968
1958
|
cette méthode afin de définir son propre mécanisme de recherche. Par exemple,
|
1969
1959
|
vous pouvez utiliser plus d'un répertoire de vues :
|
1970
1960
|
|
1971
|
-
```
|
1961
|
+
```ruby
|
1972
1962
|
set :views, ['views', 'templates']
|
1973
1963
|
|
1974
1964
|
helpers do
|
@@ -1981,14 +1971,14 @@ end
|
|
1981
1971
|
Un autre exemple est d'utiliser des répertoires différents pour des moteurs
|
1982
1972
|
de rendu différents :
|
1983
1973
|
|
1984
|
-
```
|
1974
|
+
```ruby
|
1985
1975
|
set :views, :sass => 'views/sass', :haml => 'templates', :default => 'views'
|
1986
1976
|
|
1987
1977
|
helpers do
|
1988
|
-
def find_template(
|
1989
|
-
_,
|
1990
|
-
|
1991
|
-
super(
|
1978
|
+
def find_template(vues, nom, moteur, &bloc)
|
1979
|
+
_, dossier = vues.detect { |k,v| moteur == Tilt[k] }
|
1980
|
+
dossier ||= vues[:default]
|
1981
|
+
super(dossier, nom, moteur, &bloc)
|
1992
1982
|
end
|
1993
1983
|
end
|
1994
1984
|
```
|
@@ -1998,27 +1988,27 @@ d'autres !
|
|
1998
1988
|
|
1999
1989
|
Notez que `find_template` ne vérifie pas que le fichier existe mais
|
2000
1990
|
va plutôt exécuter le bloc pour tous les chemins possibles. Cela n'induit pas
|
2001
|
-
|
2002
|
-
qu'un fichier
|
1991
|
+
de problème de performance dans le sens où `render` va utiliser `break` dès
|
1992
|
+
qu'un fichier sera trouvé. De plus, l'emplacement des templates (et leur
|
2003
1993
|
contenu) est mis en cache si vous n'êtes pas en mode développement. Vous
|
2004
|
-
|
1994
|
+
devez garder cela en tête si vous écrivez une méthode vraiment dingue.
|
2005
1995
|
|
2006
1996
|
## Configuration
|
2007
1997
|
|
2008
1998
|
Lancé une seule fois au démarrage de tous les environnements :
|
2009
1999
|
|
2010
|
-
```
|
2000
|
+
```ruby
|
2011
2001
|
configure do
|
2012
2002
|
# définir un paramètre
|
2013
|
-
set :option, '
|
2003
|
+
set :option, 'valeur'
|
2014
2004
|
|
2015
|
-
# définir plusieurs
|
2005
|
+
# définir plusieurs paramètres
|
2016
2006
|
set :a => 1, :b => 2
|
2017
2007
|
|
2018
|
-
#
|
2008
|
+
# équivalent à "set :option, true"
|
2019
2009
|
enable :option
|
2020
2010
|
|
2021
|
-
#
|
2011
|
+
# équivalent à "set :option, false""
|
2022
2012
|
disable :option
|
2023
2013
|
|
2024
2014
|
# vous pouvez également avoir des paramètres dynamiques avec des blocs
|
@@ -2026,10 +2016,9 @@ configure do
|
|
2026
2016
|
end
|
2027
2017
|
```
|
2028
2018
|
|
2029
|
-
Lancé si l'environnement (variable d'environnement RACK_ENV) est
|
2030
|
-
`:production` :
|
2019
|
+
Lancé si l'environnement (variable d'environnement RACK_ENV) est `:production` :
|
2031
2020
|
|
2032
|
-
```
|
2021
|
+
```ruby
|
2033
2022
|
configure :production do
|
2034
2023
|
...
|
2035
2024
|
end
|
@@ -2037,7 +2026,7 @@ Lancé si l'environnement (variable d'environnement RACK_ENV) est défini comme
|
|
2037
2026
|
|
2038
2027
|
Lancé si l'environnement est `:production` ou `:test` :
|
2039
2028
|
|
2040
|
-
```
|
2029
|
+
```ruby
|
2041
2030
|
configure :production, :test do
|
2042
2031
|
...
|
2043
2032
|
end
|
@@ -2045,7 +2034,7 @@ Lancé si l'environnement est `:production` ou `:test` :
|
|
2045
2034
|
|
2046
2035
|
Vous pouvez accéder à ces paramètres via `settings` :
|
2047
2036
|
|
2048
|
-
```
|
2037
|
+
```ruby
|
2049
2038
|
configure do
|
2050
2039
|
set :foo, 'bar'
|
2051
2040
|
end
|
@@ -2059,26 +2048,26 @@ end
|
|
2059
2048
|
|
2060
2049
|
### Se protéger des attaques
|
2061
2050
|
|
2062
|
-
Sinatra utilise [Rack::Protection](https://github.com/
|
2051
|
+
Sinatra utilise [Rack::Protection](https://github.com/sinatra/rack-protection#readme)
|
2063
2052
|
pour protéger votre application contre les principales attaques opportunistes.
|
2064
2053
|
Vous pouvez très simplement désactiver cette fonctionnalité (ce qui exposera
|
2065
2054
|
votre application à beaucoup de vulnerabilités courantes) :
|
2066
2055
|
|
2067
|
-
```
|
2056
|
+
```ruby
|
2068
2057
|
disable :protection
|
2069
2058
|
```
|
2070
2059
|
|
2071
2060
|
Pour désactiver seulement un type de protection, vous pouvez définir `protection`
|
2072
2061
|
avec un hash d'options :
|
2073
2062
|
|
2074
|
-
```
|
2063
|
+
```ruby
|
2075
2064
|
set :protection, :except => :path_traversal
|
2076
2065
|
```
|
2077
2066
|
|
2078
2067
|
Vous pouvez également lui passer un tableau pour désactiver plusieurs types de
|
2079
2068
|
protection :
|
2080
2069
|
|
2081
|
-
```
|
2070
|
+
```ruby
|
2082
2071
|
set :protection, :except => [:path_traversal, :session_hijacking]
|
2083
2072
|
```
|
2084
2073
|
|
@@ -2087,7 +2076,7 @@ un système de protection au niveau de la session. Dans le cas où vous gérez
|
|
2087
2076
|
vous même les sessions, vous devez utiliser l'option `:session` pour que cela
|
2088
2077
|
soit le cas :
|
2089
2078
|
|
2090
|
-
```
|
2079
|
+
```ruby
|
2091
2080
|
use Rack::Session::Pool
|
2092
2081
|
set :protection, :session => true
|
2093
2082
|
```
|
@@ -2250,14 +2239,14 @@ templates sont mis en cache par défaut.
|
|
2250
2239
|
Pour exécuter votre application dans un environnement différent, définissez la
|
2251
2240
|
variable d'environnement `RACK_ENV` :
|
2252
2241
|
|
2253
|
-
```
|
2242
|
+
```shell
|
2254
2243
|
RACK_ENV=production ruby my_app.rb
|
2255
2244
|
```
|
2256
2245
|
|
2257
2246
|
Vous pouvez utiliser une des méthodes `development?`, `test?` et `production?`
|
2258
2247
|
pour déterminer quel est l'environnement en cours :
|
2259
2248
|
|
2260
|
-
```
|
2249
|
+
```ruby
|
2261
2250
|
get '/' do
|
2262
2251
|
if settings.development?
|
2263
2252
|
"développement !"
|
@@ -2278,7 +2267,7 @@ vieux `haml`, `erb`, `halt`, etc.
|
|
2278
2267
|
Quand une exception <tt>Sinatra::NotFound</tt> est soulevée, ou que le code
|
2279
2268
|
retour est 404, le gestionnaire <tt>not_found</tt> est invoqué :
|
2280
2269
|
|
2281
|
-
```
|
2270
|
+
```ruby
|
2282
2271
|
not_found do
|
2283
2272
|
'Pas moyen de trouver ce que vous cherchez'
|
2284
2273
|
end
|
@@ -2290,7 +2279,7 @@ Le gestionnaire `error` est invoqué à chaque fois qu'une exception est
|
|
2290
2279
|
soulevée dans une route ou un filtre. L'objet exception est accessible via la
|
2291
2280
|
variable Rack `sinatra.error` :
|
2292
2281
|
|
2293
|
-
```
|
2282
|
+
```ruby
|
2294
2283
|
error do
|
2295
2284
|
'Désolé mais une méchante erreur est survenue - ' + env['sinatra.error'].message
|
2296
2285
|
end
|
@@ -2298,28 +2287,30 @@ end
|
|
2298
2287
|
|
2299
2288
|
Erreur sur mesure :
|
2300
2289
|
|
2301
|
-
```
|
2290
|
+
```ruby
|
2302
2291
|
error MonErreurSurMesure do
|
2303
|
-
'
|
2292
|
+
'Oups ! Il est arrivé...' + env['sinatra.error'].message
|
2304
2293
|
end
|
2305
2294
|
```
|
2306
2295
|
|
2307
|
-
Donc si
|
2296
|
+
Donc si cette erreur est soulevée :
|
2308
2297
|
|
2309
|
-
```
|
2298
|
+
```ruby
|
2310
2299
|
get '/' do
|
2311
2300
|
raise MonErreurSurMesure, 'quelque chose de mal'
|
2312
2301
|
end
|
2313
2302
|
```
|
2314
2303
|
|
2315
|
-
|
2304
|
+
La réponse sera :
|
2316
2305
|
|
2317
|
-
|
2306
|
+
```
|
2307
|
+
Oups ! Il est arrivé... quelque chose de mal
|
2308
|
+
```
|
2318
2309
|
|
2319
2310
|
Alternativement, vous pouvez avoir un gestionnaire d'erreur associé à un code
|
2320
2311
|
particulier :
|
2321
2312
|
|
2322
|
-
```
|
2313
|
+
```ruby
|
2323
2314
|
error 403 do
|
2324
2315
|
'Accès interdit'
|
2325
2316
|
end
|
@@ -2331,29 +2322,29 @@ end
|
|
2331
2322
|
|
2332
2323
|
Ou un intervalle :
|
2333
2324
|
|
2334
|
-
```
|
2325
|
+
```ruby
|
2335
2326
|
error 400..510 do
|
2336
2327
|
'Boom'
|
2337
2328
|
end
|
2338
2329
|
```
|
2339
2330
|
|
2340
2331
|
Sinatra installe pour vous quelques gestionnaires `not_found` et
|
2341
|
-
`error` génériques lorsque vous êtes en environnement
|
2332
|
+
`error` génériques lorsque vous êtes en environnement de
|
2342
2333
|
`development`.
|
2343
2334
|
|
2344
2335
|
## Les Middlewares Rack
|
2345
2336
|
|
2346
|
-
Sinatra
|
2337
|
+
Sinatra fonctionne avec [Rack](http://rack.github.io/), une interface standard
|
2347
2338
|
et minimale pour les web frameworks Ruby. Un des points forts de Rack est le
|
2348
|
-
support de ce que l'on appelle des "middlewares" --
|
2339
|
+
support de ce que l'on appelle des "middlewares" -- composants qui viennent se
|
2349
2340
|
situer entre le serveur et votre application, et dont le but est de
|
2350
2341
|
visualiser/manipuler la requête/réponse HTTP, et d'offrir diverses
|
2351
2342
|
fonctionnalités classiques.
|
2352
2343
|
|
2353
|
-
Sinatra permet
|
2344
|
+
Sinatra permet d'utiliser facilement des middlewares Rack via la méthode de
|
2354
2345
|
haut niveau `use` :
|
2355
2346
|
|
2356
|
-
```
|
2347
|
+
```ruby
|
2357
2348
|
require 'sinatra'
|
2358
2349
|
require 'mon_middleware_perso'
|
2359
2350
|
|
@@ -2366,20 +2357,20 @@ end
|
|
2366
2357
|
```
|
2367
2358
|
|
2368
2359
|
La sémantique de `use` est identique à celle définie dans le DSL de
|
2369
|
-
[Rack::Builder](http://rubydoc.info/github/rack/rack/master/Rack/Builder)
|
2370
|
-
(le plus souvent utilisé dans un fichier rackup). Par exemple, la méthode
|
2360
|
+
[Rack::Builder](http://www.rubydoc.info/github/rack/rack/master/Rack/Builder)
|
2361
|
+
(le plus souvent utilisé dans un fichier `rackup`). Par exemple, la méthode
|
2371
2362
|
`use` accepte divers arguments ainsi que des blocs :
|
2372
2363
|
|
2373
|
-
```
|
2374
|
-
use Rack::Auth::Basic do |
|
2375
|
-
|
2364
|
+
```ruby
|
2365
|
+
use Rack::Auth::Basic do |identifiant, mot_de_passe|
|
2366
|
+
identifiant == 'admin' && mot_de_passe == 'secret'
|
2376
2367
|
end
|
2377
2368
|
```
|
2378
2369
|
|
2379
2370
|
Rack est distribué avec de nombreux middlewares standards pour loguer, débuguer,
|
2380
2371
|
faire du routage URL, de l'authentification ou gérer des sessions. Sinatra gère
|
2381
2372
|
plusieurs de ces composants automatiquement via son système de configuration, ce
|
2382
|
-
qui vous dispense de faire un `use`
|
2373
|
+
qui vous dispense de faire un `use` pour ces derniers.
|
2383
2374
|
|
2384
2375
|
Vous trouverez d'autres middlewares intéressants sur
|
2385
2376
|
[rack](https://github.com/rack/rack/tree/master/lib/rack),
|
@@ -2392,7 +2383,7 @@ Les tests pour Sinatra peuvent être écrit avec n'importe quelle bibliothèque
|
|
2392
2383
|
basée sur Rack. [Rack::Test](http://gitrdoc.com/brynary/rack-test) est
|
2393
2384
|
recommandé :
|
2394
2385
|
|
2395
|
-
```
|
2386
|
+
```ruby
|
2396
2387
|
require 'mon_application_sinatra'
|
2397
2388
|
require 'minitest/autorun'
|
2398
2389
|
require 'rack/test'
|
@@ -2410,7 +2401,7 @@ class MonTest < Minitest::Test
|
|
2410
2401
|
end
|
2411
2402
|
|
2412
2403
|
def test_avec_des_parametres
|
2413
|
-
get '/rencontrer', :
|
2404
|
+
get '/rencontrer', :nom => 'Frank'
|
2414
2405
|
assert_equal 'Salut Frank !', last_response.body
|
2415
2406
|
end
|
2416
2407
|
|
@@ -2432,7 +2423,7 @@ niveau supérieur suppose une configuration dans le style des micro-applications
|
|
2432
2423
|
`./views`, des logs, une page d'erreur, etc...). C'est là que
|
2433
2424
|
`Sinatra::Base` prend tout son intérêt :
|
2434
2425
|
|
2435
|
-
```
|
2426
|
+
```ruby
|
2436
2427
|
require 'sinatra/base'
|
2437
2428
|
|
2438
2429
|
class MonApplication < Sinatra::Base
|
@@ -2457,13 +2448,13 @@ pour transformer la plupart des applications de haut niveau en un composant
|
|
2457
2448
|
|
2458
2449
|
`Sinatra::Base` est une page blanche. La plupart des options sont
|
2459
2450
|
désactivées par défaut, y compris le serveur intégré. Reportez-vous à
|
2460
|
-
[Options et Configuration](http://
|
2451
|
+
[Options et Configuration](http://www.sinatrarb.com/configuration.html)
|
2461
2452
|
pour plus d'informations sur les options et leur fonctionnement. Si vous
|
2462
2453
|
souhaitez un comportement plus proche de celui obtenu lorsque vous définissez
|
2463
2454
|
votre application au niveau supérieur (aussi connu sous le nom de style
|
2464
2455
|
Classique), vous pouvez créer une classe héritant de `Sinatra::Application`.
|
2465
2456
|
|
2466
|
-
```
|
2457
|
+
```ruby
|
2467
2458
|
require 'sinatra/base'
|
2468
2459
|
|
2469
2460
|
class MyApp < Sinatra::Application
|
@@ -2476,11 +2467,11 @@ end
|
|
2476
2467
|
### Style modulaire vs. style classique
|
2477
2468
|
|
2478
2469
|
Contrairement aux idées reçues, il n'y a rien de mal à utiliser le style
|
2479
|
-
classique. Si c'est ce qui convient pour votre application, vous n'avez
|
2470
|
+
classique. Si c'est ce qui convient pour votre application, vous n'avez
|
2480
2471
|
aucune raison de passer à une application modulaire.
|
2481
2472
|
|
2482
2473
|
Le principal inconvénient du style classique sur le style modulaire est que vous
|
2483
|
-
ne pouvez avoir qu'une application
|
2474
|
+
ne pouvez avoir qu'une application par processus Ruby. Si vous pensez en
|
2484
2475
|
utiliser plus, passez au style modulaire. Et rien ne vous empêche de mixer style
|
2485
2476
|
classique et style modulaire.
|
2486
2477
|
|
@@ -2533,7 +2524,7 @@ mineures en ce qui concerne les paramètres par défaut :
|
|
2533
2524
|
<tr>
|
2534
2525
|
<td>static</td>
|
2535
2526
|
<td>true</td>
|
2536
|
-
<td>
|
2527
|
+
<td>File.exist?(public_folder)</td>
|
2537
2528
|
<td>true</td>
|
2538
2529
|
</tr>
|
2539
2530
|
</table>
|
@@ -2543,7 +2534,7 @@ mineures en ce qui concerne les paramètres par défaut :
|
|
2543
2534
|
Il y a deux façons de faire pour démarrer une application modulaire, démarrez
|
2544
2535
|
avec `run!` :
|
2545
2536
|
|
2546
|
-
```
|
2537
|
+
```ruby
|
2547
2538
|
# my_app.rb
|
2548
2539
|
require 'sinatra/base'
|
2549
2540
|
|
@@ -2557,14 +2548,14 @@ end
|
|
2557
2548
|
|
2558
2549
|
Démarrez ensuite avec :
|
2559
2550
|
|
2560
|
-
```
|
2551
|
+
```shell
|
2561
2552
|
ruby my_app.rb
|
2562
2553
|
```
|
2563
2554
|
|
2564
2555
|
Ou alors avec un fichier `config.ru`, qui permet d'utiliser n'importe
|
2565
2556
|
quel gestionnaire Rack :
|
2566
2557
|
|
2567
|
-
```
|
2558
|
+
```ruby
|
2568
2559
|
# config.ru
|
2569
2560
|
require './my_app'
|
2570
2561
|
run MyApp
|
@@ -2572,7 +2563,7 @@ run MyApp
|
|
2572
2563
|
|
2573
2564
|
Exécutez :
|
2574
2565
|
|
2575
|
-
```
|
2566
|
+
```shell
|
2576
2567
|
rackup -p 4567
|
2577
2568
|
```
|
2578
2569
|
|
@@ -2580,7 +2571,7 @@ rackup -p 4567
|
|
2580
2571
|
|
2581
2572
|
Ecrivez votre application :
|
2582
2573
|
|
2583
|
-
```
|
2574
|
+
```ruby
|
2584
2575
|
# app.rb
|
2585
2576
|
require 'sinatra'
|
2586
2577
|
|
@@ -2591,7 +2582,7 @@ end
|
|
2591
2582
|
|
2592
2583
|
Et un fichier `config.ru` correspondant :
|
2593
2584
|
|
2594
|
-
```
|
2585
|
+
```ruby
|
2595
2586
|
require './app'
|
2596
2587
|
run Sinatra::Application
|
2597
2588
|
```
|
@@ -2614,11 +2605,11 @@ de passer au style modulaire pour utiliser un fichier `config.ru`.**
|
|
2614
2605
|
|
2615
2606
|
Non seulement Sinatra peut utiliser d'autres middlewares Rack, il peut
|
2616
2607
|
également être à son tour utilisé au-dessus de n'importe quel endpoint Rack
|
2617
|
-
en tant que middleware.
|
2608
|
+
en tant que middleware. Cet endpoint peut très bien être une autre
|
2618
2609
|
application Sinatra, ou n'importe quelle application basée sur Rack
|
2619
2610
|
(Rails/Ramaze/Camping/...) :
|
2620
2611
|
|
2621
|
-
```
|
2612
|
+
```ruby
|
2622
2613
|
require 'sinatra/base'
|
2623
2614
|
|
2624
2615
|
class EcranDeConnexion < Sinatra::Base
|
@@ -2655,7 +2646,7 @@ Il se peut que vous ayez besoin de créer une nouvelle application à l'exécuti
|
|
2655
2646
|
sans avoir à les assigner à une constante, vous pouvez le faire grâce à
|
2656
2647
|
`Sinatra.new` :
|
2657
2648
|
|
2658
|
-
```
|
2649
|
+
```ruby
|
2659
2650
|
require 'sinatra/base'
|
2660
2651
|
mon_app = Sinatra.new { get('/') { "salut" } }
|
2661
2652
|
mon_app.run!
|
@@ -2663,7 +2654,7 @@ mon_app.run!
|
|
2663
2654
|
|
2664
2655
|
L'application dont elle hérite peut être passé en argument optionnel :
|
2665
2656
|
|
2666
|
-
```
|
2657
|
+
```ruby
|
2667
2658
|
# config.ru
|
2668
2659
|
require 'sinatra/base'
|
2669
2660
|
|
@@ -2681,12 +2672,12 @@ map('/b') do
|
|
2681
2672
|
end
|
2682
2673
|
```
|
2683
2674
|
|
2684
|
-
C'est notamment utile pour tester des extensions
|
2675
|
+
C'est notamment utile pour tester des extensions pour Sinatra ou bien pour
|
2685
2676
|
utiliser Sinatra dans votre propre bibliothèque.
|
2686
2677
|
|
2687
2678
|
Cela permet également d'utiliser très facilement Sinatra comme middleware :
|
2688
2679
|
|
2689
|
-
```
|
2680
|
+
```ruby
|
2690
2681
|
require 'sinatra/base'
|
2691
2682
|
|
2692
2683
|
use Sinatra do
|
@@ -2712,7 +2703,7 @@ les requêtes sont traitées par une seule classe d'application.
|
|
2712
2703
|
|
2713
2704
|
Les options définies au moyen de `set` deviennent des méthodes de classe :
|
2714
2705
|
|
2715
|
-
```
|
2706
|
+
```ruby
|
2716
2707
|
class MonApp < Sinatra::Base
|
2717
2708
|
# Eh, je suis dans le contexte de l'application !
|
2718
2709
|
set :foo, 42
|
@@ -2746,7 +2737,7 @@ contexte. Depuis celui-ci, vous pouvez accéder aux objets `request` et
|
|
2746
2737
|
Vous pouvez accéder au contexte de l'application depuis le contexte de la
|
2747
2738
|
requête au moyen de `settings` :
|
2748
2739
|
|
2749
|
-
```
|
2740
|
+
```ruby
|
2750
2741
|
class MonApp < Sinatra::Base
|
2751
2742
|
# Eh, je suis dans le contexte de l'application !
|
2752
2743
|
get '/ajouter_route/:nom' do
|
@@ -2776,9 +2767,9 @@ Le contexte de délégation se contente de transmettre les appels de méthodes a
|
|
2776
2767
|
contexte de classe. Toutefois, il ne se comporte pas à 100% comme le contexte
|
2777
2768
|
de classe car vous n'avez pas le binding de la classe : seules les méthodes
|
2778
2769
|
spécifiquement déclarées pour délégation sont disponibles et il n'est pas
|
2779
|
-
possible de partager
|
2780
|
-
(comprenez : `self` n'est pas le même). Vous pouvez ajouter des
|
2781
|
-
|
2770
|
+
possible de partager de variables/états avec le contexte de classe
|
2771
|
+
(comprenez : `self` n'est pas le même). Vous pouvez ajouter des délégations de
|
2772
|
+
méthode en appelant `Sinatra::Delegator.delegate :method_name`.
|
2782
2773
|
|
2783
2774
|
Vous avez le binding du contexte de délégation dans :
|
2784
2775
|
|
@@ -2793,7 +2784,7 @@ qui [étend l'objet principal](https://github.com/sinatra/sinatra/blob/ca06364/l
|
|
2793
2784
|
|
2794
2785
|
Les applications Sinatra peuvent être lancées directement :
|
2795
2786
|
|
2796
|
-
```
|
2787
|
+
```shell
|
2797
2788
|
ruby mon_application.rb [-h] [-x] [-e ENVIRONNEMENT] [-p PORT] [-o HOTE] [-s SERVEUR]
|
2798
2789
|
```
|
2799
2790
|
|
@@ -2808,6 +2799,41 @@ Avec les options :
|
|
2808
2799
|
-x # active le mutex lock (off par défaut)
|
2809
2800
|
```
|
2810
2801
|
|
2802
|
+
### Multi-threading
|
2803
|
+
|
2804
|
+
_Cette partie est basée sur [une réponse StackOverflow][so-answer] de Konstantin._
|
2805
|
+
|
2806
|
+
Sinatra n'impose pas de modèle de concurrence. Sinatra est thread-safe, vous pouvez
|
2807
|
+
donc utiliser n'importe quel gestionnaire Rack, comme Thin, Puma ou WEBrick en mode
|
2808
|
+
multi-threaded.
|
2809
|
+
|
2810
|
+
Cela signifie néanmoins qu'il vous faudra spécifier les paramètres correspondant au
|
2811
|
+
gestionnaire Rack utilisé lors du démarrage du serveur.
|
2812
|
+
|
2813
|
+
L'exemple ci-dessous montre comment vous pouvez exécuter un serveur Thin de manière
|
2814
|
+
multi-threaded:
|
2815
|
+
|
2816
|
+
```
|
2817
|
+
# app.rb
|
2818
|
+
require 'sinatra/base'
|
2819
|
+
|
2820
|
+
classe App < Sinatra::Base
|
2821
|
+
get '/' do
|
2822
|
+
'Bonjour le monde !'
|
2823
|
+
end
|
2824
|
+
end
|
2825
|
+
|
2826
|
+
App.run!
|
2827
|
+
```
|
2828
|
+
|
2829
|
+
Pour démarrer le serveur, exécuter la commande suivante:
|
2830
|
+
|
2831
|
+
```
|
2832
|
+
thin --threaded start
|
2833
|
+
```
|
2834
|
+
|
2835
|
+
[so-answer]: http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999)
|
2836
|
+
|
2811
2837
|
## Configuration nécessaire
|
2812
2838
|
|
2813
2839
|
Les versions suivantes de Ruby sont officiellement supportées :
|
@@ -2890,25 +2916,25 @@ stable.
|
|
2890
2916
|
Pour cela, la méthode la plus simple est d'installer une gem de prerelease que
|
2891
2917
|
nous publions de temps en temps :
|
2892
2918
|
|
2893
|
-
```
|
2919
|
+
```shell
|
2894
2920
|
gem install sinatra --pre
|
2895
2921
|
```
|
2896
2922
|
Ce qui permet de bénéficier des toutes dernières fonctionnalités.
|
2897
2923
|
|
2898
2924
|
### Installer avec Bundler
|
2899
2925
|
|
2900
|
-
Il est cependant conseillé de passer par [Bundler](http://
|
2926
|
+
Il est cependant conseillé de passer par [Bundler](http://bundler.io) pour
|
2901
2927
|
faire tourner votre application avec la dernière version de Sinatra.
|
2902
2928
|
|
2903
2929
|
Pour commencer, installez bundler si nécessaire :
|
2904
2930
|
|
2905
|
-
```
|
2931
|
+
```shell
|
2906
2932
|
gem install bundler
|
2907
2933
|
```
|
2908
2934
|
|
2909
2935
|
Ensuite, créez un fichier `Gemfile` dans le dossier de votre projet :
|
2910
2936
|
|
2911
|
-
```
|
2937
|
+
```ruby
|
2912
2938
|
source 'https://rubygems.org'
|
2913
2939
|
gem 'sinatra', :github => "sinatra/sinatra"
|
2914
2940
|
|
@@ -2923,7 +2949,7 @@ automatiquement téléchargées et ajoutées par Bundler.
|
|
2923
2949
|
|
2924
2950
|
Vous pouvez alors lancer votre application de la façon suivante :
|
2925
2951
|
|
2926
|
-
```
|
2952
|
+
```shell
|
2927
2953
|
bundle exec ruby myapp.rb
|
2928
2954
|
```
|
2929
2955
|
|
@@ -2933,7 +2959,7 @@ Si vous ne souhaitez pas employer Bundler, vous pouvez cloner Sinatra en local
|
|
2933
2959
|
dans votre projet et démarrez votre application avec le dossier `sinatra/lib`
|
2934
2960
|
dans le `$LOAD_PATH` :
|
2935
2961
|
|
2936
|
-
```
|
2962
|
+
```shell
|
2937
2963
|
cd myapp
|
2938
2964
|
git clone git://github.com/sinatra/sinatra.git
|
2939
2965
|
ruby -I sinatra/lib myapp.rb
|
@@ -2942,7 +2968,7 @@ ruby -I sinatra/lib myapp.rb
|
|
2942
2968
|
Et de temps en temps, vous devrez récupérer la dernière version du code source
|
2943
2969
|
de Sinatra :
|
2944
2970
|
|
2945
|
-
```
|
2971
|
+
```shell
|
2946
2972
|
cd myapp/sinatra
|
2947
2973
|
git pull
|
2948
2974
|
```
|
@@ -2951,7 +2977,7 @@ git pull
|
|
2951
2977
|
|
2952
2978
|
Une dernière méthode consiste à construire la gem vous-même :
|
2953
2979
|
|
2954
|
-
```
|
2980
|
+
```shell
|
2955
2981
|
git clone git://github.com/sinatra/sinatra.git
|
2956
2982
|
cd sinatra
|
2957
2983
|
rake sinatra.gemspec
|
@@ -2960,7 +2986,7 @@ rake install
|
|
2960
2986
|
|
2961
2987
|
Si vous installez les gems en tant que root, vous devez encore faire un :
|
2962
2988
|
|
2963
|
-
```
|
2989
|
+
```shell
|
2964
2990
|
sudo rake install
|
2965
2991
|
```
|
2966
2992
|
|
@@ -2975,14 +3001,14 @@ SemVer que SemVerTag.
|
|
2975
3001
|
de news, et des liens vers d'autres ressources.
|
2976
3002
|
* [Contribuer](http://www.sinatrarb.com/contributing) - Vous avez trouvé un
|
2977
3003
|
bug ? Besoin d'aide ? Vous avez un patch ?
|
2978
|
-
* [Suivi des problèmes](
|
2979
|
-
* [Twitter](
|
3004
|
+
* [Suivi des problèmes](https://github.com/sinatra/sinatra/issues)
|
3005
|
+
* [Twitter](https://twitter.com/sinatra)
|
2980
3006
|
* [Mailing List](http://groups.google.com/group/sinatrarb/topics)
|
2981
3007
|
* IRC : [#sinatra](irc://chat.freenode.net/#sinatra) sur http://freenode.net
|
2982
3008
|
* [Sinatra Book](https://github.com/sinatra/sinatra-book/) Tutoriels et recettes
|
2983
3009
|
* [Sinatra Recipes](http://recipes.sinatrarb.com/) trucs et astuces rédigés par
|
2984
3010
|
la communauté
|
2985
|
-
* Documentation API de la [dernière version](http://rubydoc.info/gems/sinatra)
|
2986
|
-
ou du [HEAD courant](http://rubydoc.info/github/sinatra/sinatra) sur
|
2987
|
-
http://rubydoc.info
|
2988
|
-
* [CI server](
|
3011
|
+
* Documentation API de la [dernière version](http://www.rubydoc.info/gems/sinatra)
|
3012
|
+
ou du [HEAD courant](http://www.rubydoc.info/github/sinatra/sinatra) sur
|
3013
|
+
http://www.rubydoc.info/
|
3014
|
+
* [CI server](https://travis-ci.org/sinatra/sinatra)
|