Skip to content
Newer
Older
100644 1000 lines (689 sloc) 28.4 KB
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
1 = Sinatra
1abac32 @rkh Add note to all README translations saying: 'Important Note: This doc…
rkh authored
2 <i>Attention: Ce document correspond à la traduction de la version anglaise et il n'est peut être plus à jour.</i>
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
3
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
4 Sinatra est un DSL pour créer rapidement des applications web en Ruby et sans
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
5 effort:
6
7 # mon_application.rb
8 require 'sinatra'
9 get '/' do
10 'Bonjour Monde!'
11 end
12
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
13 Installez le gem et lancez avec:
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
14
3a25d98 @rkh Adjust examples in French and Spanish READMEs.
rkh authored
15 gem install sinatra
16 ruby -rubygems mon_application.rb
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
17
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
18 Le résultat est visible sur: http://localhost:4567
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
19
20 == Routes
21
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
22 Dans Sinatra, une route est une méthode HTTP couplée à un masque (pattern) URL.
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
23 Chaque route est associée à un bloc:
24
25 get '/' do
26 .. montrer quelque chose ..
27 end
28
29 post '/' do
30 .. créer quelque chose ..
31 end
32
33 put '/' do
34 .. changer quelque chose ..
35 end
36
37 delete '/' do
38 .. effacer quelque chose ..
39 end
40
41 Les routes sont comparées dans l'ordre où elles ont été définies. La première route qui
42 correspond à la requête est invoquée.
43
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
44 Les masques peuvent inclure des paramètres, accessibles par l'intermédiaire du
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
45 hash <tt>params</tt>:
46
47 get '/bonjour/:nom' do
48 # répond aux requêtes "GET /bonjour/foo" et "GET /bonjour/bar"
49 # params[:nom] est 'foo' ou 'bar'
50 "Bonjour #{params[:nom]}!"
51 end
52
53 Vous pouvez aussi les nommer directement dans les paramètres du bloc comme ceci:
54
55 get '/bonjour/:nom' do |n|
56 "Bonjour #{n}!"
57 end
58
59 Une route peut contenir un splat (caractère joker), accessible par l'intermédiaire de
60 la liste <tt>params[:splat]</tt>.
61
62 get '/dire/*/a/*' do
63 # répondrait à /dire/bonjour/a/monde
64 params[:splat] # => ["bonjour", "monde"]
65 end
66
67 get '/telecharger/*.*' do
68 # répondrait à /telecharger/chemin/vers/fichier.xml
69 params[:splat] # => ["chemin/vers/fichier", "xml"]
70 end
71
72 Une route peut s'exprimer avec une Expression Régulière:
73
74 get %r{/bonjour/([\w]+)} do
75 "Bonjour, #{params[:captures].first}!"
76 end
77
78 Là aussi on peut utiliser les paramètres de bloc:
79
80 get %r{/bonjour/([\w]+)} do |c|
81 "Bonjour, #{c}!"
82 end
83
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
84 === Conditions
85
86 Les routes peuvent définir toutes sortes de conditions, comme par exemple le "user agent":
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
87
88 get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
89 "Vous utilisez Songbird version #{params[:agent][0]}"
90 end
91
92 get '/foo' do
93 # Correspond à tous les autres navigateurs
94 end
95
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
96 Les autres conditions disponibles sont +host_name+ et +provides+:
97
98 get '/', :host_name => /^admin\./ do
99 "Zone Administrateur, Accès refusé!"
100 end
101
102 get '/', :provides => 'html' do
103 haml :index
104 end
105
106 get '/', :provides => ['rss', 'atom', 'xml'] do
107 builder :feed
108 end
109
110 Vous pouvez facilement définir vos propres conditions:
111
112 set(:probability) { |value| condition { rand <= value } }
113
114 get '/gagner_une_voiture', :probability => 0.1 do
115 "Vous avez gagné!"
116 end
117
118 get '/gagner_une_voiture' do
119 "Désolé, vous avez perdu."
120 end
121
122 === Valeurs de retour
123
124 La valeur de retour d'un bloc définissant une route détermine le corps de la réponse
125 qui sera transmise au client HTTP ou du moins au prochain middleware dans la pile Rack.
126 Le plus généralement, il s'agit d'une chaîne de caractères, comme dans les exemples
127 précédents. Cependant, d'autres valeurs sont acceptées.
128
129 Vous pouvez renvoyer n'importe quel objet qui soit une réponse Rack valide, un corps de
130 réponse Rack ou un code retour HTTP:
131
132 * Un tableau de 3 éléments: <tt>[code retour (Fixnum), entêtes (Hash), corps de réponse (répondant à #each)]</tt>
133 * Un tableau de 2 élements: <tt>[code retour (Fixnum), corps de réponse (répondant à #each)]</tt>
134 * Un objet qui répond à <tt>#each</tt> et qui ne transmet que des chaînes de caractères au bloc fourni
135 * Un Fixnum représentant le code retour
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
136
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
137 Ainsi, on peut facilement implémenter un streaming par exemple:
138
139 class Stream
140 def each
141 100.times { |i| yield "#{i}\n" }
142 end
143 end
144
145 get('/') { Stream.new }
146
147 == Fichiers statiques
148
149 Par défaut, le dossier <tt>./public</tt> est utilisé pour servir les fichiers statiques.
150 Vous pouvez changer ce dossier pour un autre nom grâce à l'option <tt>:public</tt>:
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
151
152 set :public, File.dirname(__FILE__) + '/statique'
153
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
154 Notez que le nom du dossier public n'est pas inclus dans l'URL. Un fichier sous
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
155 <tt>./public/css/style.css</tt> est appelé avec l'URL: <tt>http://exemple.com/css/style.css</tt>.
156
157 == Vues / Templates
158
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
159 Par défaut, les templates sont cherchés dans le dossier <tt>./views</tt>.
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
160 Pour utiliser un autre dossier, il faut le déclarer:
161
162 set :views, File.dirname(__FILE__) + '/templates'
163
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
164 Il est important de noter que les templates sont toujours référencés
165 sous forme de symboles, même s'il s'agit d'un sous-répertoire (dans ce
166 cas, utilisez <tt>:'sous_repertoire/template'</tt>). Vous devez utiliser un symbole
167 car les méthodes de rendu évalueront le contenu des chaînes de caractères
168 au lieu de les considérer comme un chemin vers un fichier.
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
169
170 === Templates Haml
171
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
172 Le gem haml est nécessaire pour utiliser la fonction de rendu Haml:
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
173
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
174 ## Chargez la bibliothèque haml dans votre application
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
175 require 'haml'
176
177 get '/' do
178 haml :index
179 end
180
181 Utilisera le template: <tt>./views/index.haml</tt>.
182
183 {Les options de Haml}[http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#options]
184 peuvent se manipuler directement avec la configuration de Sinatra,
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
185 voir {Options et Configuration}[http://www.sinatrarb.com/configuration.html],
186 et supportent aussi la réécriture (surcharge) comme dans cet exemple.
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
187
3a25d98 @rkh Adjust examples in French and Spanish READMEs.
rkh authored
188 set :haml, :format => :html5 # le format par défaut dans Haml est :xhtml
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
189
190 get '/' do
3a25d98 @rkh Adjust examples in French and Spanish READMEs.
rkh authored
191 haml :index, :format => :html4 # surcharge
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
192 end
193
194
195 === Templates Erb
196
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
197 ## Chargez la bibliothèque erb dans votre application
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
198 require 'erb'
199
200 get '/' do
201 erb :index
202 end
203
204 Utilisera le template: <tt>./views/index.erb</tt>
205
206 === Erubis
207
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
208 Le gem erubis est nécessaire pour utiliser la fonction de rendu erubis:
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
209
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
210 ## Chargez la bibliothèque erubis dans votre application
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
211 require 'erubis'
212
213 get '/' do
214 erubis :index
215 end
216
217 Utilisera le template: <tt>./views/index.erubis</tt>
218
219 === Templates Builder
220
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
221 Le gem builder est nécessaire pour utiliser la fonction de rendu builder:
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
222
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
223 ## Chargez la bibliothèque builder dans votre application
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
224 require 'builder'
225
226 get '/' do
227 content_type 'application/xml', :charset => 'utf-8'
228 builder :index
229 end
230
231 Utilisera le template: <tt>./views/index.builder</tt>.
232
dd81da1 @rkh Add nokogiri helper method. Tilt supports Nokogiri for quite some tim…
rkh authored
233 === Templates Nokogiri
234
235 Le gem nokogiri est nécessaire pour utiliser la fonction de rendu nokogiri:
236
237 ## Chargez la bibliothèque nokogiri dans votre application
238 require 'nokogiri'
239
240 get '/' do
241 content_type 'application/xml', :charset => 'utf-8'
242 nokogiri :index
243 end
244
245 Utilisera le template: <tt>./views/index.nokogiri</tt>.
246
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
247 === Templates Sass
248
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
249 Le gem sass est nécessaire pour utiliser la fonction de rendu Sass:
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
250
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
251 ## Chargez la bibliothèque haml ou sass dans votre application
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
252 require 'sass'
253
254 get '/stylesheet.css' do
255 content_type 'text/css', :charset => 'utf-8'
256 sass :stylesheet
257 end
258
259 Utilisera le template: <tt>./views/stylesheet.sass</tt>.
260
261 {Les options de Sass}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
262 peuvent se manipuler directement avec la configuration de Sinatra,
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
263 voir {Options et Configuration}[http://www.sinatrarb.com/configuration.html],
264 et supportent aussi la réécriture (surcharge) comme dans cet exemple.
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
265
3a25d98 @rkh Adjust examples in French and Spanish READMEs.
rkh authored
266 set :sass, :style => :compact # le style par défaut dans Sass est :nested
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
267
268 get '/stylesheet.css' do
269 content_type 'text/css', :charset => 'utf-8'
270 sass :stylesheet, :style => :expanded # surcharge
271 end
272
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
273 === Scss Templates
274
275 Le gem sass est nécessaire pour utiliser la fonction de rendu Scss:
276
277 ## Chargez la bibliothèque haml ou sass dans votre application
278 require 'sass'
279
280 get '/stylesheet.css' do
281 content_type 'text/css', :charset => 'utf-8'
282 scss :stylesheet
283 end
284
285 Utilisera le template <tt>./views/stylesheet.scss</tt>.
286
287 {Les options de Scss}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
288 peuvent se manipuler directement avec la configuration de Sinatra,
289 voir {Options et Configuration}[http://www.sinatrarb.com/configuration.html],
290 et supportent aussi la réécriture (surcharge) comme dans cet exemple.
291
292 set :scss, :style => :compact # le style par défaut de Scss est :nested
293
294 get '/stylesheet.css' do
295 content_type 'text/css', :charset => 'utf-8'
296 scss :stylesheet, :style => :expanded # surcharge
297 end
298
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
299 === Templates Less
300
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
301 Le gem less est nécessaire pour utiliser la fonction de rendu Less:
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
302
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
303 ## Chargez la bibliothèque less dans votre application
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
304 require 'less'
305
306 get '/stylesheet.css' do
307 content_type 'text/css', :charset => 'utf-8'
308 less :stylesheet
309 end
310
311 Utilisera le template: <tt>./views/stylesheet.less</tt>.
312
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
313 === Templates Liquid
314
315 Le gem liquid est nécessaire pour utiliser la fonction de rendu Liquid:
316
317 ## Chargez la bibliothèque liquid dans votre application
318 require 'liquid'
319
320 get '/' do
321 liquid :index
322 end
323
324 Utilisera <tt>./views/index.liquid</tt>.
325
326 Comme vous ne pouvez pas appeler des méthodes Ruby (excepté +yield+) dans un
327 template Liquid, il sera toujours nécessaire de lui passer des variables locales:
328
329 liquid :index, :locals => { :key => 'value' }
330
331 === Templates Markdown
332
333 Le gem rdiscount est nécessaire pour utiliser la fonction de rendu Markdown:
334
335 ## Chargez la bibliothèque rdiscount dans votre application
336 require "rdiscount"
337
338 get '/' do
339 markdown :index
340 end
341
342 Utilisera <tt>./views/index.markdown</tt> (les extensions de fichier +md+ et +mkd+
343 sont également acceptées).
344
345 Il n'est pas possible d'appeler des méthodes depuis markdown, ni même de lui passer des variables
346 locales. Par conséquent, il sera le plus souvent utilisé en combinaison avec un autre moteur
347 de rendu:
348
349 erb :vuedensemble, :locals => { :texte => markdown(:introduction) }
350
351 Notez que vous pouvez également appeler la méthode markdown au sein d'autres templates:
352
353 %h1 Bonjour Depuis Haml!
354 %p= markdown(:salutations)
355
356 === Templates Textile
357
358 Le gem RedCloth est nécessaire pour utiliser la fonction de rendu Textile:
359
360 ## Chargez la bibliothèqye redcloth dans votre application
361 require "redcloth"
362
363 get '/' do
364 textile :index
365 end
366
367 Utilisera <tt>./views/index.textile</tt>.
368
369 Il n'est pas possible d'appeler des méthodes depuis textile, ni même de lui passer des variables
370 locales. Par conséquent, il sera le plus souvent utilisé en combinaison avec un autre moteur
371 de rendu:
372
373 erb :vuedensemble, :locals => { :texte => textile(:introduction) }
374
375 Notez que vous pouvez également appeler la méthode textile au sein d'autres templates:
376
377 %h1 Bonjour Depuis Haml!
378 %p= textile(:salutations)
379
380 === Templates RDoc
381
382 Le gem RDoc est nécessaire pour utiliser la fonction de rendu RDoc:
383
384 ## Chargez la bibliothèque rdoc dans votre application
385 require "rdoc"
386
387 get '/' do
388 rdoc :index
389 end
390
391 Utilisera <tt>./views/index.rdoc</tt>.
392
393 Il n'est pas possible d'appeler des méthodes depuis rdoc, ni même de lui passer des variables
394 locales. Par conséquent, il sera le plus souvent utilisé en combinaison avec un autre moteur
395 de rendu:
396
397 erb :vuedensemble, :locals => { :texte => rdoc(:introduction) }
398
399 Notez que vous pouvez également appeler la méthode rdoc au sein d'autres templates:
400
401 %h1 Bonjour Depuis Haml!
402 %p= rdoc(:salutations)
403
404 === Templates Radius
405
406 Le gem radius est nécessaire pour utiliser la fonction de rendu Radius:
407
408 ## Chargez la bibliotèque radius dans votre application
409 require 'radius'
410
411 get '/' do
412 radius :index
413 end
414
415 Utilisera <tt>./views/index.radius</tt>.
416
417 Comme vous ne pouvez pas appeler des méthodes Ruby (excepté +yield+) dans un
418 template Radius, il sera toujours nécessaire de lui passer des variables locales:
419
420 radius :index, :locals => { :key => 'value' }
421
422 === Templates Markaby
423
424 Le gem markaby est nécessaire pour utiliser la fonction de rendu Markaby:
425
426 ## Chargez la bibliothèque markaby dans votre application
427 require 'markaby'
428
429 get '/' do
430 markaby :index
431 end
432
433 Utilisera <tt>./views/index.mab</tt>.
434
435 === Templates CoffeeScript
436
437 Le gem coffee-script et l'exécutable `coffee` sont nécessaires pour utiliser la
438 fonction de rendu CoffeeScript:
439
440 ## Chargez la bibliothèque coffee-script dans votre application
441 require 'coffee-script'
442
443 get '/application.js' do
444 content_type 'text/javascript', :charset => 'utf-8'
445 coffee :application
446 end
447
448 Utilisera <tt>./views/application.coffee</tt>.
449
450 === Templates en ligne
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
451
452 get '/' do
453 haml '%div.title Bonjour Monde'
454 end
455
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
456 Utilisera le texte passé en argument pour générer la page, au lieu d'aller
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
457 chercher le texte dans un fichier.
458
459 === Accéder aux variables dans un Template
460
461 Un template est évalué dans le même contexte que l'endroit d'où il a été
462 appelé (gestionnaire de route). Les variables d'instance déclarées dans le
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
463 gestionnaire de route sont directement accessibles dans le template:
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
464
465 get '/:id' do
466 @foo = Foo.find(params[:id])
467 haml '%h1= @foo.nom'
468 end
469
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
470 Alternativement, on peut passer un hash contenant des variables locales:
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
471
472 get '/:id' do
473 foo = Foo.find(params[:id])
474 haml '%h1= foo.nom', :locals => { :foo => foo }
475 end
476
477 Ceci est généralement utilisé lorsque l'on veut utiliser un template comme partiel
478 (depuis un autre template) et qu'il est donc nécessaire d'adapter les noms de variables.
479
480 === Templates dans le fichier source
481
482 Des templates peuvent être définis dans le fichier source comme ceci:
483
484 require 'rubygems'
485 require 'sinatra'
486
487 get '/' do
488 haml :index
489 end
490
491 __END__
492
493 @@ layout
494 %html
495 = yield
496
497 @@ index
498 %div.title Bonjour Monde!!!!!
499
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
500 NOTE: Les templates du fichier source qui contient <tt>require 'sinatra'</tt>
501 sont automatiquement chargés. Si vous avez des templates dans d'autres fichiers source,
502 il faut explicitement les déclarer via: `enable :inline_templates`.
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
503
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
504 === Templates nommés
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
505
506 Les templates peuvent aussi être définis grâce à la méthode de haut niveau <tt>template</tt>:
507
508 template :layout do
509 "%html\n =yield\n"
510 end
511
512 template :index do
513 '%div.title Bonjour Monde!'
514 end
515
516 get '/' do
517 haml :index
518 end
519
520 Si un template nommé "layout" existe, il sera utilisé à chaque fois qu'un template
521 sera affiché. Vous pouvez désactivez le layout à tout moment en passant
522 <tt>:layout => false</tt>.
523
524 get '/' do
525 haml :index, :layout => !request.xhr?
526 end
527
528 == Helpers
529
530 Utilisez la méthode de haut niveau <tt>helpers</tt> pour définir des routines qui
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
531 seront accessibles dans vos gestionnaires de route et dans vos templates:
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
532
533 helpers do
534 def bar(nom)
535 "#{nom}bar"
536 end
537 end
538
539 get '/:nom' do
540 bar(params[:nom])
541 end
542
543 == Filtres
544
545 Un filtre <tt>before</tt> est évalué avant n'importe quelle requête, dans le
546 contexte de celle-ci, et peut modifier la requête ou la réponse. Les variables
547 d'instance déclarées dans le filtre sont accessibles au gestionnaire de route
548 et au template:
549
550 before do
551 @note = 'Coucou!'
552 request.path_info = '/foo/bar/baz'
553 end
554
555 get '/foo/*' do
556 @note #=> 'Coucou!'
557 params[:splat] #=> 'bar/baz'
558 end
559
560 Un filtre <tt>after</tt> est évalué après chaque requête, dans le contexte
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
561 de celle-ci et peut également modifier la requête et/ou la réponse. Toutes les
562 variables d'instance déclarées dans un filtre <tt>before</tt> et dans le gestionnaire
563 de route sont accessibles dans le filtre <tt>after</tt>:
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
564
565 after do
566 puts response.status
567 end
568
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
569 En option, on peut passer un masque au filtre, ce qui le rend actif uniquement
570 si la requête correspond au masque en question:
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
571
572 before '/secret/*' do
573 authentification!
574 end
575
576 after '/faire/:travail' do |travail|
577 session[:dernier_travail] = travail
578 end
579
580 == Halt
581
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
582 Pour arrêter immédiatement la requête dans un filtre ou un gestionnaire de route:
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
583
584 halt
585
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
586 Vous pouvez aussi passer le code retour ...
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
587
588 halt 410
589
590 Ou le texte ...
591
592 halt 'Ceci est le texte'
593
594 Ou les deux ...
595
596 halt 401, 'Partez!'
597
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
598 Ainsi que les entêtes ...
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
599
600 halt 402, {'Content-Type' => 'text/plain'}, 'revanche'
601
602 == Passer
603
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
604 Une route peut passer le relais aux autres routes qui correspondent également
605 avec <tt>pass</tt>:
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
606
607 get '/devine/:qui' do
608 pass unless params[:qui] == 'Frank'
609 "Tu m'as eu!"
610 end
611
612 get '/devine/*' do
613 'Manqué!'
614 end
615
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
616 On sort donc immédiatement de ce gestionnaire et on continue à chercher,
617 dans les masques suivants, le prochain qui correspond à la requête.
618 Si aucun des masques suivants ne correspond, un code 404 est retourné.
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
619
620 == Configuration
621
622 Lancé une seule fois au démarrage de tous les environnements:
623
624 configure do
625 ...
626 end
627
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
628 Lancé si l'environnement (variable d'environnement RACK_ENV) est défini comme
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
629 <tt>:production</tt>:
630
631 configure :production do
632 ...
633 end
634
635 Lancé si l'environnement est <tt>:production</tt> ou
636 <tt>:test</tt>:
637
638 configure :production, :test do
639 ...
640 end
641
642 == Gérer les erreurs
643
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
644 Les gestionnaires d'erreur s'exécutent dans le même contexte que les routes ou les
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
645 filtres, ce qui veut dire que vous avez accès (entre autres) aux bons vieux
646 <tt>haml</tt>, <tt>erb</tt>, <tt>halt</tt>, etc.
647
648 === Pas Trouvé
649
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
650 Quand une exception <tt>Sinatra::NotFound</tt> est soulevée, ou que le code retour
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
651 est 404, le gestionnaire <tt>not_found</tt> est invoqué:
652
653 not_found do
654 'Pas moyen de trouver ce que vous cherchez'
655 end
656
657 === Erreur
658
659 Le gestionnaire +error+ est invoqué à chaque fois qu'une exception est soulevée dans une route
660 ou un filtre. L'objet exception est accessible via la variable Rack <tt>sinatra.error</tt>:
661
662 error do
663 'Désolé mais une méchante erreur est survenue - ' + env['sinatra.error'].name
664 end
665
666 Erreur sur mesure:
667
668 error MonErreurSurMesure do
669 'Donc il est arrivé ceci...' + request.env['sinatra.error'].message
670 end
671
672 Donc si ceci arrive:
673
674 get '/' do
675 raise MonErreurSurMesure, 'quelque chose de mal'
676 end
677
678 Vous obtenez ça:
679
680 Donc il est arrivé ceci... quelque chose de mal
681
682 Alternativement, vous pouvez avoir un gestionnaire d'erreur associé à un code particulier:
683
684 error 403 do
685 'Accès interdit'
686 end
687
688 get '/secret' do
689 403
690 end
691
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
692 Ou un intervalle:
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
693
694 error 400..510 do
695 'Boom'
696 end
697
698 Sinatra installe pour vous quelques gestionnaires <tt>not_found</tt> et <tt>error</tt>
699 génériques lorsque vous êtes en environnement <tt>development</tt>.
700
701 == Types Mime
702
703 Quand vous utilisez <tt>send_file</tt> et que le fichier possède une extension que Sinatra
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
704 ne reconnaît pas, utilisez +mime_type+ pour la déclarer:
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
705
706 mime_type :foo, 'text/foo'
707
708 Vous pouvez aussi l'utiliser avec +content_type+:
709
710 content_type :foo
711
712 == Les Middlewares Rack
713
714 Sinatra tourne avec Rack[http://rack.rubyforge.org/], une interface standard
715 et minimale pour les web frameworks Ruby. Un des points forts de Rack est le
716 support de ce que l'on appelle des "middlewares" -- composant qui vient se situer
717 entre le serveur et votre application, et dont le but est de visualiser/manipuler la
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
718 requête/réponse HTTP, et d'offrir diverses fonctionnalités classiques.
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
719
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
720 Sinatra permet de construire facilement des middlewares Rack via la méthode de
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
721 haut niveau +use+:
722
723 require 'sinatra'
724 require 'mon_middleware_perso'
725
726 use Rack::Lint
727 use MonMiddlewarePerso
728
729 get '/bonjour' do
730 'Bonjour Monde'
731 end
732
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
733 La sémantique de +use+ est identique à celle définie dans le DSL de
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
734 Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html]
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
735 (le plus souvent utilisé dans un fichier rackup). Par exemple, la méthode +use+
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
736 accepte divers arguments ainsi que des blocs:
737
738 use Rack::Auth::Basic do |login, password|
739 login == 'admin' && password == 'secret'
740 end
741
742 Rack est distribué avec une bonne variété de middlewares standards pour les logs,
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
743 débuguer, faire du routage URL, de l'authentification, gérer des sessions.
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
744 Sinatra utilise beaucoup de ces composants automatiquement via la configuration,
745 donc pour ceux-ci vous n'aurez pas à utiliser la méthode +use+.
746
747 == Tester
748
749 Les tests pour Sinatra peuvent être écrit avec n'importe quelle bibliothèque
750 basée sur Rack. {Rack::Test}[http://gitrdoc.com/brynary/rack-test] est
751 recommandé:
752
753 require 'mon_application_sinatra'
754 require 'rack/test'
755
756 class MonTest < Test::Unit::TestCase
757 include Rack::Test::Methods
758
759 def app
760 Sinatra::Application
761 end
762
763 def test_ma_racine
764 get '/'
765 assert_equal 'Bonjour Monde!', last_response.body
766 end
767
768 def test_avec_des_parametres
769 get '/rencontrer', :name => 'Frank'
770 assert_equal 'Salut Frank!', last_response.body
771 end
772
773 def test_avec_rack_env
774 get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
775 assert_equal "Vous utilisez Songbird!", last_response.body
776 end
777 end
778
779 NOTE: Le module intégré Sinatra::Test et la classe Sinatra::TestHarness
780 sont désapprouvés depuis la version 0.9.2 .
781
782 == Sinatra::Base - Les Middlewares, les Bibliothèques, et les Applications Modulaires
783
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
784 Définir votre application au niveau supérieur fonctionne bien pour les
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
785 micro-applications, mais peut s'avérer moins pratique lorsqu'il s'agit
786 de créer des composants réutilisables comme des middlewares Rack, faire
787 du Rails metal, ou de simples bibliothèques avec un composant serveur, ou
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
788 même une extension pour Sinatra. Le DSL de haut niveau pollue l'espace de noms
789 et est une configuration adaptée à une micro-application (un fichier unique
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
790 pour l'application, les dossiers ./public et ./views, les logs, pages d'erreur, etc.).
791 C'est là que Sinatra::Base entre en jeu:
792
793 require 'sinatra/base'
794
795 class MonApplication < Sinatra::Base
796 set :sessions, true
797 set :foo, 'bar'
798
799 get '/' do
800 'Bonjour Monde!'
801 end
802 end
803
804 La classe MonApplication est un composant Rack indépendant qui peut agir
805 comme un middleware Rack, une application Rack, ou Rails metal. vous pouvez
806 donc le lancer avec +run+ ou l'utiliser avec +use+ dans un fichier rackup;
807 ou contrôler un composant de serveur sous forme de bibliothèque:
808
809 MonApplication.run! :host => 'localhost', :port => 9090
810
811 Les méthodes disponibles dans Sinatra::Base sont exactement identiques à
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
812 celles disponibles dans le DSL de haut niveau. La plupart des applications
813 de haut niveau peuvent être converties en composant Sinatra::Base avec
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
814 deux modifications:
815
816 * Votre fichier doit charger +sinatra/base+ au lieu de +sinatra+;
817 autrement, toutes les méthodes de la DSL seront chargées dans l'espace
818 de noms.
819 * Mettre vos gestionnaires de route, vos gestionnaires d'erreur, vos filtres
820 et options dans une sous-classe de Sinatra::Base.
821
822 +Sinatra::Base+ est plutôt épuré. La plupart des options sont désactivées par défaut,
823 ceci inclus le serveur. Voir {Options et Configuration}[http://sinatra.github.com/configuration.html]
824 pour plus de détails sur les options et leur comportement.
825
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
826 === Utiliser Sinatra comme Middleware
827
828 Non seulement Sinatra peut utiliser d'autres middlewares Rack, il peut également être
829 à son tour utilisé au-dessus de n'importe quel +endpoint+ Rack en tant que middleware.
830 Ce +endpoint+ peut très bien être une autre application Sinatra, ou n'importe quelle
831 application basée sur Rack (Rails/Ramaze/Camping/...).
832
833 require 'sinatra/base'
834
835 class EcranDeConnexion < Sinatra::Base
836 enable :session
837
838 get('/connexion') { haml :connexion }
839
840 post('/connexion') do
841 if params[:nom] = 'admin' and params[:motdepasse] = 'admin'
842 session['nom_utilisateur'] = params[:nom]
843 else
844 redirect '/connexion'
845 end
846 end
847 end
848
849 class MonApp < Sinatra::Base
850 # le middleware sera appelé avant les filtres
851 use EcranDeConnexion
852
853 before do
854 unless session['nom_utilisateur']
855 halt "Accès refusé, merci de vous <a href='/connexion'>connecter</a>."
856 end
857 end
858
859 get('/') { "Bonjour #{session['nom_utilisateur']}." }
860 end
861
862 == Contextes et Binding
863
864 Le contexte dans lequel vous êtes détermine les méthodes et variables
865 disponibles.
866
867 === Contexte de l'application/classe
868
869 Toute application Sinatra correspond à une sous-classe de Sinatra::Base. Si
870 vous utilisez le DSL haut niveau (<tt>require 'sinatra'</tt>), alors cette classe
871 est Sinatra::Application, sinon il s'agit de la sous-classe que vous avez définie.
872 Dans le contexte de la classe, vous avez accès aux méthodes telles que `get` ou
873 `before`, mais vous n'avez pas accès aux objets `request` ou `session` car c'est la
874 même classe d'application qui traitera toutes les requêtes.
875
876 Les options définies au moyen de `set` deviennent des méthodes de classe:
877
878 class MonApp << Sinatra::Base
879 # Eh, je suis dans le contexte de l'application!
880 set :foo, 42
881 foo # => 42
882
883 get '/foo' do
884 # Eh, je ne suis plus dans le contexte de l'application!
885 end
886 end
887
888 Vous avez le binding du contexte de l'application dans:
889
890 * Le corps de la classe d'application
891 * Les méthodes définies par les extensions
892 * Le bloc passé à `helpers`
893 * Les procs/blocs utilisés comme argument pour `set`
894
895 Vous pouvez atteindre ce contexte (donc la classe) de la façon suivante:
896
897 * Via l'objet passé dans les blocs `configure` (<tt>configure { |c| ... }</tt>)
898 * En utilisant `settings` dans le contexte de la requête
899
900 === Contexte de la requête/instance
901
902 Pour tout traitement d'une requête, une nouvelle instance de votre classe d'application
903 est créée et tous vos gestionnaires sont exécutés dans ce contexte. Dans ce dernier,
904 vous pouvez accéder aux objets `request` et `session` et faire appel aux fonctions
905 de rendu telles que `erb` ou `haml`. Vous pouvez accéder au contexte de l'application
906 depuis le contexte de la requête au moyen de `settings`:
907
908 class MonApp << Sinatra::Base
909 # Eh, je suis dans le contexte de l'application!
910 get '/ajouter_route/:nom' do
911 # Contexte de la requête pour '/ajouter_route/:nom'
912 @value = 42
913
914 settings.get("/#{params[:nom]}") do
915 # Contexte de la requête pour "/#{params[:nom]}"
916 @value # => nil (on est pas au sein de la même requête)
917 end
918
919 "Route ajoutée!"
920 end
921 end
922
923 Vous avez le binding du contexte de la requête dans:
924
925 * les blocs get/head/post/put/delete
926 * les filtres before/after
927 * les méthodes utilitaires (définies au moyen de `helpers`)
928 * les vues/templates
929
930 === Le contexte de délégation
931
932 Le contexte de délégation se contente de transmettre les appels de méthodes au
933 contexte de classe. Toutefois, il ne se comporte pas à 100% comme le contexte de
934 classe car vous n'avez pas le binding de la classe: seules les méthodes
935 spécifiquement déclarées pour délégation sont disponibles et il n'est pas possible
936 de partager des variables/états avec le contexte de classe (comprenez: `self` n'est
937 pas le même). Vous pouvez ajouter des délégation de méthodes en appelant
938 <tt>Sinatra::Delegator.delegate :method_name</tt>.
939
940 Vous avez le binding du contexte de délégation dans:
941
942 * Le binding de haut niveau, si vous avez utilisé <tt>require "sinatra"</tt>
943 * Un objet qui inclut le module `Sinatra::Delegator`
944
945 Jetez un oeil
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
946 pour vous faire une idée: voici le mixin {Sinatra::Delegator}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/base.rb#L1128]
947 qui est {inclus dans l'espace de noms principal}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/main.rb#L28]
948
949 == Ligne de commande
950
951 Les applications en Sinatra peuvent être lancées directement:
952
953 ruby mon_application.rb [-h] [-x] [-e ENVIRONNEMENT] [-p PORT] [-o HOTE] [-s SERVEUR]
954
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
955 Les options sont:
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
956
957 -h # aide
958 -p # déclare le port (4567 par défaut)
959 -o # déclare l'hôte (0.0.0.0 par défaut)
960 -e # déclare l'environnement (+development+ par défaut)
961 -s # déclare le serveur/gestionnaire à utiliser (thin par défaut)
962 -x # active le mutex lock (off par défaut)
963
964 == Essuyer les plâtres
965
966 Si vous voulez utiliser la toute dernière version de Sinatra, créez un
967 clone local et lancez votre application avec le dossier <tt>sinatra/lib</tt>
968 dans votre <tt>LOAD_PATH</tt>:
969
970 cd mon_application
971 git clone git://github.com/sinatra/sinatra.git
972 ruby -Isinatra/lib mon_application.rb
973
974 Alternativement, vous pouvez ajoutez le dossier <tt>sinatra/lib</tt> à votre
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
975 <tt>LOAD_PATH</tt> à l'intérieur de votre application:
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
976
977 $LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
978 require 'rubygems'
979 require 'sinatra'
980
981 get '/a_propos' do
982 "J'utilise la version " + Sinatra::VERSION
983 end
984
985 Pour mettre à jour les sources de Sinatra par la suite:
986
987 cd mon_projet/sinatra
988 git pull
989
990 == Mais encore
991
992 * {Site internet}[http://www.sinatrarb.com/] - Plus de documentation,
993 de news, et des liens vers d'autres ressources.
994 * {Contribuer}[http://www.sinatrarb.com/contributing] - Vous avez trouvé un bug? Besoin
995 d'aide? Vous avez un patch?
4d87a59 @sylvaindesve Updated the French README to include changes made to the English vers…
sylvaindesve authored
996 * {Suivi des problèmes}[http://github.com/sinatra/sinatra/issues]
945a1f8 @mig-hub Add README's French translation.
mig-hub authored
997 * {Twitter}[http://twitter.com/sinatra]
998 * {Mailing List}[http://groups.google.com/group/sinatrarb/topics]
999 * {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] sur http://freenode.net
Something went wrong with that request. Please try again.