sinatra 1.4.3 → 1.4.4
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/.yardopts +3 -2
- data/CHANGES +36 -1
- data/Gemfile +7 -4
- data/README.de.md +25 -25
- data/README.es.md +2 -2
- data/README.fr.md +682 -387
- data/README.hu.md +14 -14
- data/README.jp.md +82 -38
- data/README.ko.md +60 -60
- data/README.md +24 -13
- data/README.pt-br.md +18 -7
- data/README.ru.md +7 -0
- data/Rakefile +2 -0
- data/lib/sinatra/base.rb +104 -49
- data/lib/sinatra/images/404.png +0 -0
- data/lib/sinatra/images/500.png +0 -0
- data/lib/sinatra/{showexceptions.rb → show_exceptions.rb} +0 -0
- data/lib/sinatra/version.rb +1 -1
- data/test/base_test.rb +0 -1
- data/test/compile_test.rb +28 -28
- data/test/filter_test.rb +1 -1
- data/test/helpers_test.rb +11 -0
- data/test/integration/app.rb +17 -0
- data/test/integration_helper.rb +10 -1
- data/test/integration_test.rb +11 -1
- data/test/rdoc_test.rb +2 -2
- data/test/request_test.rb +19 -0
- data/test/response_test.rb +1 -1
- data/test/routing_test.rb +18 -0
- data/test/slim_test.rb +4 -4
- data/test/templates_test.rb +15 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a77c975dfc3ecd79a66e1c9c14fbd1e5e3b6d411
|
4
|
+
data.tar.gz: 354494508bcc4ee11f3f71dd29eed29ca10ebc0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de08e878cebd592101c61121f09971c62bdbddf95dac2a3025521ae0a629554993b3729e56884eca51d428fa0a9042fa28c58ce77774b1f8057f317ca72cc198
|
7
|
+
data.tar.gz: 8ad8c36ec09eb1a6c06f7d493b626f12a2fe3eb82fcf692f311600f58312bfb01a8bb44670b9ff249aa96d621960887b40dcedc0b5b0bff30ec05666ab05ca34
|
data/.yardopts
CHANGED
data/CHANGES
CHANGED
@@ -1,3 +1,38 @@
|
|
1
|
+
= 1.4.4 / 2013-10-21
|
2
|
+
|
3
|
+
* Allow setting layout to false in specifically for a singe rendering engine.
|
4
|
+
(Matt Wildig)
|
5
|
+
|
6
|
+
* Allow using wildcard in argument passed to `request.accept?`. (wilkie)
|
7
|
+
|
8
|
+
* Treat missing Accept header like wild card. (Patricio Mac Adden)
|
9
|
+
|
10
|
+
* Improve tests and documentation. (Darío Javier Cravero, Armen P., michelc,
|
11
|
+
Patricio Mac Adden, Matt Wildig, Vipul A M, utenmiki, George Timoschenko,
|
12
|
+
Diogo Scudelletti)
|
13
|
+
|
14
|
+
* Fix Ruby warnings. (Vipul A M, Patricio Mac Adden)
|
15
|
+
|
16
|
+
* Improve self-hosted server started by `run!` method or in classic mode.
|
17
|
+
(Tobias Bühlmann)
|
18
|
+
|
19
|
+
* Reduce objects allocated per request. (Vipul A M)
|
20
|
+
|
21
|
+
* Drop unused, undocumented options hash from Sinatra.new. (George Timoschenko)
|
22
|
+
|
23
|
+
* Keep Content-Length header when response is a `Rack::File` or when streaming.
|
24
|
+
(Patricio Mac Adden, George Timoschenko)
|
25
|
+
|
26
|
+
* Use reel if it's the only server available besides webrick. (Tobias Bühlmann)
|
27
|
+
|
28
|
+
* Add `disable :traps` so setting up signal traps for self hosted server can be
|
29
|
+
skipped. (George Timoschenko)
|
30
|
+
|
31
|
+
* The `status` option passed to `send_file` may now be a string. (George
|
32
|
+
Timoschenko)
|
33
|
+
|
34
|
+
* Reduce file size of dev mode images for 404 and 500 pages. (Francis Go)
|
35
|
+
|
1
36
|
= 1.4.3 / 2013-06-07
|
2
37
|
|
3
38
|
* Running a Sinatra file directly or via `run!` it will now ignore an
|
@@ -118,7 +153,7 @@
|
|
118
153
|
* Add `x_cascade` option to disable `X-Cascade` header on missing route.
|
119
154
|
(Konstantin Haase)
|
120
155
|
|
121
|
-
* Improve documentation. (Kashyap, Stanislav Chistenko, Zachary Scott,
|
156
|
+
* Improve documentation. (Kashyap, Stanislav Chistenko, Zachary Scott,
|
122
157
|
Anthony Accomazzo, Peter Suschlik, Rachel Mehl, ymmtmsys, Anurag Priyam,
|
123
158
|
burningTyger, Tony Miller, akicho8, Vasily Polovnyov, Markus Prinz,
|
124
159
|
Alexey Muranov, Erik Johnson, Vipul A M, Konstantin Haase)
|
data/Gemfile
CHANGED
@@ -41,10 +41,13 @@ gem 'maruku'
|
|
41
41
|
gem 'creole'
|
42
42
|
gem 'markaby'
|
43
43
|
gem 'radius'
|
44
|
-
|
44
|
+
unless RUBY_ENGINE =~ /jruby|maglev/
|
45
|
+
gem 'rabl'
|
46
|
+
gem 'activesupport', '< 4.0.0' if RUBY_VERSION < '1.9.3'
|
47
|
+
end
|
45
48
|
gem 'wlang', '>= 2.0.1' unless RUBY_ENGINE =~ /jruby|rbx/
|
46
49
|
gem 'therubyracer' unless RUBY_ENGINE =~ /jruby|rbx/
|
47
|
-
gem 'redcarpet' unless RUBY_ENGINE == 'jruby'
|
50
|
+
gem 'redcarpet' unless RUBY_ENGINE == 'jruby' || RUBY_VERSION == '1.8.7'
|
48
51
|
gem 'bluecloth' unless RUBY_ENGINE == 'jruby'
|
49
52
|
|
50
53
|
if RUBY_ENGINE != 'rbx' or RUBY_VERSION < '1.9'
|
@@ -58,7 +61,7 @@ if RUBY_ENGINE == 'jruby'
|
|
58
61
|
gem 'trinidad'
|
59
62
|
else
|
60
63
|
gem 'yajl-ruby'
|
61
|
-
gem 'nokogiri'
|
64
|
+
gem 'nokogiri' if RUBY_VERSION >= '1.9.2'
|
62
65
|
gem 'thin'
|
63
66
|
end
|
64
67
|
|
@@ -70,7 +73,7 @@ if RUBY_ENGINE != 'jruby' or not ENV['TRAVIS']
|
|
70
73
|
# C extensions
|
71
74
|
gem 'rdiscount' if RUBY_VERSION != '1.9.2'
|
72
75
|
platforms(:ruby_18) do
|
73
|
-
gem 'redcarpet'
|
76
|
+
#gem 'redcarpet'
|
74
77
|
gem 'mongrel'
|
75
78
|
end
|
76
79
|
gem 'RedCloth' unless RUBY_ENGINE == "macruby"
|
data/README.de.md
CHANGED
@@ -456,38 +456,38 @@ Einstellungen:
|
|
456
456
|
Praktisch für Partials:
|
457
457
|
|
458
458
|
<tt>erb "<%= foo %>", :locals => {:foo => "bar"}</tt></dd>
|
459
|
-
|
459
|
+
|
460
460
|
<dt>default_encoding</dt>
|
461
461
|
<dd>Gibt die Stringkodierung an, die verwendet werden soll. Voreingestellt
|
462
462
|
auf <tt>settings.default_encoding</tt>.</dd>
|
463
|
-
|
463
|
+
|
464
464
|
<dt>views</dt>
|
465
465
|
<dd>Ordner, aus dem die Templates geladen werden. Voreingestellt auf
|
466
466
|
<tt>settings.views</tt>.</dd>
|
467
|
-
|
467
|
+
|
468
468
|
<dt>layout</dt>
|
469
469
|
<dd>Legt fest, ob ein Layouttemplate verwendet werden soll oder nicht
|
470
470
|
(<tt>true</tt> oder<tt>false</tt>). Ist es ein Symbol, dann legt es fest,
|
471
471
|
welches Template als Layout verwendet wird:
|
472
472
|
|
473
473
|
<tt>erb :index, :layout => !request.xhr?</tt></dd>
|
474
|
-
|
474
|
+
|
475
475
|
<dt>content_type</dt>
|
476
476
|
<dd>Content-Typ den das Template ausgibt. Voreinstellung hängt von der
|
477
477
|
Templatesprache ab.</dd>
|
478
|
-
|
478
|
+
|
479
479
|
<dt>scope</dt>
|
480
480
|
<dd>Scope, in dem das Template gerendert wird. Liegt standardmäßig innerhalb
|
481
481
|
der App-Instanz. Wird Scope geändert, sind Instanzvariablen und
|
482
482
|
Helfermethoden nicht verfügbar.</dd>
|
483
|
-
|
483
|
+
|
484
484
|
<dt>layout_engine</dt>
|
485
485
|
<dd>Legt fest, welcher Renderer für das Layout verantwortlich ist. Hilfreich
|
486
486
|
für Sprachen, die sonst keine Templates unterstützen. Voreingestellt auf
|
487
487
|
den Renderer, der für das Template verwendet wird:
|
488
488
|
|
489
489
|
<tt>set :rdoc, :layout_engine => :erb</tt></dd>
|
490
|
-
|
490
|
+
|
491
491
|
<dt>layout_options</dt>
|
492
492
|
<dd>Besondere Einstellungen, die nur für das Rendering verwendet werden:
|
493
493
|
|
@@ -554,7 +554,7 @@ get('/') { markdown :index }
|
|
554
554
|
<table>
|
555
555
|
<tr>
|
556
556
|
<td>Abhängigkeit</td>
|
557
|
-
<td><a href="http://www.kuwata-lab.com/erubis/">erubis</a> oder erb
|
557
|
+
<td><a href="http://www.kuwata-lab.com/erubis/">erubis</a> oder erb
|
558
558
|
(Standardbibliothek von Ruby)</td>
|
559
559
|
</tr>
|
560
560
|
<tr>
|
@@ -686,7 +686,7 @@ denen man Variablen weitergibt.
|
|
686
686
|
<table>
|
687
687
|
<tr>
|
688
688
|
<td>Abhängigkeit</td>
|
689
|
-
<td>Eine der folgenden Bibliotheken:
|
689
|
+
<td>Eine der folgenden Bibliotheken:
|
690
690
|
<a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
|
691
691
|
<a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
|
692
692
|
<a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
|
@@ -917,7 +917,7 @@ verwendet wird.
|
|
917
917
|
<table>
|
918
918
|
<tr>
|
919
919
|
<td>Abhängigkeit</td>
|
920
|
-
<td><a href="https://github.com/josh/ruby-coffee-script">coffee-script</a>
|
920
|
+
<td><a href="https://github.com/josh/ruby-coffee-script">coffee-script</a>
|
921
921
|
und eine <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme">Möglichkeit JavaScript auszuführen</a>.
|
922
922
|
</td>
|
923
923
|
</tr>
|
@@ -938,7 +938,7 @@ verwendet wird.
|
|
938
938
|
<td>
|
939
939
|
<a href="https://github.com/lucasmazza/ruby-stylus" title="Ruby Stylus">
|
940
940
|
Stylus
|
941
|
-
</a> und eine Möglichkeit
|
941
|
+
</a> und eine Möglichkeit
|
942
942
|
<a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
|
943
943
|
JavaScript auszuführen
|
944
944
|
</a>.
|
@@ -1439,7 +1439,7 @@ get '/' do
|
|
1439
1439
|
end
|
1440
1440
|
```
|
1441
1441
|
|
1442
|
-
Damit lassen sich Streaming-APIs realisieren, sog.
|
1442
|
+
Damit lassen sich Streaming-APIs realisieren, sog.
|
1443
1443
|
[Server Sent Events](http://dev.w3.org/html5/eventsource/), die als Basis für
|
1444
1444
|
[WebSockets](http://en.wikipedia.org/wiki/WebSocket) dienen. Ebenso können sie
|
1445
1445
|
verwendet werden, um den Durchsatz zu erhöhen, wenn ein Teil der Daten von
|
@@ -1469,7 +1469,7 @@ get '/subscribe' do
|
|
1469
1469
|
# Client-Registrierung beim Server, damit Events mitgeteilt werden können
|
1470
1470
|
stream(:keep_open) { |out| connections << out }
|
1471
1471
|
|
1472
|
-
# tote Verbindungen entfernen
|
1472
|
+
# tote Verbindungen entfernen
|
1473
1473
|
connections.reject!(&:closed?)
|
1474
1474
|
|
1475
1475
|
# Rückmeldung
|
@@ -1503,7 +1503,7 @@ get '/' do
|
|
1503
1503
|
end
|
1504
1504
|
```
|
1505
1505
|
|
1506
|
-
Der Logger übernimmt dabei automatisch alle im Rack-Handler eingestellten
|
1506
|
+
Der Logger übernimmt dabei automatisch alle im Rack-Handler eingestellten
|
1507
1507
|
Log-Vorgaben. Ist Loggen ausgeschaltet, gibt die Methode ein Leerobjekt zurück.
|
1508
1508
|
In den Routen und Filtern muss man sich also nicht weiter darum kümmern.
|
1509
1509
|
|
@@ -1522,7 +1522,7 @@ end
|
|
1522
1522
|
Damit auch keine Middleware das Logging aktivieren kann, muss die `logging`
|
1523
1523
|
Einstellung auf `nil` gesetzt werden. Das heißt aber auch, dass `logger` in
|
1524
1524
|
diesem Fall `nil` zurückgeben wird. Üblicherweise wird das eingesetzt, wenn ein
|
1525
|
-
eigener Logger eingerichtet werden soll. Sinatra wird dann verwenden, was in
|
1525
|
+
eigener Logger eingerichtet werden soll. Sinatra wird dann verwenden, was in
|
1526
1526
|
`env['rack.logger']` eingetragen ist.
|
1527
1527
|
|
1528
1528
|
### Mime-Types
|
@@ -1658,7 +1658,7 @@ get '/article/:id' do
|
|
1658
1658
|
end
|
1659
1659
|
```
|
1660
1660
|
|
1661
|
-
ebenso ist es möglich einen
|
1661
|
+
ebenso ist es möglich einen
|
1662
1662
|
[schwachen ETag](http://de.wikipedia.org/wiki/HTTP_ETag) zu verwenden:
|
1663
1663
|
|
1664
1664
|
```ruby
|
@@ -1732,15 +1732,15 @@ send_file 'foo.png', :type => :jpg
|
|
1732
1732
|
<dt>last_modified</dt>
|
1733
1733
|
<dd>Wert für den Last-Modified-Header, Standardwert ist <tt>mtime</tt> der
|
1734
1734
|
Datei.</dd>
|
1735
|
-
|
1735
|
+
|
1736
1736
|
<dt>type</dt>
|
1737
1737
|
<dd>Content-Type, der verwendet werden soll. Wird, wenn nicht angegeben, von
|
1738
1738
|
der Dateiendung abgeleitet.</dd>
|
1739
|
-
|
1739
|
+
|
1740
1740
|
<dt>disposition</dt>
|
1741
1741
|
<dd>Verwendet für Content-Disposition. Mögliche Werte sind: <tt>nil</tt>
|
1742
1742
|
(Standard), <tt>:attachment</tt> und <tt>:inline</tt>.</dd>
|
1743
|
-
|
1743
|
+
|
1744
1744
|
<dt>length</dt>
|
1745
1745
|
<dd>Content-Length-Header. Standardwert ist die Dateigröße.</dd>
|
1746
1746
|
</dl>
|
@@ -1845,7 +1845,7 @@ end
|
|
1845
1845
|
|
1846
1846
|
Diese Methode wird intern für +expires, `last_modiefied` und ihresgleichen
|
1847
1847
|
verwendet. Mit ein paar Handgriffen lässt sich diese Methode also in ihrem
|
1848
|
-
Verhalten erweitern, indem man `time_for` in der eigenen Applikation
|
1848
|
+
Verhalten erweitern, indem man `time_for` in der eigenen Applikation
|
1849
1849
|
überschreibt:
|
1850
1850
|
|
1851
1851
|
```ruby
|
@@ -1911,7 +1911,7 @@ werden!
|
|
1911
1911
|
|
1912
1912
|
Beachte, dass `find_template` nicht prüft, ob eine Datei tatsächlich existiert.
|
1913
1913
|
Es wird lediglich der angegebene Block aufgerufen und nach allen möglichen
|
1914
|
-
Pfaden gesucht. Das ergibt kein Performance-Problem, da `render` `block`
|
1914
|
+
Pfaden gesucht. Das ergibt kein Performance-Problem, da `render` `block`
|
1915
1915
|
verwendet, sobald eine Datei gefunden wurde. Ebenso werden Template-Pfade samt
|
1916
1916
|
Inhalt gecached, solange nicht im Entwicklungsmodus gearbeitet wird. Das sollte
|
1917
1917
|
im Hinterkopf behalten werden, wenn irgendwelche verrückten Methoden
|
@@ -2092,7 +2092,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
2092
2092
|
|
2093
2093
|
<dt>server</dt>
|
2094
2094
|
<dd>Server oder Liste von Servern, die als eingebaute Server zur Verfügung
|
2095
|
-
stehen. Die Reihenfolge gibt die Priorität vor, die Voreinstellung hängt von
|
2095
|
+
stehen. Die Reihenfolge gibt die Priorität vor, die Voreinstellung hängt von
|
2096
2096
|
der verwendenten Ruby Implementierung ab.</dd>
|
2097
2097
|
|
2098
2098
|
<dt>sessions</dt>
|
@@ -2124,7 +2124,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
2124
2124
|
<dt>threaded</dt>
|
2125
2125
|
<dd>Wird es auf <tt>true</tt> gesetzt, wird Thin aufgefordert
|
2126
2126
|
<tt>EventMachine.defer</tt> zur Verarbeitung des Requests einzusetzen.</dd>
|
2127
|
-
|
2127
|
+
|
2128
2128
|
<dt>views</dt>
|
2129
2129
|
<dd>Verzeichnis der Views. Leitet sich von der <tt>app_file</tt> Einstellung
|
2130
2130
|
ab, wenn nicht gesetzt.</dd>
|
@@ -2722,7 +2722,7 @@ ungültig. Ruby 1.9.3 wird bis Sinatra 2.0 unterstützt werden.</dd>
|
|
2722
2722
|
|
2723
2723
|
<dt>JRuby</dt>
|
2724
2724
|
<dd>Aktuelle JRuby Versionen werden offiziell unterstützt. Es wird empfohlen,
|
2725
|
-
keine C-Erweiterungen zu verwenden und als Server Trinidad zu verwenden
|
2725
|
+
keine C-Erweiterungen zu verwenden und als Server Trinidad zu verwenden
|
2726
2726
|
(<tt>gem install trinidad</tt>).</dd>
|
2727
2727
|
</dl>
|
2728
2728
|
|
@@ -2854,7 +2854,7 @@ SemVer und SemVerTag.
|
|
2854
2854
|
* [Issue-Tracker](http://github.com/sinatra/sinatra/issues)
|
2855
2855
|
* [Twitter](http://twitter.com/sinatra)
|
2856
2856
|
* [Mailing-Liste](http://groups.google.com/group/sinatrarb)
|
2857
|
-
* [#sinatra](irc://chat.freenode.net/#sinatra) auf http://freenode.net Es
|
2857
|
+
* [#sinatra](irc://chat.freenode.net/#sinatra) auf http://freenode.net Es
|
2858
2858
|
gibt dort auch immer wieder deutschsprachige Entwickler, die gerne weiterhelfen.
|
2859
2859
|
* [Sinatra Book](http://sinatra-book.gittr.com) Kochbuch Tutorial
|
2860
2860
|
* [Sinatra Recipes](http://recipes.sinatrarb.com/) Sinatra-Rezepte aus der
|
data/README.es.md
CHANGED
@@ -15,14 +15,14 @@ get '/' do
|
|
15
15
|
end
|
16
16
|
```
|
17
17
|
|
18
|
-
|
18
|
+
Instalar la gema y correr la aplicación con:
|
19
19
|
|
20
20
|
``` shell
|
21
21
|
gem install sinatra
|
22
22
|
ruby miapp.rb
|
23
23
|
```
|
24
24
|
|
25
|
-
|
25
|
+
Ver en <http://localhost:4567>.
|
26
26
|
|
27
27
|
Es recomendable además ejecutar `gem install thin`, ya que Sinatra lo va
|
28
28
|
a utilizar cuando esté disponible.
|
data/README.fr.md
CHANGED
@@ -5,7 +5,7 @@ il n'est peut être plus à jour.*
|
|
5
5
|
Sinatra est un [DSL](http://fr.wikipedia.org/wiki/Langage_dédié) pour
|
6
6
|
créer rapidement et facilement des applications web en Ruby :
|
7
7
|
|
8
|
-
```ruby
|
8
|
+
``` ruby
|
9
9
|
# mon_application.rb
|
10
10
|
require 'sinatra'
|
11
11
|
|
@@ -14,11 +14,16 @@ get '/' do
|
|
14
14
|
end
|
15
15
|
```
|
16
16
|
|
17
|
-
Installez la gem
|
17
|
+
Installez la gem Sinatra :
|
18
18
|
|
19
|
-
```
|
20
|
-
|
21
|
-
|
19
|
+
``` shell
|
20
|
+
gem install sinatra
|
21
|
+
```
|
22
|
+
|
23
|
+
Puis lancez votre programme :
|
24
|
+
|
25
|
+
``` shell
|
26
|
+
ruby mon_application.rb
|
22
27
|
```
|
23
28
|
|
24
29
|
Le résultat est visible sur : http://localhost:4567
|
@@ -26,12 +31,97 @@ Le résultat est visible sur : http://localhost:4567
|
|
26
31
|
Il est recommandé d'exécuter également `gem install thin`, pour que
|
27
32
|
Sinatra utilise le server Thin quand il est disponible.
|
28
33
|
|
34
|
+
## Table des matières
|
35
|
+
|
36
|
+
* [Sinatra](#sinatra)
|
37
|
+
* [Table des matières](#table-des-matières)
|
38
|
+
* [Routes](#routes)
|
39
|
+
* [Conditions](#conditions)
|
40
|
+
* [Valeurs de retour](#valeurs-de-retour)
|
41
|
+
* [Masques de route spécifiques](#masques-de-route-spécifiques)
|
42
|
+
* [Fichiers statiques](#fichiers-statiques)
|
43
|
+
* [Vues / Templates](#vues--templates)
|
44
|
+
* [Templates littéraux](#templates-littéraux)
|
45
|
+
* [Langages de template disponibles](#langages-de-template-disponibles)
|
46
|
+
* [Templates Haml](#templates-haml)
|
47
|
+
* [Templates Erb](#templates-erb)
|
48
|
+
* [Templates Builder](#templates-builder)
|
49
|
+
* [Templates Nokogiri](#templates-nokogiri)
|
50
|
+
* [Templates Sass](#templates-sass)
|
51
|
+
* [Templates SCSS](#templates-scss)
|
52
|
+
* [Templates Less](#templates-less)
|
53
|
+
* [Templates Liquid](#templates-liquid)
|
54
|
+
* [Templates Markdown](#templates-markdown)
|
55
|
+
* [Templates Textile](#templates-textile)
|
56
|
+
* [Templates RDoc](#templates-rdoc)
|
57
|
+
* [Templates Radius](#templates-radius)
|
58
|
+
* [Templates Markaby](#templates-markaby)
|
59
|
+
* [Templates RABL](#templates-rabl)
|
60
|
+
* [Templates Slim](#templates-slim)
|
61
|
+
* [Templates Creole](#templates-creole)
|
62
|
+
* [Templates CoffeeScript](#templates-coffeescript)
|
63
|
+
* [Templates Stylus](#templates-stylus)
|
64
|
+
* [Templates Yajl](#templates-yajl)
|
65
|
+
* [Templates WLang](#templates-wlang)
|
66
|
+
* [Accéder aux variables dans un Template](#accéder-aux-variables-dans-un-template)
|
67
|
+
* [Templates avec `yield` et layouts imbriqués](#templates-avec-yield-et-layouts-imbriqués)
|
68
|
+
* [Templates dans le fichier source](#templates-dans-le-fichier-source)
|
69
|
+
* [Templates nommés](#templates-nommés)
|
70
|
+
* [Associer des extensions de fichier](#associer-des-extensions-de-fichier)
|
71
|
+
* [Ajouter son propre moteur de rendu](#ajouter-son-propre-moteur-de-rendu)
|
72
|
+
* [Filtres](#filtres)
|
73
|
+
* [Helpers](#helpers)
|
74
|
+
* [Utiliser les sessions](#utiliser-les-sessions)
|
75
|
+
* [Halt](#halt)
|
76
|
+
* [Passer](#passer)
|
77
|
+
* [Déclencher une autre route](#déclencher-une-autre-route)
|
78
|
+
* [Définir le corps, le code retour et les entêtes](#définir-le-corps-le-code-retour-et-les-entêtes)
|
79
|
+
* [Faire du streaming](#faire-du-streaming)
|
80
|
+
* [Journalisation (Logging)](#journalisation-logging)
|
81
|
+
* [Types Mime](#types-mime)
|
82
|
+
* [Former des URLs](#former-des-urls)
|
83
|
+
* [Redirection du navigateur](#redirection-du-navigateur)
|
84
|
+
* [Contrôle du cache](#contrôle-du-cache)
|
85
|
+
* [Envoyer des fichiers](#envoyer-des-fichiers)
|
86
|
+
* [Accéder à l'objet requête](#accéder-à-lobjet-requête)
|
87
|
+
* [Fichiers joints](#fichiers-joints)
|
88
|
+
* [Gérer Date et Time](#gérer-date-et-time)
|
89
|
+
* [Chercher les fichiers de templates](#chercher-les-fichiers-de-templates)
|
90
|
+
* [Configuration](#configuration)
|
91
|
+
* [Se protéger des attaques](#se-protéger-des-attaques)
|
92
|
+
* [Paramètres disponibles](#paramètres-disponibles)
|
93
|
+
* [Environements](#environements)
|
94
|
+
* [Gérer les erreurs](#gérer-les-erreurs)
|
95
|
+
* [NotFound](#notfound)
|
96
|
+
* [Error](#error)
|
97
|
+
* [Les Middlewares Rack](#les-middlewares-rack)
|
98
|
+
* [Tester](#tester)
|
99
|
+
* [Sinatra::Base - Les Middlewares, Bibliothèques, et Applications Modulaires](#sinatrabase---les-middlewares-bibliothèques-et-applications-modulaires)
|
100
|
+
* [Style modulaire vs. style classique](#style-modulaire-vs-style-classique)
|
101
|
+
* [Servir une application modulaire](#servir-une-application-modulaire)
|
102
|
+
* [Utiliser une application de style classique avec un fichier config.ru](#utiliser-une-application-de-style-classique-avec-un-fichier-configru)
|
103
|
+
* [Quand utiliser un fichier config.ru ?](#quand-utiliser-un-fichier-configru-)
|
104
|
+
* [Utiliser Sinatra comme Middleware](#utiliser-sinatra-comme-middleware)
|
105
|
+
* [Création dynamique d'applications](#création-dynamique-dapplications)
|
106
|
+
* [Contextes et Binding](#contextes-et-binding)
|
107
|
+
* [Contexte de l'application/classe](#contexte-de-lapplicationclasse)
|
108
|
+
* [Contexte de la requête/instance](#contexte-de-la-requêteinstance)
|
109
|
+
* [Le contexte de délégation](#le-contexte-de-délégation)
|
110
|
+
* [Ligne de commande](#ligne-de-commande)
|
111
|
+
* [Configuration nécessaire](#configuration-nécessaire)
|
112
|
+
* [Essuyer les plâtres](#essuyer-les-plâtres)
|
113
|
+
* [Installer avec Bundler](#installer-avec-bundler)
|
114
|
+
* [Faire un clone local](#faire-un-clone-local)
|
115
|
+
* [Installer globalement](#installer-globalement)
|
116
|
+
* [Versions](#versions)
|
117
|
+
* [Mais encore](#mais-encore)
|
118
|
+
|
29
119
|
## Routes
|
30
120
|
|
31
121
|
Dans Sinatra, une route est une méthode HTTP couplée à un masque (pattern)
|
32
122
|
URL. Chaque route est associée à un bloc :
|
33
123
|
|
34
|
-
```ruby
|
124
|
+
``` ruby
|
35
125
|
get '/' do
|
36
126
|
.. montrer quelque chose ..
|
37
127
|
end
|
@@ -53,7 +143,15 @@ delete '/' do
|
|
53
143
|
end
|
54
144
|
|
55
145
|
options '/' do
|
56
|
-
..
|
146
|
+
.. paramétrer quelque chose ..
|
147
|
+
end
|
148
|
+
|
149
|
+
link '/' do
|
150
|
+
.. relier quelque chose ..
|
151
|
+
end
|
152
|
+
|
153
|
+
unlink '/' do
|
154
|
+
.. séparer quelque chose ..
|
57
155
|
end
|
58
156
|
```
|
59
157
|
|
@@ -63,7 +161,7 @@ route qui correspond à la requête est appelée.
|
|
63
161
|
Les masques peuvent inclure des paramètres nommés, accessibles par
|
64
162
|
l'intermédiaire du hash `params` :
|
65
163
|
|
66
|
-
```ruby
|
164
|
+
``` ruby
|
67
165
|
get '/bonjour/:nom' do
|
68
166
|
# répond aux requêtes "GET /bonjour/foo" et "GET /bonjour/bar"
|
69
167
|
# params[:nom] est 'foo' ou 'bar'
|
@@ -74,8 +172,11 @@ end
|
|
74
172
|
Vous pouvez aussi accéder aux paramètres nommés directement grâce aux
|
75
173
|
paramètres du bloc comme ceci :
|
76
174
|
|
77
|
-
```ruby
|
175
|
+
``` ruby
|
78
176
|
get '/bonjour/:nom' do |n|
|
177
|
+
# répond aux requêtes "GET /bonjour/foo" et "GET /bonjour/bar"
|
178
|
+
# params[:nom] est 'foo' ou 'bar'
|
179
|
+
# n contient params[:nom]
|
79
180
|
"Bonjour #{n} !"
|
80
181
|
end
|
81
182
|
```
|
@@ -83,7 +184,7 @@ end
|
|
83
184
|
Une route peut contenir un splat (caractère joker), accessible par
|
84
185
|
l'intermédiaire du tableau `params[:splat]` :
|
85
186
|
|
86
|
-
```ruby
|
187
|
+
``` ruby
|
87
188
|
get '/dire/*/a/*' do
|
88
189
|
# répond à /dire/bonjour/a/monde
|
89
190
|
params[:splat] # => ["bonjour", "monde"]
|
@@ -97,7 +198,7 @@ end
|
|
97
198
|
|
98
199
|
Ou par l'intermédiaire des paramètres du bloc :
|
99
200
|
|
100
|
-
```ruby
|
201
|
+
``` ruby
|
101
202
|
get '/telecharger/*.*' do |chemin, ext|
|
102
203
|
[chemin, ext] # => ["path/to/file", "xml"]
|
103
204
|
end
|
@@ -105,7 +206,7 @@ end
|
|
105
206
|
|
106
207
|
Une route peut aussi être définie par une expression régulière :
|
107
208
|
|
108
|
-
```ruby
|
209
|
+
``` ruby
|
109
210
|
get %r{/bonjour/([\w]+)} do
|
110
211
|
"Bonjour, #{params[:captures].first} !"
|
111
212
|
end
|
@@ -113,7 +214,7 @@ end
|
|
113
214
|
|
114
215
|
Là encore on peut utiliser les paramètres de bloc :
|
115
216
|
|
116
|
-
```ruby
|
217
|
+
``` ruby
|
117
218
|
get %r{/bonjour/([\w]+)} do |c|
|
118
219
|
"Bonjour, #{c} !"
|
119
220
|
end
|
@@ -121,7 +222,7 @@ end
|
|
121
222
|
|
122
223
|
Les routes peuvent aussi comporter des paramètres optionnels :
|
123
224
|
|
124
|
-
```ruby
|
225
|
+
``` ruby
|
125
226
|
get '/posts.?:format?' do
|
126
227
|
# répond à "GET /posts" et aussi à "GET /posts.json", "GET /posts.xml" etc...
|
127
228
|
end
|
@@ -131,12 +232,12 @@ A ce propos, à moins d'avoir désactivé la protection contre les attaques par
|
|
131
232
|
"path transversal" (voir plus loin), l'URL demandée peut avoir été modifiée
|
132
233
|
avant d'être comparée à vos routes.
|
133
234
|
|
134
|
-
|
235
|
+
## Conditions
|
135
236
|
|
136
237
|
Les routes peuvent définir toutes sortes de conditions, comme par exemple le
|
137
238
|
"user agent" :
|
138
239
|
|
139
|
-
```ruby
|
240
|
+
``` ruby
|
140
241
|
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
|
141
242
|
"Vous utilisez Songbird version #{params[:agent][0]}"
|
142
243
|
end
|
@@ -148,7 +249,7 @@ end
|
|
148
249
|
|
149
250
|
Les autres conditions disponibles sont `host_name` et `provides` :
|
150
251
|
|
151
|
-
```ruby
|
252
|
+
``` ruby
|
152
253
|
get '/', :host_name => /^admin\./ do
|
153
254
|
"Zone Administrateur, Accès refusé !"
|
154
255
|
end
|
@@ -164,7 +265,7 @@ end
|
|
164
265
|
|
165
266
|
Vous pouvez facilement définir vos propres conditions :
|
166
267
|
|
167
|
-
```ruby
|
268
|
+
``` ruby
|
168
269
|
set(:probability) { |value| condition { rand <= value } }
|
169
270
|
|
170
271
|
get '/gagner_une_voiture', :probability => 0.1 do
|
@@ -179,7 +280,7 @@ end
|
|
179
280
|
Utilisez un splat (caractère joker) dans le cas d'une condition qui prend
|
180
281
|
plusieurs valeurs :
|
181
282
|
|
182
|
-
```ruby
|
283
|
+
``` ruby
|
183
284
|
set(:auth) do |*roles| # <- ici on utilise un splat
|
184
285
|
condition do
|
185
286
|
unless logged_in? && roles.any? {|role| current_user.in_role? role }
|
@@ -197,7 +298,7 @@ get "/reserve/aux/admins/", :auth => :admin do
|
|
197
298
|
end
|
198
299
|
```
|
199
300
|
|
200
|
-
|
301
|
+
## Valeurs de retour
|
201
302
|
|
202
303
|
La valeur renvoyée par le bloc correspondant à une route constitue le corps de
|
203
304
|
la réponse qui sera transmise au client HTTP ou du moins au prochain middleware
|
@@ -218,7 +319,7 @@ valide, d'un corps de réponse Rack ou d'un code statut HTTP :
|
|
218
319
|
|
219
320
|
Avec cela, on peut facilement implémenter un streaming par exemple :
|
220
321
|
|
221
|
-
```ruby
|
322
|
+
``` ruby
|
222
323
|
class Stream
|
223
324
|
def each
|
224
325
|
100.times { |i| yield "#{i}\n" }
|
@@ -232,14 +333,14 @@ Vous pouvez aussi utiliser le helper `stream` (présenté un peu plus loin) pour
|
|
232
333
|
éviter la surcharge et intégrer le traitement relatif au streaming dans le bloc
|
233
334
|
de code de la route.
|
234
335
|
|
235
|
-
|
336
|
+
## Masques de route spécifiques
|
236
337
|
|
237
338
|
Comme cela a été vu auparavant, Sinatra offre la possibilité d'utiliser des
|
238
339
|
masques sous forme de chaines de caractères ou des expressions régulières
|
239
340
|
pour définir les routes. Mais il est possible de faire bien plus. Vous pouvez
|
240
341
|
facilement définir vos propres masques :
|
241
342
|
|
242
|
-
```ruby
|
343
|
+
``` ruby
|
243
344
|
class MasqueToutSauf
|
244
345
|
Masque = Struct.new(:captures)
|
245
346
|
|
@@ -265,7 +366,7 @@ end
|
|
265
366
|
Notez que l'exemple ci-dessus est bien trop compliqué et que le même résultat
|
266
367
|
peut être obtenu avec :
|
267
368
|
|
268
|
-
```ruby
|
369
|
+
``` ruby
|
269
370
|
get // do
|
270
371
|
pass if request.path_info == "/index"
|
271
372
|
# ...
|
@@ -274,7 +375,7 @@ end
|
|
274
375
|
|
275
376
|
Ou bien en utilisant la forme négative :
|
276
377
|
|
277
|
-
```ruby
|
378
|
+
``` ruby
|
278
379
|
get %r{^(?!/index$)} do
|
279
380
|
# ...
|
280
381
|
end
|
@@ -286,7 +387,7 @@ Les fichiers du dossier `./public` sont servis de façon statique. Vous
|
|
286
387
|
avez la possibilité d'utiliser un autre répertoire en définissant le paramètre
|
287
388
|
`:public_folder` :
|
288
389
|
|
289
|
-
```ruby
|
390
|
+
``` ruby
|
290
391
|
set :public_folder, File.dirname(__FILE__) + '/statique'
|
291
392
|
```
|
292
393
|
|
@@ -302,7 +403,7 @@ d'en-tête <tt>Cache-Control</tt> (voir plus loin).
|
|
302
403
|
Chaqie langage de template est disponible via sa propre méthode de rendu,
|
303
404
|
lesquelles renvoient tout simplement une chaîne de caractères.
|
304
405
|
|
305
|
-
```ruby
|
406
|
+
``` ruby
|
306
407
|
get '/' do
|
307
408
|
erb :index
|
308
409
|
end
|
@@ -313,7 +414,7 @@ Ceci effectue le rendu de la vue `views/index.erb`.
|
|
313
414
|
Plutôt que d'utiliser le nom d'un template, vous pouvez directement passer
|
314
415
|
le contenu du template :
|
315
416
|
|
316
|
-
```ruby
|
417
|
+
``` ruby
|
317
418
|
get '/' do
|
318
419
|
code = "<%= Time.now %>"
|
319
420
|
erb code
|
@@ -322,7 +423,7 @@ end
|
|
322
423
|
|
323
424
|
Les méthodes de templates acceptent un second paramètre, un hash d'options :
|
324
425
|
|
325
|
-
```ruby
|
426
|
+
``` ruby
|
326
427
|
get '/' do
|
327
428
|
erb :index, :layout => :post
|
328
429
|
end
|
@@ -334,7 +435,7 @@ au *layout* `views/layout.erb` quand ce fichier existe).
|
|
334
435
|
|
335
436
|
Toute option que Sinatra ne comprend pas sera passée au moteur de rendu :
|
336
437
|
|
337
|
-
```ruby
|
438
|
+
``` ruby
|
338
439
|
get '/' do
|
339
440
|
haml :index, :format => :html5
|
340
441
|
end
|
@@ -343,7 +444,7 @@ end
|
|
343
444
|
Vous pouvez également définir des options par langage de template de façon
|
344
445
|
générale :
|
345
446
|
|
346
|
-
```ruby
|
447
|
+
``` ruby
|
347
448
|
set :haml, :format => html5
|
348
449
|
|
349
450
|
get '/' do
|
@@ -356,42 +457,64 @@ définies au moyen de `set`.
|
|
356
457
|
|
357
458
|
Options disponibles :
|
358
459
|
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
460
|
+
<dl>
|
461
|
+
<dt>locals</dt>
|
462
|
+
<dd>
|
463
|
+
Liste de variables locales passées au document. Pratique pour les vues
|
464
|
+
partielles.
|
465
|
+
Exemple : <tt>erb "<%= foo %>", :locals => {:foo => "bar"}</tt>.
|
466
|
+
</dd>
|
363
467
|
|
364
|
-
|
365
|
-
|
366
|
-
|
468
|
+
<dt>default_encoding</dt>
|
469
|
+
<dd>
|
470
|
+
Encodage de caractères à utiliser en cas d'incertitude. Par défaut, c'est
|
471
|
+
<tt>settings.default_encoding</tt>.
|
472
|
+
</dd>
|
473
|
+
|
474
|
+
<dt>views</dt>
|
475
|
+
<dd>
|
476
|
+
Dossier de vues dans lequel chercher les templates. Par défaut
|
477
|
+
<tt>settings.views</tt>.
|
478
|
+
</dd>
|
367
479
|
|
368
|
-
|
369
|
-
|
370
|
-
|
480
|
+
<dt>layout</dt>
|
481
|
+
<dd>
|
482
|
+
S'il faut ou non utiliser un layout (<tt>true</tt> ou <tt>false</tt>).
|
483
|
+
Indique le template à utiliser lorsque c'est un symbole. Exemple :
|
484
|
+
<tt>erb :index, :layout => !request.xhr?</tt>.
|
485
|
+
</dd>
|
371
486
|
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
487
|
+
<dt>content_type</dt>
|
488
|
+
<dd>
|
489
|
+
Content-Type que le template produit, dépend par défaut du langage de
|
490
|
+
template.
|
491
|
+
</dd>
|
376
492
|
|
377
|
-
|
378
|
-
|
379
|
-
|
493
|
+
<dt>scope</dt>
|
494
|
+
<dd>
|
495
|
+
Contexte sous lequel effectuer le rendu du template. Par défaut il s'agit
|
496
|
+
de l'instance de l'application. Si vous changez cela, les variables
|
497
|
+
d'instance et les méthodes utilitaires ne seront pas disponibles.
|
498
|
+
</dd>
|
380
499
|
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
500
|
+
<dt>layout_engine</dt>
|
501
|
+
<dd>
|
502
|
+
Moteur de rendu à utiliser pour le layout. Utile pour les langages ne
|
503
|
+
supportant pas les layouts. Il s'agit par défaut du moteur utilisé pour
|
504
|
+
le rendu du template. Exemple : <tt>set :rdoc, :layout_engine => :erb</tt>
|
505
|
+
</dd>
|
385
506
|
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
507
|
+
<dt>layout_options</dt>
|
508
|
+
<dd>
|
509
|
+
Options spécifiques destinées au moteur de rendu. Exemple : <tt>set :rdoc,
|
510
|
+
:layout_options => { :views => 'views/layouts' }</tt>
|
511
|
+
</dd>
|
512
|
+
</dl>
|
390
513
|
|
391
514
|
Les templates sont supposés se trouver directement dans le dossier
|
392
515
|
`./views`. Pour utiliser un dossier de vues différent :
|
393
516
|
|
394
|
-
```ruby
|
517
|
+
``` ruby
|
395
518
|
set :views, settings.root + '/templates'
|
396
519
|
```
|
397
520
|
|
@@ -401,23 +524,33 @@ ce cas, utilisez `:'sous_repertoire/template'`). Il faut utiliser
|
|
401
524
|
un symbole car les méthodes de rendu évaluent le contenu des chaînes de
|
402
525
|
caractères au lieu de les considérer comme un chemin vers un fichier.
|
403
526
|
|
527
|
+
### Templates littéraux
|
528
|
+
|
529
|
+
``` ruby
|
530
|
+
get '/' do
|
531
|
+
haml '%div.title Bonjour le monde'
|
532
|
+
end
|
533
|
+
```
|
534
|
+
|
535
|
+
Générera le code du template spécifié dans la chaîne de caractères.
|
536
|
+
|
404
537
|
### Langages de template disponibles
|
405
538
|
|
406
539
|
Certains langages ont plusieurs implémentations. Pour préciser l'implémentation
|
407
540
|
à utiliser (et garantir l'aspect thread-safe), vous devez simplement l'avoir
|
408
541
|
chargée au préalable :
|
409
542
|
|
410
|
-
```ruby
|
543
|
+
``` ruby
|
411
544
|
require 'rdiscount' # ou require 'bluecloth'
|
412
545
|
get('/') { markdown :index }
|
413
546
|
```
|
414
547
|
|
415
|
-
|
548
|
+
#### Templates Haml
|
416
549
|
|
417
550
|
<table>
|
418
551
|
<tr>
|
419
552
|
<td>Dépendances</td>
|
420
|
-
<td><a href="http://haml.info/">haml</a></td>
|
553
|
+
<td><a href="http://haml.info/" title="haml">haml</a></td>
|
421
554
|
</tr>
|
422
555
|
<tr>
|
423
556
|
<td>Extensions de fichier</td>
|
@@ -429,12 +562,15 @@ get('/') { markdown :index }
|
|
429
562
|
</tr>
|
430
563
|
</table>
|
431
564
|
|
432
|
-
|
565
|
+
#### Templates Erb
|
433
566
|
|
434
567
|
<table>
|
435
568
|
<tr>
|
436
569
|
<td>Dépendances</td>
|
437
|
-
<td
|
570
|
+
<td>
|
571
|
+
<a href="http://www.kuwata-lab.com/erubis/" title="erubis">erubis</a>
|
572
|
+
ou erb (inclus avec Ruby)
|
573
|
+
</td>
|
438
574
|
</tr>
|
439
575
|
<tr>
|
440
576
|
<td>Extensions de fichier</td>
|
@@ -446,12 +582,14 @@ get('/') { markdown :index }
|
|
446
582
|
</tr>
|
447
583
|
</table>
|
448
584
|
|
449
|
-
|
585
|
+
#### Templates Builder
|
450
586
|
|
451
587
|
<table>
|
452
588
|
<tr>
|
453
589
|
<td>Dépendances</td>
|
454
|
-
<td
|
590
|
+
<td>
|
591
|
+
<a href="http://builder.rubyforge.org/" title="builder">builder</a>
|
592
|
+
</td>
|
455
593
|
</tr>
|
456
594
|
<tr>
|
457
595
|
<td>Extensions de fichier</td>
|
@@ -466,12 +604,12 @@ get('/') { markdown :index }
|
|
466
604
|
Ce moteur accepte également un bloc pour des templates en ligne (voir
|
467
605
|
exemple).
|
468
606
|
|
469
|
-
|
607
|
+
#### Templates Nokogiri
|
470
608
|
|
471
609
|
<table>
|
472
610
|
<tr>
|
473
611
|
<td>Dépendances</td>
|
474
|
-
<td><a href="http://nokogiri.org/">nokogiri</a></td>
|
612
|
+
<td><a href="http://nokogiri.org/" title="nokogiri">nokogiri</a></td>
|
475
613
|
</tr>
|
476
614
|
<tr>
|
477
615
|
<td>Extensions de fichier</td>
|
@@ -487,12 +625,12 @@ exemple).
|
|
487
625
|
Ce moteur accepte également un bloc pour des templates en ligne (voir
|
488
626
|
exemple).
|
489
627
|
|
490
|
-
|
628
|
+
#### Templates Sass
|
491
629
|
|
492
630
|
<table>
|
493
631
|
<tr>
|
494
632
|
<td>Dépendances</td>
|
495
|
-
<td><a href="http://sass-lang.com/">sass</a></td>
|
633
|
+
<td><a href="http://sass-lang.com/" title="sass">sass</a></td>
|
496
634
|
</tr>
|
497
635
|
<tr>
|
498
636
|
<td>Extensions de fichier</td>
|
@@ -504,12 +642,12 @@ exemple).
|
|
504
642
|
</tr>
|
505
643
|
</table>
|
506
644
|
|
507
|
-
|
645
|
+
#### Templates SCSS
|
508
646
|
|
509
647
|
<table>
|
510
648
|
<tr>
|
511
649
|
<td>Dépendances</td>
|
512
|
-
<td><a href="http://sass-lang.com/">sass</a></td>
|
650
|
+
<td><a href="http://sass-lang.com/" title="sass">sass</a></td>
|
513
651
|
</tr>
|
514
652
|
<tr>
|
515
653
|
<td>Extensions de fichier</td>
|
@@ -522,12 +660,12 @@ exemple).
|
|
522
660
|
</tr>
|
523
661
|
</table>
|
524
662
|
|
525
|
-
|
663
|
+
#### Templates Less
|
526
664
|
|
527
665
|
<table>
|
528
666
|
<tr>
|
529
667
|
<td>Dépendances</td>
|
530
|
-
<td><a href="http://www.lesscss.org/">less</a></td>
|
668
|
+
<td><a href="http://www.lesscss.org/" title="less">less</a></td>
|
531
669
|
</tr>
|
532
670
|
<tr>
|
533
671
|
<td>Extensions de fichier</td>
|
@@ -540,12 +678,12 @@ exemple).
|
|
540
678
|
</tr>
|
541
679
|
</table>
|
542
680
|
|
543
|
-
|
681
|
+
#### Templates Liquid
|
544
682
|
|
545
683
|
<table>
|
546
684
|
<tr>
|
547
685
|
<td>Dépendances</td>
|
548
|
-
<td><a href="http://www.liquidmarkup.org/">liquid</a></td>
|
686
|
+
<td><a href="http://www.liquidmarkup.org/" title="liquid">liquid</a></td>
|
549
687
|
</tr>
|
550
688
|
<tr>
|
551
689
|
<td>Extensions de fichier</td>
|
@@ -561,12 +699,19 @@ Comme vous ne pouvez appeler de méthodes Ruby (autres que `yield`)
|
|
561
699
|
dans un template Liquid, vous aurez sûrement à lui passer des variables
|
562
700
|
locales.
|
563
701
|
|
564
|
-
|
702
|
+
#### Templates Markdown
|
565
703
|
|
566
704
|
<table>
|
567
705
|
<tr>
|
568
706
|
<td><p>Dépendances</p></td>
|
569
|
-
<td
|
707
|
+
<td>
|
708
|
+
Au choix :
|
709
|
+
<a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
|
710
|
+
<a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
|
711
|
+
<a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
|
712
|
+
<a href="http://kramdown.rubyforge.org/" title="kramdown">kramdown</a>,
|
713
|
+
<a href="http://maruku.rubyforge.org/" title="maruku">maruku</a>
|
714
|
+
</td>
|
570
715
|
</tr>
|
571
716
|
|
572
717
|
<tr>
|
@@ -583,14 +728,14 @@ Il n’est pas possible d’appeler des méthodes depuis markdown, ni de
|
|
583
728
|
lui passer des variables locales. Par conséquent, il sera souvent utilisé
|
584
729
|
en combinaison avec un autre moteur de rendu :
|
585
730
|
|
586
|
-
```ruby
|
731
|
+
``` ruby
|
587
732
|
erb :overview, :locals => { :text => markdown(:introduction) }
|
588
733
|
```
|
589
734
|
|
590
735
|
Notez que vous pouvez également appeler la méthode `markdown` au
|
591
736
|
sein d’autres templates :
|
592
737
|
|
593
|
-
```ruby
|
738
|
+
``` ruby
|
594
739
|
%h1 Hello From Haml !
|
595
740
|
%p= markdown(:greetings)
|
596
741
|
```
|
@@ -600,12 +745,12 @@ pouvez pas utiliser de layouts écrits en Markdown. Toutefois, il
|
|
600
745
|
est possible d’utiliser un moteur de rendu différent pour le template et
|
601
746
|
pour le layout en utilisant l’option `:layout_engine`.
|
602
747
|
|
603
|
-
|
748
|
+
#### Templates Textile
|
604
749
|
|
605
750
|
<table>
|
606
751
|
<tr>
|
607
752
|
<td>Dépendances</td>
|
608
|
-
<td><a href="http://redcloth.org/">RedCloth</a></td>
|
753
|
+
<td><a href="http://redcloth.org/" title="RedCloth">RedCloth</a></td>
|
609
754
|
</tr>
|
610
755
|
<tr>
|
611
756
|
<td>Extensions de fichier</td>
|
@@ -621,14 +766,14 @@ Il n’est pas possible d’appeler des méthodes depuis textile, ni de lui
|
|
621
766
|
passer des variables locales. Par conséquent, il sera souvent utilisé en
|
622
767
|
combinaison avec un autre moteur de rendu :
|
623
768
|
|
624
|
-
```ruby
|
769
|
+
``` ruby
|
625
770
|
erb :overview, :locals => { :text => textile(:introduction) }
|
626
771
|
```
|
627
772
|
|
628
773
|
Notez que vous pouvez également appeler la méthode `textile` au
|
629
774
|
sein d’autres templates :
|
630
775
|
|
631
|
-
```ruby
|
776
|
+
``` ruby
|
632
777
|
%h1 Hello From Haml !
|
633
778
|
%p= textile(:greetings)
|
634
779
|
```
|
@@ -638,12 +783,12 @@ pas utiliser de layouts écrits en Textile. Toutefois, il est
|
|
638
783
|
possible d’utiliser un moteur de rendu différent pour le template et
|
639
784
|
pour le layout en utilisant l’option `:layout_engine`.
|
640
785
|
|
641
|
-
|
786
|
+
#### Templates RDoc
|
642
787
|
|
643
788
|
<table>
|
644
789
|
<tr>
|
645
790
|
<td>Dépendances</td>
|
646
|
-
<td><a href="http://rdoc.rubyforge.org/">
|
791
|
+
<td><a href="http://rdoc.rubyforge.org/" title="RDoc">RDoc</a></td>
|
647
792
|
</tr>
|
648
793
|
<tr>
|
649
794
|
<td>Extensions de fichier</td>
|
@@ -659,14 +804,14 @@ Il n’est pas possible d’appeler des méthodes depuis rdoc, ni de lui
|
|
659
804
|
passer des variables locales. Par conséquent, il sera souvent utilisé en
|
660
805
|
combinaison avec un autre moteur de rendu :
|
661
806
|
|
662
|
-
```ruby
|
807
|
+
``` ruby
|
663
808
|
erb :overview, :locals => { :text => rdoc(:introduction) }
|
664
809
|
```
|
665
810
|
|
666
811
|
Notez que vous pouvez également appeler la méthode `rdoc` au sein
|
667
812
|
d’autres templates :
|
668
813
|
|
669
|
-
```ruby
|
814
|
+
``` ruby
|
670
815
|
%h1 Hello From Haml !
|
671
816
|
%p= rdoc(:greetings)
|
672
817
|
```
|
@@ -676,11 +821,11 @@ pas utiliser de layouts écrits en RDoc. Toutefois, il est
|
|
676
821
|
possible d’utiliser un moteur de rendu différent pour le template et
|
677
822
|
pour le layout en utilisant l’option `:layout_engine`.
|
678
823
|
|
679
|
-
|
824
|
+
#### Templates Radius
|
680
825
|
<table>
|
681
826
|
<tr>
|
682
827
|
<td>Dépendances</td>
|
683
|
-
<td><a href="http://radius.rubyforge.org/">
|
828
|
+
<td><a href="http://radius.rubyforge.org/" title="Radius">Radius</a></td>
|
684
829
|
</tr>
|
685
830
|
<tr>
|
686
831
|
<td>Extensions de fichier</td>
|
@@ -695,12 +840,12 @@ pour le layout en utilisant l’option `:layout_engine`.
|
|
695
840
|
Comme vous ne pouvez pas appeler de méthodes Ruby depuis un template
|
696
841
|
Radius, vous aurez sûrement à lui passer des variables locales.
|
697
842
|
|
698
|
-
|
843
|
+
#### Templates Markaby
|
699
844
|
|
700
845
|
<table>
|
701
846
|
<tr>
|
702
847
|
<td>Dépendances</td>
|
703
|
-
<td><a href="http://markaby.github.com/">
|
848
|
+
<td><a href="http://markaby.github.com/" title="Markaby">Markaby</a></td>
|
704
849
|
</tr>
|
705
850
|
<tr>
|
706
851
|
<td>Extensions de fichier</td>
|
@@ -715,12 +860,12 @@ Radius, vous aurez sûrement à lui passer des variables locales.
|
|
715
860
|
Ce moteur accepte également un bloc pour des templates en ligne (voir
|
716
861
|
exemple).
|
717
862
|
|
718
|
-
|
863
|
+
#### Templates RABL
|
719
864
|
|
720
865
|
<table>
|
721
866
|
<tr>
|
722
867
|
<td>Dépendances</td>
|
723
|
-
<td><a href="https://github.com/nesquena/rabl">
|
868
|
+
<td><a href="https://github.com/nesquena/rabl" title="Rabl">Rabl</a></td>
|
724
869
|
</tr>
|
725
870
|
<tr>
|
726
871
|
<td>Extensions de fichier</td>
|
@@ -732,12 +877,12 @@ exemple).
|
|
732
877
|
</tr>
|
733
878
|
</table>
|
734
879
|
|
735
|
-
|
880
|
+
#### Templates Slim
|
736
881
|
|
737
882
|
<table>
|
738
883
|
<tr>
|
739
884
|
<td>Dépendances</td>
|
740
|
-
<td><a href="http://slim-lang.com/">
|
885
|
+
<td><a href="http://slim-lang.com/" title="Slim Lang">Slim Lang</a></td>
|
741
886
|
</tr>
|
742
887
|
<tr>
|
743
888
|
<td>Extensions de fichier</td>
|
@@ -749,12 +894,12 @@ exemple).
|
|
749
894
|
</tr>
|
750
895
|
</table>
|
751
896
|
|
752
|
-
|
897
|
+
#### Templates Creole
|
753
898
|
|
754
899
|
<table>
|
755
900
|
<tr>
|
756
901
|
<td>Dépendances</td>
|
757
|
-
<td><a href="https://github.com/minad/creole">
|
902
|
+
<td><a href="https://github.com/minad/creole" title="Creole">Creole</a></td>
|
758
903
|
</tr>
|
759
904
|
<tr>
|
760
905
|
<td>Extensions de fichier</td>
|
@@ -766,33 +911,41 @@ exemple).
|
|
766
911
|
</tr>
|
767
912
|
</table>
|
768
913
|
|
769
|
-
Il n'est pas possible d'appeler des méthodes depuis
|
914
|
+
Il n'est pas possible d'appeler des méthodes depuis creole, ni de lui
|
770
915
|
passer des variables locales. Par conséquent, il sera souvent utilisé en
|
771
916
|
combinaison avec un autre moteur de rendu :
|
772
917
|
|
773
|
-
```ruby
|
918
|
+
``` ruby
|
774
919
|
erb :overview, :locals => { :text => markdown(:introduction) }
|
775
920
|
```
|
776
921
|
|
777
|
-
Notez que vous pouvez également appeler la méthode
|
922
|
+
Notez que vous pouvez également appeler la méthode `creole` au sein d'autres
|
778
923
|
templates :
|
779
924
|
|
780
|
-
```ruby
|
925
|
+
``` ruby
|
781
926
|
%h1 Hello From Haml !
|
782
|
-
%p=
|
927
|
+
%p= creole(:greetings)
|
783
928
|
```
|
784
929
|
|
785
|
-
Comme vous ne pouvez pas appeler de Ruby au sein de
|
786
|
-
pas utiliser de
|
787
|
-
d'utiliser un moteur de rendu différent pour le template et pour le
|
930
|
+
Comme vous ne pouvez pas appeler de Ruby au sein de Creole, vous ne pouvez
|
931
|
+
pas utiliser de layouts écrits en Creole. Toutefois, il est possible
|
932
|
+
d'utiliser un moteur de rendu différent pour le template et pour le layout
|
788
933
|
en utilisant l'option `:layout_engine`.
|
789
934
|
|
790
|
-
|
935
|
+
#### Templates CoffeeScript
|
791
936
|
|
792
937
|
<table>
|
793
938
|
<tr>
|
794
939
|
<td>Dépendances</td>
|
795
|
-
<td
|
940
|
+
<td>
|
941
|
+
<a href="https://github.com/josh/ruby-coffee-script" title="Ruby CoffeeScript">
|
942
|
+
CoffeeScript
|
943
|
+
</a>
|
944
|
+
et un
|
945
|
+
<a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
|
946
|
+
moyen d'exécuter javascript
|
947
|
+
</a>
|
948
|
+
</td>
|
796
949
|
</tr>
|
797
950
|
<tr>
|
798
951
|
<td>Extensions de fichier</td>
|
@@ -804,12 +957,52 @@ en utilisant l'option `:layout_engine`.
|
|
804
957
|
</tr>
|
805
958
|
</table>
|
806
959
|
|
807
|
-
|
960
|
+
#### Templates Stylus
|
961
|
+
|
962
|
+
<table>
|
963
|
+
<tr>
|
964
|
+
<td>Dépendances</td>
|
965
|
+
<td>
|
966
|
+
<a href="https://github.com/lucasmazza/ruby-stylus" title="Ruby Stylus">
|
967
|
+
Stylus
|
968
|
+
</a>
|
969
|
+
et un
|
970
|
+
<a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
|
971
|
+
moyen d'exécuter javascript
|
972
|
+
</a>
|
973
|
+
</td>
|
974
|
+
</tr>
|
975
|
+
<tr>
|
976
|
+
<td>Extensions de fichier</td>
|
977
|
+
<td><tt>.styl</tt></td>
|
978
|
+
</tr>
|
979
|
+
<tr>
|
980
|
+
<td>Exemple</td>
|
981
|
+
<td><tt>stylus :index</tt></td>
|
982
|
+
</tr>
|
983
|
+
</table>
|
984
|
+
|
985
|
+
Avant de pouvoir utiliser des templates Stylus, vous devez auparavant charger
|
986
|
+
`stylus` et `stylus/tilt` :
|
987
|
+
|
988
|
+
``` ruby
|
989
|
+
require 'sinatra'
|
990
|
+
require 'stylus'
|
991
|
+
require 'stylus/tilt'
|
992
|
+
|
993
|
+
get '/' do
|
994
|
+
stylus :exemple
|
995
|
+
end
|
996
|
+
```
|
997
|
+
|
998
|
+
#### Templates Yajl
|
808
999
|
|
809
1000
|
<table>
|
810
1001
|
<tr>
|
811
1002
|
<td>Dépendances</td>
|
812
|
-
<td
|
1003
|
+
<td>
|
1004
|
+
<a href="https://github.com/brianmario/yajl-ruby" title="yajl-ruby">yajl-ruby</a>
|
1005
|
+
</td>
|
813
1006
|
</tr>
|
814
1007
|
<tr>
|
815
1008
|
<td>Extensions de fichier</td>
|
@@ -825,45 +1018,39 @@ en utilisant l'option `:layout_engine`.
|
|
825
1018
|
Le source du template est évalué en tant que chaine Ruby, puis la
|
826
1019
|
variable json obtenue est convertie avec #to_json.
|
827
1020
|
|
828
|
-
```ruby
|
1021
|
+
``` ruby
|
829
1022
|
json = { :foo => 'bar' }
|
830
1023
|
json[:baz] = key
|
831
1024
|
```
|
832
1025
|
|
833
|
-
Les options `:callback` et `:variable` peuvent être utilisées pour décorer
|
1026
|
+
Les options `:callback` et `:variable` peuvent être utilisées pour décorer
|
1027
|
+
l’objet retourné.
|
834
1028
|
|
835
|
-
```
|
1029
|
+
``` ruby
|
836
1030
|
var resource = {"foo":"bar","baz":"qux"}; present(resource);</pre>
|
837
1031
|
```
|
838
1032
|
|
839
|
-
|
1033
|
+
#### Templates WLang
|
840
1034
|
|
841
1035
|
<table>
|
842
1036
|
<tr>
|
843
|
-
<td>
|
844
|
-
<td><a href="https://github.com/blambeau/wlang/">wlang</a></td>
|
1037
|
+
<td>Dépendances</td>
|
1038
|
+
<td><a href="https://github.com/blambeau/wlang/" title="wlang">wlang</a></td>
|
845
1039
|
</tr>
|
846
1040
|
<tr>
|
847
|
-
<td>
|
1041
|
+
<td>Extensions de fichier</td>
|
848
1042
|
<td><tt>.wlang</tt></td>
|
849
1043
|
</tr>
|
850
1044
|
<tr>
|
851
|
-
<td>
|
1045
|
+
<td>Exemple</td>
|
852
1046
|
<td><tt>wlang :index, :locals => { :key => 'value' }</tt></td>
|
853
1047
|
</tr>
|
854
1048
|
</table>
|
855
1049
|
|
856
|
-
L’appel de code ruby au sein des templates n’est pas idiomatique en wlang.
|
857
|
-
|
858
|
-
|
859
|
-
|
860
|
-
```ruby
|
861
|
-
get '/' do
|
862
|
-
haml '%div.title Bonjour le monde'
|
863
|
-
end
|
864
|
-
```
|
865
|
-
|
866
|
-
Générera le code du template spécifié dans la chaîne de caractères.
|
1050
|
+
L’appel de code ruby au sein des templates n’est pas idiomatique en wlang.
|
1051
|
+
L’écriture de templates sans logique est encouragé, via le passage de variables
|
1052
|
+
locales. Il est néanmoins possible d’écrire un layout en wlang et d’y utiliser
|
1053
|
+
`yield`.
|
867
1054
|
|
868
1055
|
### Accéder aux variables dans un Template
|
869
1056
|
|
@@ -871,7 +1058,7 @@ Un template est évalué dans le même contexte que l'endroit d'où il a été
|
|
871
1058
|
appelé (gestionnaire de route). Les variables d'instance déclarées dans le
|
872
1059
|
gestionnaire de route sont directement accessibles dans le template :
|
873
1060
|
|
874
|
-
```ruby
|
1061
|
+
``` ruby
|
875
1062
|
get '/:id' do
|
876
1063
|
@foo = Foo.find(params[:id])
|
877
1064
|
haml '%h1= @foo.nom'
|
@@ -880,7 +1067,7 @@ end
|
|
880
1067
|
|
881
1068
|
Alternativement, on peut passer un hash contenant des variables locales :
|
882
1069
|
|
883
|
-
```ruby
|
1070
|
+
``` ruby
|
884
1071
|
get '/:id' do
|
885
1072
|
foo = Foo.find(params[:id])
|
886
1073
|
haml '%h1= foo.nom', :locals => { :foo => foo }
|
@@ -891,11 +1078,50 @@ Ceci est généralement utilisé lorsque l'on veut utiliser un template comme
|
|
891
1078
|
partiel (depuis un autre template) et qu'il est donc nécessaire d'adapter les
|
892
1079
|
noms de variables.
|
893
1080
|
|
1081
|
+
|
1082
|
+
### Templates avec `yield` et layouts imbriqués
|
1083
|
+
|
1084
|
+
En général, un layout est un simple template qui appelle `yield`. Ce genre de
|
1085
|
+
template peut s'utiliser via l'option `:template` comme décrit précédemment ou
|
1086
|
+
peut être rendu depuis un bloc :
|
1087
|
+
|
1088
|
+
``` ruby
|
1089
|
+
erb :post, :layout => false do
|
1090
|
+
erb :index
|
1091
|
+
end
|
1092
|
+
```
|
1093
|
+
|
1094
|
+
Ce code est à globalement équivalent à `erb :index, :layout => :post`.
|
1095
|
+
|
1096
|
+
Le fait de passer des blocs aux méthodes de rendu est particulièrement utile
|
1097
|
+
pour gérer des templates imbriqués :
|
1098
|
+
|
1099
|
+
``` ruby
|
1100
|
+
erb :main_layout, :layout => false do
|
1101
|
+
erb :admin_layout do
|
1102
|
+
erb :user
|
1103
|
+
end
|
1104
|
+
end
|
1105
|
+
```
|
1106
|
+
|
1107
|
+
Ce qui peut aussi être fait avec un peu moins de code :
|
1108
|
+
|
1109
|
+
``` ruby
|
1110
|
+
erb :admin_layout, :layout => :main_layout do
|
1111
|
+
erb :user
|
1112
|
+
end
|
1113
|
+
```
|
1114
|
+
|
1115
|
+
Actuellement, les méthodes de rendu qui acceptent un bloc sont : `erb`, `haml`,
|
1116
|
+
`liquid`, `slim ` et `wlang`. La méthode générale `render` accepte elle aussi
|
1117
|
+
un bloc.
|
1118
|
+
|
1119
|
+
|
894
1120
|
### Templates dans le fichier source
|
895
1121
|
|
896
1122
|
Des templates peuvent être définis dans le fichier source comme ceci :
|
897
1123
|
|
898
|
-
```ruby
|
1124
|
+
``` ruby
|
899
1125
|
require 'sinatra'
|
900
1126
|
|
901
1127
|
get '/' do
|
@@ -917,11 +1143,12 @@ sont automatiquement chargés. Si vous avez des templates dans d'autres
|
|
917
1143
|
fichiers source, il faut explicitement les déclarer avec
|
918
1144
|
`enable :inline_templates`.
|
919
1145
|
|
1146
|
+
|
920
1147
|
### Templates nommés
|
921
1148
|
|
922
1149
|
Les templates peuvent aussi être définis grâce à la méthode de haut niveau `template` :
|
923
1150
|
|
924
|
-
```ruby
|
1151
|
+
``` ruby
|
925
1152
|
template :layout do
|
926
1153
|
"%html\n =yield\n"
|
927
1154
|
end
|
@@ -940,7 +1167,7 @@ template sera affiché. Vous pouvez désactivez les layouts au cas par cas en
|
|
940
1167
|
passant `:layout => false` ou bien les désactiver par défaut au moyen
|
941
1168
|
de `set :haml, :layout => false` :
|
942
1169
|
|
943
|
-
```ruby
|
1170
|
+
``` ruby
|
944
1171
|
get '/' do
|
945
1172
|
haml :index, :layout => !request.xhr?
|
946
1173
|
end
|
@@ -952,7 +1179,7 @@ Pour associer une extension de fichier avec un moteur de rendu, utilisez
|
|
952
1179
|
`Tilt.register`. Par exemple, si vous désirez utiliser l'extension
|
953
1180
|
de fichier `tt` pour les templates Textile, vous pouvez faire comme suit :
|
954
1181
|
|
955
|
-
```ruby
|
1182
|
+
``` ruby
|
956
1183
|
Tilt.register :tt, Tilt[:textile]
|
957
1184
|
```
|
958
1185
|
|
@@ -961,7 +1188,7 @@ Tilt.register :tt, Tilt[:textile]
|
|
961
1188
|
En premier lieu, déclarez votre moteur de rendu avec Tilt, ensuite créez
|
962
1189
|
votre méthode de rendu :
|
963
1190
|
|
964
|
-
```ruby
|
1191
|
+
``` ruby
|
965
1192
|
Tilt.register :monmoteur, MonMerveilleurMoteurDeRendu
|
966
1193
|
|
967
1194
|
helpers do
|
@@ -982,7 +1209,7 @@ que les routes, et permettent de modifier la requête et sa réponse. Les
|
|
982
1209
|
variables d'instance déclarées dans les filtres sont accessibles au niveau
|
983
1210
|
des routes et des templates :
|
984
1211
|
|
985
|
-
```ruby
|
1212
|
+
``` ruby
|
986
1213
|
before do
|
987
1214
|
@note = 'Coucou !'
|
988
1215
|
request.path_info = '/foo/bar/baz'
|
@@ -999,7 +1226,7 @@ contexte et permettent de modifier la requête et sa réponse. Les variables
|
|
999
1226
|
d'instance déclarées dans les filtres before ou les routes sont accessibles
|
1000
1227
|
au niveau des filtres after :
|
1001
1228
|
|
1002
|
-
```ruby
|
1229
|
+
``` ruby
|
1003
1230
|
after do
|
1004
1231
|
puts response.status
|
1005
1232
|
end
|
@@ -1007,12 +1234,12 @@ end
|
|
1007
1234
|
|
1008
1235
|
Note : Le corps de la réponse n'est pas disponible au niveau du filtre after
|
1009
1236
|
car il ne sera généré que plus tard (sauf dans le cas où vous utilisez la
|
1010
|
-
méthode
|
1237
|
+
méthode `body` au lieu de simplement renvoyer une chaine depuis vos routes).
|
1011
1238
|
|
1012
1239
|
Les filtres peuvent être associés à un masque, ce qui permet de limiter leur
|
1013
1240
|
exécution aux cas où la requête correspond à ce masque :
|
1014
1241
|
|
1015
|
-
```ruby
|
1242
|
+
``` ruby
|
1016
1243
|
before '/secret/*' do
|
1017
1244
|
authentification!
|
1018
1245
|
end
|
@@ -1024,7 +1251,7 @@ end
|
|
1024
1251
|
|
1025
1252
|
Tout comme les routes, les filtres acceptent également des conditions :
|
1026
1253
|
|
1027
|
-
```ruby
|
1254
|
+
``` ruby
|
1028
1255
|
before :agent => /Songbird/ do
|
1029
1256
|
# ...
|
1030
1257
|
end
|
@@ -1039,7 +1266,7 @@ end
|
|
1039
1266
|
Utilisez la méthode de haut niveau `helpers` pour définir des routines
|
1040
1267
|
qui seront accessibles dans vos gestionnaires de route et dans vos templates :
|
1041
1268
|
|
1042
|
-
```ruby
|
1269
|
+
``` ruby
|
1043
1270
|
helpers do
|
1044
1271
|
def bar(nom)
|
1045
1272
|
"#{nom}bar"
|
@@ -1053,7 +1280,7 @@ end
|
|
1053
1280
|
|
1054
1281
|
Vous pouvez aussi définir les méthodes helper dans un module séparé :
|
1055
1282
|
|
1056
|
-
```ruby
|
1283
|
+
``` ruby
|
1057
1284
|
module FooUtils
|
1058
1285
|
def foo(nom) "#{nom}foo" end
|
1059
1286
|
end
|
@@ -1071,9 +1298,9 @@ l'application.
|
|
1071
1298
|
### Utiliser les sessions
|
1072
1299
|
|
1073
1300
|
Une session est utilisée pour conserver un état entre les requêtes. Une fois
|
1074
|
-
activées, vous avez un
|
1301
|
+
activées, vous avez un hash de session par session utilisateur :
|
1075
1302
|
|
1076
|
-
```ruby
|
1303
|
+
``` ruby
|
1077
1304
|
enable :sessions
|
1078
1305
|
|
1079
1306
|
get '/' do
|
@@ -1085,14 +1312,14 @@ get '/:value' do
|
|
1085
1312
|
end
|
1086
1313
|
```
|
1087
1314
|
|
1088
|
-
Notez que
|
1089
|
-
un
|
1315
|
+
Notez que `enable :sessions` enregistre en fait toutes les données dans
|
1316
|
+
un cookie. Ce n'est pas toujours ce que vous voulez (enregistrer beaucoup de
|
1090
1317
|
données va augmenter le traffic par exemple). Vous pouvez utiliser n'importe
|
1091
|
-
quel
|
1092
|
-
|
1093
|
-
choix comme vous le feriez pour n'importe quel autre
|
1318
|
+
quel middleware Rack de session afin d'éviter cela. N'utilisez **pas**
|
1319
|
+
`enable :sessions` dans ce cas mais chargez le middleware de votre
|
1320
|
+
choix comme vous le feriez pour n'importe quel autre middleware :
|
1094
1321
|
|
1095
|
-
```ruby
|
1322
|
+
``` ruby
|
1096
1323
|
use Rack::Session::Pool, :expire_after => 2592000
|
1097
1324
|
|
1098
1325
|
get '/' do
|
@@ -1110,53 +1337,61 @@ hasard par Sinatra. Toutefois, comme cette clé change à chaque démarrage de
|
|
1110
1337
|
votre application, vous pouvez définir cette clé vous-même afin que toutes
|
1111
1338
|
les instances de votre application la partage :
|
1112
1339
|
|
1113
|
-
```ruby
|
1340
|
+
``` ruby
|
1114
1341
|
set :session_secret, 'super secret'
|
1115
1342
|
```
|
1116
1343
|
|
1117
1344
|
Si vous souhaitez avoir plus de contrôle, vous pouvez également enregistrer un
|
1118
|
-
|
1345
|
+
hash avec des options lors de la configuration de `sessions` :
|
1119
1346
|
|
1120
|
-
```ruby
|
1347
|
+
``` ruby
|
1121
1348
|
set :sessions, :domain => 'foo.com'
|
1122
1349
|
```
|
1123
1350
|
|
1351
|
+
Pour que les différents sous-domaines de foo.com puisse partager une session,
|
1352
|
+
vous devez préfixer le domaine par *.* :
|
1353
|
+
|
1354
|
+
``` ruby
|
1355
|
+
set :sessions, :domain => '.foo.com'
|
1356
|
+
```
|
1357
|
+
|
1358
|
+
|
1124
1359
|
### Halt
|
1125
1360
|
|
1126
1361
|
Pour arrêter immédiatement la requête dans un filtre ou un gestionnaire de
|
1127
1362
|
route :
|
1128
1363
|
|
1129
|
-
```ruby
|
1364
|
+
``` ruby
|
1130
1365
|
halt
|
1131
1366
|
```
|
1132
1367
|
|
1133
1368
|
Vous pouvez aussi passer le code retour ...
|
1134
1369
|
|
1135
|
-
```ruby
|
1370
|
+
``` ruby
|
1136
1371
|
halt 410
|
1137
1372
|
```
|
1138
1373
|
|
1139
1374
|
Ou le texte ...
|
1140
1375
|
|
1141
|
-
```ruby
|
1376
|
+
``` ruby
|
1142
1377
|
halt 'Ceci est le texte'
|
1143
1378
|
```
|
1144
1379
|
|
1145
1380
|
Ou les deux ...
|
1146
1381
|
|
1147
|
-
```ruby
|
1382
|
+
``` ruby
|
1148
1383
|
halt 401, 'Partez !'
|
1149
1384
|
```
|
1150
1385
|
|
1151
1386
|
Ainsi que les entêtes ...
|
1152
1387
|
|
1153
|
-
```ruby
|
1388
|
+
``` ruby
|
1154
1389
|
halt 402, {'Content-Type' => 'text/plain'}, 'revanche'
|
1155
1390
|
```
|
1156
1391
|
|
1157
1392
|
Bien sûr il est possible de combiner un template avec `halt` :
|
1158
1393
|
|
1159
|
-
```ruby
|
1394
|
+
``` ruby
|
1160
1395
|
halt erb(:erreur)
|
1161
1396
|
```
|
1162
1397
|
|
@@ -1165,7 +1400,7 @@ halt erb(:erreur)
|
|
1165
1400
|
Une route peut passer le relais aux autres routes qui correspondent également
|
1166
1401
|
avec `pass` :
|
1167
1402
|
|
1168
|
-
```ruby
|
1403
|
+
``` ruby
|
1169
1404
|
get '/devine/:qui' do
|
1170
1405
|
pass unless params[:qui] == 'Frank'
|
1171
1406
|
"Tu m'as eu !"
|
@@ -1182,11 +1417,11 @@ Si aucun des masques suivants ne correspond, un code 404 est retourné.
|
|
1182
1417
|
|
1183
1418
|
### Déclencher une autre route
|
1184
1419
|
|
1185
|
-
Parfois,
|
1420
|
+
Parfois, `pass` n'est pas ce que vous recherchez, au lieu de cela vous
|
1186
1421
|
souhaitez obtenir le résultat d'une autre route. Pour cela, utilisez
|
1187
|
-
simplement call :
|
1422
|
+
simplement `call` :
|
1188
1423
|
|
1189
|
-
```ruby
|
1424
|
+
``` ruby
|
1190
1425
|
get '/foo' do
|
1191
1426
|
status, headers, body = call env.merge("PATH_INFO" => '/bar')
|
1192
1427
|
[status, headers, body.map(&:upcase)]
|
@@ -1214,10 +1449,10 @@ Il est possible et recommandé de définir le code retour et le corps de la
|
|
1214
1449
|
réponse au moyen de la valeur de retour d'un bloc définissant une route.
|
1215
1450
|
Quoiqu'il en soit, dans certains cas vous pourriez avoir besoin de définir
|
1216
1451
|
le coprs de la réponse à un moment arbitraire de l'exécution. Vous pouvez le
|
1217
|
-
faire au moyen de la méthode
|
1452
|
+
faire au moyen de la méthode `body`. Si vous faites ainsi, vous pouvez alors
|
1218
1453
|
utiliser cette même méthode pour accéder au corps de la réponse :
|
1219
1454
|
|
1220
|
-
```ruby
|
1455
|
+
``` ruby
|
1221
1456
|
get '/foo' do
|
1222
1457
|
body "bar"
|
1223
1458
|
end
|
@@ -1234,7 +1469,7 @@ voir "Valeurs de retour").
|
|
1234
1469
|
Pareillement au corps de la réponse, vous pouvez également définir le code
|
1235
1470
|
retour et les entêtes :
|
1236
1471
|
|
1237
|
-
```ruby
|
1472
|
+
``` ruby
|
1238
1473
|
get '/foo' do
|
1239
1474
|
status 418
|
1240
1475
|
headers \
|
@@ -1255,7 +1490,7 @@ extrèmes, vous souhaitez continuer à envoyer des données tant que le client
|
|
1255
1490
|
n'abandonne pas la connection. Vous pouvez alors utiliser le helper `stream`
|
1256
1491
|
pour éviter de créer votre propre système :
|
1257
1492
|
|
1258
|
-
```ruby
|
1493
|
+
``` ruby
|
1259
1494
|
get '/' do
|
1260
1495
|
stream do |out|
|
1261
1496
|
out << "Ca va être hallu -\n"
|
@@ -1277,37 +1512,52 @@ Le fonctionnement du streaming, notamment le nombre de requêtes simultanées,
|
|
1277
1512
|
dépend énormément du serveur web utilisé. Certains ne prennent pas du tout en
|
1278
1513
|
charge le streaming (WEBRick par exemple). Lorsque le serveur ne gère pas le
|
1279
1514
|
streaming, la partie body de la réponse sera envoyée au client en une seule
|
1280
|
-
fois, après que l'exécution du bloc passé au helper
|
1515
|
+
fois, après que l'exécution du bloc passé au helper `stream` sera terminée. Le
|
1281
1516
|
streaming ne fonctionne pas du tout avec Shotgun.
|
1282
1517
|
|
1283
|
-
En utilisant le helper
|
1284
|
-
pas la méthode
|
1518
|
+
En utilisant le helper stream avec le paramètre `keep_open`, il n'appelera
|
1519
|
+
pas la méthode `close` du flux, vous laissant la possibilité de le fermer à
|
1285
1520
|
tout moment au cours de l'exécution. Ceci ne fonctionne qu'avec les serveurs
|
1286
1521
|
evented (ie non threadés) tels que Thin et Rainbows. Les autres serveurs
|
1287
1522
|
fermeront malgré tout le flux :
|
1288
1523
|
|
1289
|
-
```ruby
|
1524
|
+
``` ruby
|
1525
|
+
# interrogation prolongée
|
1526
|
+
|
1290
1527
|
set :server, :thin
|
1291
|
-
|
1528
|
+
connexions = []
|
1292
1529
|
|
1293
|
-
get '/' do
|
1294
|
-
#
|
1295
|
-
stream(:keep_open) { |out|
|
1530
|
+
get '/souscrire' do
|
1531
|
+
# abonne un client aux évènements du serveur
|
1532
|
+
stream(:keep_open) { |out| connexions << out }
|
1533
|
+
|
1534
|
+
# purge les connexions abandonnées
|
1535
|
+
connexions.reject!(&:closed?)
|
1536
|
+
|
1537
|
+
# compte-rendu
|
1538
|
+
"abonné"
|
1296
1539
|
end
|
1297
1540
|
|
1298
|
-
post '/' do
|
1299
|
-
|
1300
|
-
|
1301
|
-
|
1541
|
+
post '/message' do
|
1542
|
+
connexions.each do |out|
|
1543
|
+
# prévient le client qu'un nouveau message est arrivé
|
1544
|
+
out << params[:message] << "\n"
|
1545
|
+
|
1546
|
+
# indique au client de se connecter à nouveau
|
1547
|
+
out.close
|
1548
|
+
end
|
1549
|
+
|
1550
|
+
# compte-rendu
|
1551
|
+
"message reçu"
|
1302
1552
|
end
|
1303
1553
|
```
|
1304
1554
|
|
1305
1555
|
### Journalisation (Logging)
|
1306
1556
|
|
1307
|
-
Dans le contexte de la requête, la méthode utilitaire
|
1308
|
-
instance de
|
1557
|
+
Dans le contexte de la requête, la méthode utilitaire `logger` expose une
|
1558
|
+
instance de `Logger` :
|
1309
1559
|
|
1310
|
-
```ruby
|
1560
|
+
``` ruby
|
1311
1561
|
get '/' do
|
1312
1562
|
logger.info "chargement des données"
|
1313
1563
|
# ...
|
@@ -1323,7 +1573,7 @@ Notez que la journalisation est seulement activée par défaut pour
|
|
1323
1573
|
`Sinatra::Application`, donc si vous héritez de `>Sinatra::Base`,
|
1324
1574
|
vous aurez à l'activer vous-même :
|
1325
1575
|
|
1326
|
-
```ruby
|
1576
|
+
``` ruby
|
1327
1577
|
class MonApp < Sinatra::Base
|
1328
1578
|
configure :production, :development do
|
1329
1579
|
enable :logging
|
@@ -1333,7 +1583,7 @@ end
|
|
1333
1583
|
|
1334
1584
|
Si vous souhaitez utiliser votre propre logger, vous devez définir le paramètre
|
1335
1585
|
`logging` à `nil` pour être certain qu'aucun middleware de logging ne sera
|
1336
|
-
installé (notez toutefois que
|
1586
|
+
installé (notez toutefois que `logger` renverra alors `nil`). Dans ce cas,
|
1337
1587
|
Sinatra utilisera ce qui sera présent dans `env['rack.logger']`.
|
1338
1588
|
|
1339
1589
|
### Types Mime
|
@@ -1342,7 +1592,7 @@ Quand vous utilisez `send_file` ou des fichiers statiques, vous
|
|
1342
1592
|
pouvez rencontrer des types mime que Sinatra ne connaît pas. Utilisez
|
1343
1593
|
`mime_type` pour les déclarer par extension de fichier :
|
1344
1594
|
|
1345
|
-
```ruby
|
1595
|
+
``` ruby
|
1346
1596
|
configure do
|
1347
1597
|
mime_type :foo, 'text/foo'
|
1348
1598
|
end
|
@@ -1350,7 +1600,7 @@ end
|
|
1350
1600
|
|
1351
1601
|
Vous pouvez également les utiliser avec la méthode `content_type` :
|
1352
1602
|
|
1353
|
-
```ruby
|
1603
|
+
``` ruby
|
1354
1604
|
get '/' do
|
1355
1605
|
content_type :foo
|
1356
1606
|
"foo foo foo"
|
@@ -1359,16 +1609,16 @@ end
|
|
1359
1609
|
|
1360
1610
|
### Former des URLs
|
1361
1611
|
|
1362
|
-
Pour former des URLs, vous devriez utiliser la méthode
|
1612
|
+
Pour former des URLs, vous devriez utiliser la méthode `url`, par exemple en
|
1363
1613
|
Haml :
|
1364
1614
|
|
1365
|
-
```ruby
|
1615
|
+
``` ruby
|
1366
1616
|
%a{:href => url('/foo')} foo
|
1367
1617
|
```
|
1368
1618
|
|
1369
1619
|
Cela prend en compte les proxy inverse et les routeurs Rack, s'ils existent.
|
1370
1620
|
|
1371
|
-
Cette méthode est également disponible sous l'alias
|
1621
|
+
Cette méthode est également disponible sous l'alias `to` (voir ci-dessous
|
1372
1622
|
pour un exemple).
|
1373
1623
|
|
1374
1624
|
### Redirection du navigateur
|
@@ -1376,7 +1626,7 @@ pour un exemple).
|
|
1376
1626
|
Vous pouvez déclencher une redirection du navigateur avec la méthode
|
1377
1627
|
`redirect` :
|
1378
1628
|
|
1379
|
-
```ruby
|
1629
|
+
``` ruby
|
1380
1630
|
get '/foo' do
|
1381
1631
|
redirect to('/bar')
|
1382
1632
|
end
|
@@ -1385,7 +1635,7 @@ end
|
|
1385
1635
|
Tout paramètre additionnel est géré comme des arguments pour la méthode
|
1386
1636
|
`halt` :
|
1387
1637
|
|
1388
|
-
```ruby
|
1638
|
+
``` ruby
|
1389
1639
|
redirect to('/bar'), 303
|
1390
1640
|
redirect 'http://google.com', 'mauvais endroit mon pote'
|
1391
1641
|
```
|
@@ -1393,7 +1643,7 @@ redirect 'http://google.com', 'mauvais endroit mon pote'
|
|
1393
1643
|
Vous pouvez aussi rediriger vers la page dont l'utilisateur venait au moyen de
|
1394
1644
|
`redirect back` :
|
1395
1645
|
|
1396
|
-
```ruby
|
1646
|
+
``` ruby
|
1397
1647
|
get '/foo' do
|
1398
1648
|
"<a href='/bar'>faire quelque chose</a>"
|
1399
1649
|
end
|
@@ -1406,13 +1656,13 @@ end
|
|
1406
1656
|
|
1407
1657
|
Pour passer des arguments à une redirection, ajoutez-les soit à la requête :
|
1408
1658
|
|
1409
|
-
```ruby
|
1659
|
+
``` ruby
|
1410
1660
|
redirect to('/bar?sum=42')
|
1411
1661
|
```
|
1412
1662
|
|
1413
1663
|
Ou bien utilisez une session :
|
1414
1664
|
|
1415
|
-
```ruby
|
1665
|
+
``` ruby
|
1416
1666
|
enable :sessions
|
1417
1667
|
|
1418
1668
|
get '/foo' do
|
@@ -1431,36 +1681,36 @@ Définir correctement vos entêtes à la base pour un bon cache HTTP.
|
|
1431
1681
|
|
1432
1682
|
Vous pouvez facilement définir l'entête Cache-Control de la manière suivante :
|
1433
1683
|
|
1434
|
-
```ruby
|
1684
|
+
``` ruby
|
1435
1685
|
get '/' do
|
1436
1686
|
cache_control :public
|
1437
1687
|
"met le en cache !"
|
1438
1688
|
end
|
1439
1689
|
```
|
1440
1690
|
|
1441
|
-
Conseil de pro : définir le cache dans un filtre
|
1691
|
+
Conseil de pro : définir le cache dans un filtre before :
|
1442
1692
|
|
1443
|
-
```ruby
|
1693
|
+
``` ruby
|
1444
1694
|
before do
|
1445
1695
|
cache_control :public, :must_revalidate, :max_age => 60
|
1446
1696
|
end
|
1447
1697
|
```
|
1448
1698
|
|
1449
|
-
Si vous utilisez la méthode
|
1699
|
+
Si vous utilisez la méthode `expires` pour définir l'entête correspondant,
|
1450
1700
|
`Cache-Control` sera alors défini automatiquement :
|
1451
1701
|
|
1452
|
-
```ruby
|
1702
|
+
``` ruby
|
1453
1703
|
before do
|
1454
1704
|
expires 500, :public, :must_revalidate
|
1455
1705
|
end
|
1456
1706
|
```
|
1457
1707
|
|
1458
|
-
Pour utiliser correctement les caches, vous devriez utiliser
|
1459
|
-
|
1708
|
+
Pour utiliser correctement les caches, vous devriez utiliser `etag` ou
|
1709
|
+
`last_modified`. Il est recommandé d'utiliser ces méthodes *avant* de faire
|
1460
1710
|
d'importantes modifications, car elles vont immédiatement déclencher la réponse
|
1461
1711
|
si le client a déjà la version courante dans son cache :
|
1462
1712
|
|
1463
|
-
```ruby
|
1713
|
+
``` ruby
|
1464
1714
|
get '/article/:id' do
|
1465
1715
|
@article = Article.find params[:id]
|
1466
1716
|
last_modified @article.updated_at
|
@@ -1472,7 +1722,7 @@ end
|
|
1472
1722
|
Il est également possible d'utiliser un
|
1473
1723
|
[weak ETag](http://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation) :
|
1474
1724
|
|
1475
|
-
```ruby
|
1725
|
+
``` ruby
|
1476
1726
|
etag @article.sha1, :weak
|
1477
1727
|
```
|
1478
1728
|
|
@@ -1481,7 +1731,7 @@ fournissent les informations nécessaires pour votre cache. Si vous êtes à la
|
|
1481
1731
|
recherche de solutions rapides pour un reverse-proxy de cache, essayez
|
1482
1732
|
[rack-cache](https://github.com/rtomayko/rack-cache) :
|
1483
1733
|
|
1484
|
-
```ruby
|
1734
|
+
``` ruby
|
1485
1735
|
require "rack/cache"
|
1486
1736
|
require "sinatra"
|
1487
1737
|
|
@@ -1505,7 +1755,7 @@ put) existent déjà et pour les autres resources (par exemple dans le cas
|
|
1505
1755
|
de requêtes post) qu'il s'agit de nouvelles resources. Vous pouvez modifier ce
|
1506
1756
|
comportement en passant une option `:new_resource` :
|
1507
1757
|
|
1508
|
-
```ruby
|
1758
|
+
``` ruby
|
1509
1759
|
get '/create' do
|
1510
1760
|
etag '', :new_resource => true
|
1511
1761
|
Article.create
|
@@ -1515,16 +1765,15 @@ end
|
|
1515
1765
|
|
1516
1766
|
Si vous souhaitez utilisez un ETag faible, utilisez l'option <tt>:kind</tt> :
|
1517
1767
|
|
1518
|
-
```
|
1768
|
+
``` ruby
|
1519
1769
|
etag '', :new_resource => true, :kind => :weak
|
1520
1770
|
```
|
1521
1771
|
|
1522
1772
|
### Envoyer des fichiers
|
1523
1773
|
|
1524
|
-
Pour envoyer des fichiers, vous pouvez utiliser la méthode
|
1525
|
-
`send_file` :
|
1774
|
+
Pour envoyer des fichiers, vous pouvez utiliser la méthode `send_file` :
|
1526
1775
|
|
1527
|
-
```ruby
|
1776
|
+
``` ruby
|
1528
1777
|
get '/' do
|
1529
1778
|
send_file 'foo.png'
|
1530
1779
|
end
|
@@ -1532,7 +1781,7 @@ end
|
|
1532
1781
|
|
1533
1782
|
Quelques options sont également acceptées :
|
1534
1783
|
|
1535
|
-
```ruby
|
1784
|
+
``` ruby
|
1536
1785
|
send_file 'foo.png', :type => :jpg
|
1537
1786
|
```
|
1538
1787
|
|
@@ -1545,36 +1794,43 @@ Les options sont :
|
|
1545
1794
|
</dd>
|
1546
1795
|
|
1547
1796
|
<dt>last_modified</dt>
|
1548
|
-
<dd>
|
1549
|
-
du
|
1797
|
+
<dd>
|
1798
|
+
valeur pour l’entête Last-Modified, par défaut la date de modification du
|
1799
|
+
fichier
|
1800
|
+
</dd>
|
1550
1801
|
|
1551
1802
|
<dt>type</dt>
|
1552
|
-
<dd>
|
1553
|
-
|
1803
|
+
<dd>
|
1804
|
+
type de contenu à utiliser, deviné à partir de l’extension de fichier si
|
1805
|
+
absent
|
1806
|
+
</dd>
|
1554
1807
|
|
1555
1808
|
<dt>disposition</dt>
|
1556
|
-
<dd>
|
1557
|
-
|
1809
|
+
<dd>
|
1810
|
+
utilisé pour Content-Disposition, les valuers possibles étant : <tt>nil</tt>
|
1811
|
+
(par défaut), <tt>:attachment</tt> et <tt>:inline</tt>
|
1812
|
+
</dd>
|
1558
1813
|
|
1559
1814
|
<dt>length</dt>
|
1560
1815
|
<dd>entête Content-Length, par défaut la taille du fichier</dd>
|
1561
1816
|
|
1562
1817
|
<dt>status</dt>
|
1563
|
-
<dd>
|
1564
|
-
|
1818
|
+
<dd>
|
1819
|
+
code état à renvoyer. Utile quand un fichier statique sert de page d’erreur.
|
1820
|
+
</dd>
|
1565
1821
|
</dl>
|
1566
1822
|
|
1567
|
-
Si le gestionnaire Rack le supporte, d'autres moyens que le
|
1823
|
+
Si le gestionnaire Rack le supporte, d'autres moyens que le streaming via le
|
1568
1824
|
processus Ruby seront utilisés. Si vous utilisez cette méthode, Sinatra gérera
|
1569
|
-
automatiquement les requêtes de type
|
1825
|
+
automatiquement les requêtes de type range.
|
1570
1826
|
|
1571
1827
|
### Accéder à l'objet requête
|
1572
1828
|
|
1573
1829
|
L'objet correspondant à la requête envoyée peut être récupéré dans le contexte
|
1574
1830
|
de la requête (filtres, routes, gestionnaires d'erreur) au moyen de la méthode
|
1575
|
-
|
1831
|
+
`request` :
|
1576
1832
|
|
1577
|
-
```ruby
|
1833
|
+
``` ruby
|
1578
1834
|
# application tournant à l'adresse http://exemple.com/exemple
|
1579
1835
|
get '/foo' do
|
1580
1836
|
t = %w[text/css text/html application/javascript]
|
@@ -1596,7 +1852,7 @@ get '/foo' do
|
|
1596
1852
|
# verbes HTTP)
|
1597
1853
|
request.form_data? # false
|
1598
1854
|
request["UN_ENTETE"] # valeur de l'entête UN_ENTETE
|
1599
|
-
request.
|
1855
|
+
request.referrer # référant du client ou '/'
|
1600
1856
|
request.user_agent # user agent (utilisé par la condition :agent)
|
1601
1857
|
request.cookies # tableau contenant les cookies du navigateur
|
1602
1858
|
request.xhr? # requête AJAX ?
|
@@ -1605,15 +1861,14 @@ get '/foo' do
|
|
1605
1861
|
request.ip # adresse IP du client
|
1606
1862
|
request.secure? # false
|
1607
1863
|
request.forwarded? # vrai (si on est derrière un proxy inverse)
|
1608
|
-
request.env # tableau brut de l'environnement fourni par
|
1609
|
-
# Rack
|
1864
|
+
request.env # tableau brut de l'environnement fourni par Rack
|
1610
1865
|
end
|
1611
1866
|
```
|
1612
1867
|
|
1613
1868
|
Certaines options, telles que `script_name` ou `path_info`
|
1614
1869
|
peuvent également être modifiées :
|
1615
1870
|
|
1616
|
-
```ruby
|
1871
|
+
``` ruby
|
1617
1872
|
before { request.path_info = "/" }
|
1618
1873
|
|
1619
1874
|
get "/" do
|
@@ -1623,7 +1878,7 @@ end
|
|
1623
1878
|
|
1624
1879
|
`request.body` est un objet IO ou StringIO :
|
1625
1880
|
|
1626
|
-
```ruby
|
1881
|
+
``` ruby
|
1627
1882
|
post "/api" do
|
1628
1883
|
request.body.rewind # au cas où il a déjà été lu
|
1629
1884
|
donnees = JSON.parse request.body.read
|
@@ -1633,11 +1888,11 @@ end
|
|
1633
1888
|
|
1634
1889
|
### Fichiers joints
|
1635
1890
|
|
1636
|
-
Vous pouvez utiliser la méthode
|
1891
|
+
Vous pouvez utiliser la méthode `attachment` pour indiquer au navigateur que
|
1637
1892
|
la réponse devrait être stockée sur le disque plutôt qu'affichée :
|
1638
1893
|
|
1639
1894
|
|
1640
|
-
```ruby
|
1895
|
+
``` ruby
|
1641
1896
|
get '/' do
|
1642
1897
|
attachment
|
1643
1898
|
"enregistre-le !"
|
@@ -1646,7 +1901,7 @@ end
|
|
1646
1901
|
|
1647
1902
|
Vous pouvez également lui passer un nom de fichier :
|
1648
1903
|
|
1649
|
-
```ruby
|
1904
|
+
``` ruby
|
1650
1905
|
get '/' do
|
1651
1906
|
attachment "info.txt"
|
1652
1907
|
"enregistre-le !"
|
@@ -1655,23 +1910,23 @@ end
|
|
1655
1910
|
|
1656
1911
|
### Gérer Date et Time
|
1657
1912
|
|
1658
|
-
Sinatra fourni un helper
|
1659
|
-
objet `Time`. Il peut aussi faire la conversion à partir d'objets
|
1913
|
+
Sinatra fourni un helper `time_for` pour convertir une valeur donnée en
|
1914
|
+
objet `Time`. Il peut aussi faire la conversion à partir d'objets `DateTime`,
|
1660
1915
|
`Date` ou de classes similaires :
|
1661
1916
|
|
1662
|
-
```ruby
|
1917
|
+
``` ruby
|
1663
1918
|
get '/' do
|
1664
1919
|
pass if Time.now > time_for('Dec 23, 2012')
|
1665
1920
|
"encore temps"
|
1666
1921
|
end
|
1667
1922
|
```
|
1668
1923
|
|
1669
|
-
Cette méthode est utilisée en interne par
|
1924
|
+
Cette méthode est utilisée en interne par `expires`, `last_modified` et
|
1670
1925
|
consorts. Par conséquent, vous pouvez très facilement étendre le
|
1671
|
-
fonctionnement de ces méthodes en surchargeant le helper
|
1926
|
+
fonctionnement de ces méthodes en surchargeant le helper `time_for` dans
|
1672
1927
|
votre application :
|
1673
1928
|
|
1674
|
-
```ruby
|
1929
|
+
``` ruby
|
1675
1930
|
helpers do
|
1676
1931
|
def time_for(value)
|
1677
1932
|
case value
|
@@ -1694,7 +1949,7 @@ end
|
|
1694
1949
|
La méthode `find_template` est utilisée pour trouver les fichiers de
|
1695
1950
|
templates à générer :
|
1696
1951
|
|
1697
|
-
```ruby
|
1952
|
+
``` ruby
|
1698
1953
|
find_template settings.views, 'foo', Tilt[:haml] do |file|
|
1699
1954
|
puts "pourrait être #{file}"
|
1700
1955
|
end
|
@@ -1704,7 +1959,7 @@ Ce n'est pas très utilise. En revanche, il est utile de pouvoir surcharger
|
|
1704
1959
|
cette méthode afin de définir son propre mécanisme de recherche. Par exemple,
|
1705
1960
|
vous pouvez utiliser plus d'un répertoire de vues :
|
1706
1961
|
|
1707
|
-
```ruby
|
1962
|
+
``` ruby
|
1708
1963
|
set :views, ['views', 'templates']
|
1709
1964
|
|
1710
1965
|
helpers do
|
@@ -1717,7 +1972,7 @@ end
|
|
1717
1972
|
Un autre exemple est d'utiliser des répertoires différents pour des moteurs
|
1718
1973
|
de rendu différents :
|
1719
1974
|
|
1720
|
-
```ruby
|
1975
|
+
``` ruby
|
1721
1976
|
set :views, :sass => 'views/sass', :haml => 'templates', :default => 'views'
|
1722
1977
|
|
1723
1978
|
helpers do
|
@@ -1734,7 +1989,7 @@ d'autres !
|
|
1734
1989
|
|
1735
1990
|
Notez que `find_template` ne vérifie pas que le fichier existe mais
|
1736
1991
|
va plutôt exécuter le bloc pour tous les chemins possibles. Cela n'induit pas
|
1737
|
-
un problème de performance dans le sens où `render` va utiliser
|
1992
|
+
un problème de performance dans le sens où `render` va utiliser `break` dès
|
1738
1993
|
qu'un fichier est trouvé. De plus, l'emplacement des templates (et leur
|
1739
1994
|
contenu) est mis en cache si vous n'êtes pas en mode développement. Vous
|
1740
1995
|
devriez garder cela en tête si vous écrivez une méthode vraiment dingue.
|
@@ -1743,7 +1998,7 @@ devriez garder cela en tête si vous écrivez une méthode vraiment dingue.
|
|
1743
1998
|
|
1744
1999
|
Lancé une seule fois au démarrage de tous les environnements :
|
1745
2000
|
|
1746
|
-
```ruby
|
2001
|
+
``` ruby
|
1747
2002
|
configure do
|
1748
2003
|
# définir un paramètre
|
1749
2004
|
set :option, 'value'
|
@@ -1765,20 +2020,23 @@ end
|
|
1765
2020
|
Lancé si l'environnement (variable d'environnement RACK_ENV) est défini comme
|
1766
2021
|
`:production` :
|
1767
2022
|
|
2023
|
+
``` ruby
|
1768
2024
|
configure :production do
|
1769
2025
|
...
|
1770
2026
|
end
|
2027
|
+
```
|
1771
2028
|
|
1772
|
-
Lancé si l'environnement est `:production` ou
|
1773
|
-
`:test` :
|
2029
|
+
Lancé si l'environnement est `:production` ou `:test` :
|
1774
2030
|
|
2031
|
+
``` ruby
|
1775
2032
|
configure :production, :test do
|
1776
2033
|
...
|
1777
2034
|
end
|
2035
|
+
```
|
1778
2036
|
|
1779
2037
|
Vous pouvez accéder à ces paramètres via `settings` :
|
1780
2038
|
|
1781
|
-
```
|
2039
|
+
``` ruby
|
1782
2040
|
configure do
|
1783
2041
|
set :foo, 'bar'
|
1784
2042
|
end
|
@@ -1797,24 +2055,34 @@ pour protéger votre application contre les principales attaques opportunistes.
|
|
1797
2055
|
Vous pouvez très simplement désactiver cette fonctionnalité (ce qui exposera
|
1798
2056
|
votre application à beaucoup de vulnerabilités courantes) :
|
1799
2057
|
|
1800
|
-
```ruby
|
2058
|
+
``` ruby
|
1801
2059
|
disable :protection
|
1802
2060
|
```
|
1803
2061
|
|
1804
2062
|
Pour désactiver seulement un type de protection, vous pouvez définir `protection`
|
1805
2063
|
avec un hash d'options :
|
1806
2064
|
|
1807
|
-
```ruby
|
2065
|
+
``` ruby
|
1808
2066
|
set :protection, :except => :path_traversal
|
1809
2067
|
```
|
1810
2068
|
|
1811
2069
|
Vous pouvez également lui passer un tableau pour désactiver plusieurs types de
|
1812
2070
|
protection :
|
1813
2071
|
|
1814
|
-
```ruby
|
2072
|
+
``` ruby
|
1815
2073
|
set :protection, :except => [:path_traversal, :session_hijacking]
|
1816
2074
|
```
|
1817
2075
|
|
2076
|
+
Par défaut, il faut que `:sessions` soit activé pour que Sinatra mette en place
|
2077
|
+
un système de protection au niveau de la session. Dans le cas où vous gérez
|
2078
|
+
vous même les sessions, vous devez utiliser l'option `:session` pour que cela
|
2079
|
+
soit le cas :
|
2080
|
+
|
2081
|
+
``` ruby
|
2082
|
+
use Rack::Session::Pool
|
2083
|
+
set :protection, :session => true
|
2084
|
+
```
|
2085
|
+
|
1818
2086
|
### Paramètres disponibles
|
1819
2087
|
|
1820
2088
|
<dl>
|
@@ -1951,28 +2219,44 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
1951
2219
|
<dt>views</dt>
|
1952
2220
|
<dd>chemin pour le dossier des vues. Si non défini, il découle du paramètre
|
1953
2221
|
<tt>app_file</tt>.</dd>
|
2222
|
+
|
2223
|
+
<dt>x_cascade</dt>
|
2224
|
+
<dd>
|
2225
|
+
Indique s'il faut ou non définir le header X-Cascade lorsqu'aucune route
|
2226
|
+
ne correspond. Défini à <tt>true</tt> par défaut.
|
2227
|
+
</dd>
|
1954
2228
|
</dl>
|
1955
2229
|
|
1956
2230
|
## Environements
|
1957
2231
|
|
1958
2232
|
Il existe trois environnements prédéfinis : `"development"`,
|
1959
2233
|
`"production"` et `"test"`. Les environements peuvent être
|
1960
|
-
sélectionné via la variable d'environnement
|
2234
|
+
sélectionné via la variable d'environnement `RACK_ENV`. Sa valeur par défaut
|
1961
2235
|
est `"development"`. Dans ce mode, tous les templates sont rechargés à
|
1962
2236
|
chaque requête. Des handlers spécifiques pour `not_found` et
|
1963
2237
|
`error` sont installés pour vous permettre d'avoir une pile de trace
|
1964
2238
|
dans votre navigateur. En mode `"production"` et `"test"` les
|
1965
2239
|
templates sont mis en cache par défaut.
|
1966
2240
|
|
1967
|
-
Pour exécuter votre application dans un environnement différent,
|
1968
|
-
|
2241
|
+
Pour exécuter votre application dans un environnement différent, définissez la
|
2242
|
+
variable d'environnement `RACK_ENV` :
|
1969
2243
|
|
1970
|
-
```
|
1971
|
-
|
2244
|
+
``` shell
|
2245
|
+
RACK_ENV=production ruby my_app.rb
|
1972
2246
|
```
|
1973
2247
|
|
1974
|
-
Vous pouvez utiliser une des méthodes
|
1975
|
-
pour déterminer quel est l'environnement en cours
|
2248
|
+
Vous pouvez utiliser une des méthodes `development?`, `test?` et `production?`
|
2249
|
+
pour déterminer quel est l'environnement en cours :
|
2250
|
+
|
2251
|
+
``` ruby
|
2252
|
+
get '/' do
|
2253
|
+
if settings.development?
|
2254
|
+
"développement !"
|
2255
|
+
else
|
2256
|
+
"pas en développement !"
|
2257
|
+
end
|
2258
|
+
end
|
2259
|
+
```
|
1976
2260
|
|
1977
2261
|
## Gérer les erreurs
|
1978
2262
|
|
@@ -1985,7 +2269,7 @@ vieux `haml`, `erb`, `halt`, etc.
|
|
1985
2269
|
Quand une exception <tt>Sinatra::NotFound</tt> est soulevée, ou que le code
|
1986
2270
|
retour est 404, le gestionnaire <tt>not_found</tt> est invoqué :
|
1987
2271
|
|
1988
|
-
```ruby
|
2272
|
+
``` ruby
|
1989
2273
|
not_found do
|
1990
2274
|
'Pas moyen de trouver ce que vous cherchez'
|
1991
2275
|
end
|
@@ -1993,11 +2277,11 @@ end
|
|
1993
2277
|
|
1994
2278
|
### Error
|
1995
2279
|
|
1996
|
-
Le gestionnaire
|
2280
|
+
Le gestionnaire `error` est invoqué à chaque fois qu'une exception est
|
1997
2281
|
soulevée dans une route ou un filtre. L'objet exception est accessible via la
|
1998
2282
|
variable Rack `sinatra.error` :
|
1999
2283
|
|
2000
|
-
```ruby
|
2284
|
+
``` ruby
|
2001
2285
|
error do
|
2002
2286
|
'Désolé mais une méchante erreur est survenue - ' + env['sinatra.error'].name
|
2003
2287
|
end
|
@@ -2005,7 +2289,7 @@ end
|
|
2005
2289
|
|
2006
2290
|
Erreur sur mesure :
|
2007
2291
|
|
2008
|
-
```ruby
|
2292
|
+
``` ruby
|
2009
2293
|
error MonErreurSurMesure do
|
2010
2294
|
'Donc il est arrivé ceci...' + env['sinatra.error'].message
|
2011
2295
|
end
|
@@ -2013,7 +2297,7 @@ end
|
|
2013
2297
|
|
2014
2298
|
Donc si ceci arrive :
|
2015
2299
|
|
2016
|
-
```ruby
|
2300
|
+
``` ruby
|
2017
2301
|
get '/' do
|
2018
2302
|
raise MonErreurSurMesure, 'quelque chose de mal'
|
2019
2303
|
end
|
@@ -2026,7 +2310,7 @@ Vous obtenez ça :
|
|
2026
2310
|
Alternativement, vous pouvez avoir un gestionnaire d'erreur associé à un code
|
2027
2311
|
particulier :
|
2028
2312
|
|
2029
|
-
```ruby
|
2313
|
+
``` ruby
|
2030
2314
|
error 403 do
|
2031
2315
|
'Accès interdit'
|
2032
2316
|
end
|
@@ -2038,7 +2322,7 @@ end
|
|
2038
2322
|
|
2039
2323
|
Ou un intervalle :
|
2040
2324
|
|
2041
|
-
```ruby
|
2325
|
+
``` ruby
|
2042
2326
|
error 400..510 do
|
2043
2327
|
'Boom'
|
2044
2328
|
end
|
@@ -2058,9 +2342,9 @@ visualiser/manipuler la requête/réponse HTTP, et d'offrir diverses
|
|
2058
2342
|
fonctionnalités classiques.
|
2059
2343
|
|
2060
2344
|
Sinatra permet de construire facilement des middlewares Rack via la méthode de
|
2061
|
-
haut niveau
|
2345
|
+
haut niveau `use` :
|
2062
2346
|
|
2063
|
-
```ruby
|
2347
|
+
``` ruby
|
2064
2348
|
require 'sinatra'
|
2065
2349
|
require 'mon_middleware_perso'
|
2066
2350
|
|
@@ -2072,21 +2356,27 @@ get '/bonjour' do
|
|
2072
2356
|
end
|
2073
2357
|
```
|
2074
2358
|
|
2075
|
-
La sémantique de
|
2359
|
+
La sémantique de `use` est identique à celle définie dans le DSL de
|
2076
2360
|
[Rack::Builder](http://rack.rubyforge.org/doc/classes/Rack/Builder.html)
|
2077
2361
|
(le plus souvent utilisé dans un fichier rackup). Par exemple, la méthode
|
2078
|
-
|
2362
|
+
`use` accepte divers arguments ainsi que des blocs :
|
2079
2363
|
|
2080
|
-
```
|
2364
|
+
``` ruby
|
2081
2365
|
use Rack::Auth::Basic do |login, password|
|
2082
2366
|
login == 'admin' && password == 'secret'
|
2083
2367
|
end
|
2084
2368
|
```
|
2085
2369
|
|
2086
|
-
Rack est distribué avec
|
2087
|
-
|
2088
|
-
|
2089
|
-
|
2370
|
+
Rack est distribué avec de nombreux middlewares standards pour loguer, débuguer,
|
2371
|
+
faire du routage URL, de l'authentification ou gérer des sessions. Sinatra gère
|
2372
|
+
plusieurs de ces composants automatiquement via son système de configuration, ce
|
2373
|
+
qui vous dispense de faire un `use` en ce qui les concerne.
|
2374
|
+
|
2375
|
+
Vous trouverez d'autres middlewares intéressants sur
|
2376
|
+
[rack](https://github.com/rack/rack/tree/master/lib/rack),
|
2377
|
+
[rack-contrib](https://github.com/rack/rack-contrib#readm),
|
2378
|
+
[CodeRack](http://coderack.org/) ou en consultant le
|
2379
|
+
[wiki de Rack](https://github.com/rack/rack/wiki/List-of-Middleware).
|
2090
2380
|
|
2091
2381
|
## Tester
|
2092
2382
|
|
@@ -2094,7 +2384,7 @@ Les tests pour Sinatra peuvent être écrit avec n'importe quelle bibliothèque
|
|
2094
2384
|
basée sur Rack. [Rack::Test](http://gitrdoc.com/brynary/rack-test) est
|
2095
2385
|
recommandé :
|
2096
2386
|
|
2097
|
-
```ruby
|
2387
|
+
``` ruby
|
2098
2388
|
require 'mon_application_sinatra'
|
2099
2389
|
require 'test/unit'
|
2100
2390
|
require 'rack/test'
|
@@ -2134,7 +2424,7 @@ niveau supérieur suppose une configuration dans le style des micro-applications
|
|
2134
2424
|
`./views`, des logs, une page d'erreur, etc...). C'est là que
|
2135
2425
|
`Sinatra::Base` prend tout son intérêt :
|
2136
2426
|
|
2137
|
-
```ruby
|
2427
|
+
``` ruby
|
2138
2428
|
require 'sinatra/base'
|
2139
2429
|
|
2140
2430
|
class MonApplication < Sinatra::Base
|
@@ -2190,7 +2480,7 @@ mineures en ce qui concerne les paramètres par défaut :
|
|
2190
2480
|
Il y a deux façons de faire pour démarrer une application modulaire, démarrez
|
2191
2481
|
avec `run!` :
|
2192
2482
|
|
2193
|
-
```ruby
|
2483
|
+
``` ruby
|
2194
2484
|
# my_app.rb
|
2195
2485
|
require 'sinatra/base'
|
2196
2486
|
|
@@ -2204,14 +2494,14 @@ end
|
|
2204
2494
|
|
2205
2495
|
Démarrez ensuite avec :
|
2206
2496
|
|
2207
|
-
```
|
2208
|
-
|
2497
|
+
``` shell
|
2498
|
+
ruby my_app.rb
|
2209
2499
|
```
|
2210
2500
|
|
2211
2501
|
Ou alors avec un fichier `config.ru`, qui permet d'utiliser n'importe
|
2212
2502
|
quel gestionnaire Rack :
|
2213
2503
|
|
2214
|
-
```ruby
|
2504
|
+
``` ruby
|
2215
2505
|
# config.ru
|
2216
2506
|
require './my_app'
|
2217
2507
|
run MyApp
|
@@ -2219,15 +2509,15 @@ run MyApp
|
|
2219
2509
|
|
2220
2510
|
Exécutez :
|
2221
2511
|
|
2222
|
-
```
|
2223
|
-
|
2512
|
+
``` shell
|
2513
|
+
rackup -p 4567
|
2224
2514
|
```
|
2225
2515
|
|
2226
2516
|
### Utiliser une application de style classique avec un fichier config.ru
|
2227
2517
|
|
2228
2518
|
Ecrivez votre application :
|
2229
2519
|
|
2230
|
-
```ruby
|
2520
|
+
``` ruby
|
2231
2521
|
# app.rb
|
2232
2522
|
require 'sinatra'
|
2233
2523
|
|
@@ -2238,7 +2528,7 @@ end
|
|
2238
2528
|
|
2239
2529
|
Et un fichier `config.ru` correspondant :
|
2240
2530
|
|
2241
|
-
```ruby
|
2531
|
+
``` ruby
|
2242
2532
|
require './app'
|
2243
2533
|
run Sinatra::Application
|
2244
2534
|
```
|
@@ -2265,7 +2555,7 @@ en tant que middleware. Ce endpoint peut très bien être une autre
|
|
2265
2555
|
application Sinatra, ou n'importe quelle application basée sur Rack
|
2266
2556
|
(Rails/Ramaze/Camping/...) :
|
2267
2557
|
|
2268
|
-
```ruby
|
2558
|
+
``` ruby
|
2269
2559
|
require 'sinatra/base'
|
2270
2560
|
|
2271
2561
|
class EcranDeConnexion < Sinatra::Base
|
@@ -2302,7 +2592,7 @@ Il se peut que vous ayez besoin de créer une nouvelle application à l'exécuti
|
|
2302
2592
|
sans avoir à les assigner à une constante, vous pouvez le faire grâce à
|
2303
2593
|
`Sinatra.new` :
|
2304
2594
|
|
2305
|
-
```ruby
|
2595
|
+
``` ruby
|
2306
2596
|
require 'sinatra/base'
|
2307
2597
|
mon_app = Sinatra.new { get('/') { "salut" } }
|
2308
2598
|
mon_app.run!
|
@@ -2310,7 +2600,7 @@ mon_app.run!
|
|
2310
2600
|
|
2311
2601
|
L'application dont elle hérite peut être passé en argument optionnel :
|
2312
2602
|
|
2313
|
-
```ruby
|
2603
|
+
``` ruby
|
2314
2604
|
# config.ru
|
2315
2605
|
require 'sinatra/base'
|
2316
2606
|
|
@@ -2333,7 +2623,7 @@ utiliser Sinatra dans votre propre bibliothèque.
|
|
2333
2623
|
|
2334
2624
|
Cela permet également d'utiliser très facilement Sinatra comme middleware :
|
2335
2625
|
|
2336
|
-
```ruby
|
2626
|
+
``` ruby
|
2337
2627
|
require 'sinatra/base'
|
2338
2628
|
|
2339
2629
|
use Sinatra do
|
@@ -2350,17 +2640,16 @@ disponibles.
|
|
2350
2640
|
|
2351
2641
|
### Contexte de l'application/classe
|
2352
2642
|
|
2353
|
-
|
2354
|
-
|
2355
|
-
|
2356
|
-
|
2357
|
-
|
2358
|
-
|
2359
|
-
requêtes.
|
2643
|
+
Une application Sinatra correspond à une sous-classe de `Sinatra::Base`. Il
|
2644
|
+
s'agit de `Sinatra::Application` si vous utilisez le DSL de haut niveau
|
2645
|
+
(`require 'sinatra'`). Sinon c'est la sous-classe que vous avez définie. Dans
|
2646
|
+
le contexte de cette classe, vous avez accès aux méthodes telles que `get` ou
|
2647
|
+
`before`, mais pas aux objets `request` ou `session` étant donné que toutes
|
2648
|
+
les requêtes sont traitées par une seule classe d'application.
|
2360
2649
|
|
2361
|
-
Les options définies au moyen de
|
2650
|
+
Les options définies au moyen de `set` deviennent des méthodes de classe :
|
2362
2651
|
|
2363
|
-
```ruby
|
2652
|
+
``` ruby
|
2364
2653
|
class MonApp < Sinatra::Base
|
2365
2654
|
# Eh, je suis dans le contexte de l'application !
|
2366
2655
|
set :foo, 42
|
@@ -2387,14 +2676,14 @@ Vous pouvez atteindre ce contexte (donc la classe) de la façon suivante :
|
|
2387
2676
|
|
2388
2677
|
### Contexte de la requête/instance
|
2389
2678
|
|
2390
|
-
Pour
|
2679
|
+
Pour chaque requête traitée, une nouvelle instance de votre classe
|
2391
2680
|
d'application est créée et tous vos gestionnaires sont exécutés dans ce
|
2392
|
-
contexte.
|
2393
|
-
`session`
|
2681
|
+
contexte. Depuis celui-ci, vous pouvez accéder aux objets `request` et
|
2682
|
+
`session` ou faire appel aux fonctions de rendu telles que `erb` ou `haml`.
|
2394
2683
|
Vous pouvez accéder au contexte de l'application depuis le contexte de la
|
2395
2684
|
requête au moyen de `settings` :
|
2396
2685
|
|
2397
|
-
```ruby
|
2686
|
+
``` ruby
|
2398
2687
|
class MonApp < Sinatra::Base
|
2399
2688
|
# Eh, je suis dans le contexte de l'application !
|
2400
2689
|
get '/ajouter_route/:nom' do
|
@@ -2413,10 +2702,10 @@ end
|
|
2413
2702
|
|
2414
2703
|
Vous avez le binding du contexte de la requête dans :
|
2415
2704
|
|
2416
|
-
* les blocs get
|
2417
|
-
* les filtres before
|
2705
|
+
* les blocs get, head, post, put, delete, options, patch, link et unlink
|
2706
|
+
* les filtres before et after
|
2418
2707
|
* les méthodes utilitaires (définies au moyen de `helpers`)
|
2419
|
-
* les vues
|
2708
|
+
* les vues et templates
|
2420
2709
|
|
2421
2710
|
### Le contexte de délégation
|
2422
2711
|
|
@@ -2433,7 +2722,7 @@ Vous avez le binding du contexte de délégation dans :
|
|
2433
2722
|
* Le binding de haut niveau, si vous avez utilisé `require "sinatra"`
|
2434
2723
|
* Un objet qui inclut le module `Sinatra::Delegator`
|
2435
2724
|
|
2436
|
-
|
2725
|
+
Pour vous faire une idée, vous pouvez jeter un coup d'oeil au
|
2437
2726
|
[mixin Sinatra::Delegator](https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/base.rb#L1609-1633)
|
2438
2727
|
qui [étend l'objet principal](https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/main.rb#L28-30).
|
2439
2728
|
|
@@ -2441,17 +2730,17 @@ qui [étend l'objet principal](https://github.com/sinatra/sinatra/blob/ca06364/l
|
|
2441
2730
|
|
2442
2731
|
Les applications Sinatra peuvent être lancées directement :
|
2443
2732
|
|
2444
|
-
```
|
2445
|
-
|
2733
|
+
``` shell
|
2734
|
+
ruby mon_application.rb [-h] [-x] [-e ENVIRONNEMENT] [-p PORT] [-o HOTE] [-s SERVEUR]
|
2446
2735
|
```
|
2447
2736
|
|
2448
|
-
|
2737
|
+
Avec les options :
|
2449
2738
|
|
2450
2739
|
```
|
2451
2740
|
-h # aide
|
2452
2741
|
-p # déclare le port (4567 par défaut)
|
2453
2742
|
-o # déclare l'hôte (0.0.0.0 par défaut)
|
2454
|
-
-e # déclare l'environnement (
|
2743
|
+
-e # déclare l'environnement (development par défaut)
|
2455
2744
|
-s # déclare le serveur/gestionnaire à utiliser (thin par défaut)
|
2456
2745
|
-x # active le mutex lock (off par défaut)
|
2457
2746
|
```
|
@@ -2462,40 +2751,45 @@ Les versions suivantes de Ruby sont officiellement supportées :
|
|
2462
2751
|
|
2463
2752
|
<dl>
|
2464
2753
|
<dt>Ruby 1.8.7</dt>
|
2465
|
-
<dd>
|
2466
|
-
|
2467
|
-
|
2468
|
-
|
2469
|
-
|
2470
|
-
|
2471
|
-
version 1.8.6, vous devez revenir à Sinatra 1.2 qui continuera à recevoir
|
2472
|
-
des corrections de bugs tant que Sinatra 1.4.0 ne sera pas livré.</dd>
|
2754
|
+
<dd>
|
2755
|
+
1.8.7 est complètement supporté, toutefois si rien ne vous en empêche,
|
2756
|
+
nous vous recommandons de faire une mise à jour ou bien de passer à JRuby
|
2757
|
+
ou Rubinius. Le support de Ruby 1.8.7 ne sera pas supprimé avant la sortie
|
2758
|
+
de Sinatra 2.0. Ruby 1.8.6 n’est plus supporté.
|
2759
|
+
</dd>
|
2473
2760
|
|
2474
2761
|
<dt>Ruby 1.9.2</dt>
|
2475
|
-
<dd>
|
2476
|
-
|
2477
|
-
|
2478
|
-
|
2479
|
-
|
2762
|
+
<dd>
|
2763
|
+
1.9.2 est totalement supporté. N’utilisez pas 1.9.2p0 car il provoque des
|
2764
|
+
erreurs de segmentation à l’exécution de Sinatra. Son support continuera
|
2765
|
+
au minimum jusqu’à la sortie de Sinatra 1.5.
|
2766
|
+
</dd>
|
2480
2767
|
|
2481
2768
|
<dt>Ruby 1.9.3</dt>
|
2482
|
-
<dd>
|
2483
|
-
|
2484
|
-
|
2769
|
+
<dd>
|
2770
|
+
1.9.3 est totalement supporté et recommandé. Nous vous rappelons que passer
|
2771
|
+
à 1.9.3 depuis une version précédente annulera toutes les sessions. 1.9.3
|
2772
|
+
sera supporté jusqu'à la sortie de Sinatra 2.0.
|
2773
|
+
</dd>
|
2485
2774
|
|
2775
|
+
<dt>Ruby 2.0.0</dt>
|
2776
|
+
<dd>
|
2777
|
+
2.0.0 est totalement supporté et recommandé. L'abandon de son support
|
2778
|
+
officiel n'est pas à l'ordre du jour.
|
2779
|
+
</dd>
|
2486
2780
|
|
2487
2781
|
<dt>Rubinius</dt>
|
2488
|
-
<dd>
|
2489
|
-
|
2490
|
-
|
2782
|
+
<dd>
|
2783
|
+
Rubinius est officiellement supporté (Rubinius >= 2.x). Un <tt>gem install
|
2784
|
+
puma</tt> est recommandé.
|
2785
|
+
</dd>
|
2491
2786
|
|
2492
2787
|
<dt>JRuby</dt>
|
2493
|
-
<dd>
|
2494
|
-
|
2495
|
-
|
2496
|
-
|
2497
|
-
|
2498
|
-
n’affecte que RDiscount, Redcarpet and RedCloth pour l’instant.</dd>
|
2788
|
+
<dd>
|
2789
|
+
La dernière version stable de JRuby est officiellement supportée. Il est
|
2790
|
+
déconseillé d'utiliser des extensions C avec JRuby. Un <tt>gem install
|
2791
|
+
trinidad</tt> est recommandé.
|
2792
|
+
</dd>
|
2499
2793
|
</dl>
|
2500
2794
|
|
2501
2795
|
Nous gardons également un oeil sur les versions Ruby à venir.
|
@@ -2509,105 +2803,107 @@ sont malgré tout connues pour permettre de faire fonctionner Sinatra :
|
|
2509
2803
|
* Ruby 1.9.0 et 1.9.1 (mais nous déconseillons leur utilisation)
|
2510
2804
|
|
2511
2805
|
Le fait de ne pas être officiellement supporté signifie que si quelque chose
|
2512
|
-
ne fonctionne pas
|
2806
|
+
ne fonctionne pas sur cette plateforme uniquement alors c'est un problème de la
|
2513
2807
|
plateforme et pas un bug de Sinatra.
|
2514
2808
|
|
2515
2809
|
Nous lançons également notre intégration continue (CI) avec ruby-head (la
|
2516
|
-
future 2.
|
2517
|
-
|
2518
|
-
seront supportées.
|
2810
|
+
future 2.1.0), mais nous ne pouvont rien garantir étant donné les évolutions
|
2811
|
+
continuelles. La version 2.1.0 devrait être totalement supportée.
|
2519
2812
|
|
2520
2813
|
Sinatra devrait fonctionner sur n'importe quel système d'exploitation
|
2521
|
-
|
2814
|
+
supporté par l'implémentation Ruby choisie.
|
2815
|
+
|
2816
|
+
Si vous utilisez MacRuby, vous devriez `gem install control_tower`.
|
2522
2817
|
|
2523
|
-
Il n'est pas possible d'utiliser Sinatra sur Cardinal, SmallRuby,
|
2818
|
+
Il n'est pas possible d'utiliser Sinatra sur Cardinal, SmallRuby, BlueRuby ou
|
2524
2819
|
toute version de Ruby antérieure à 1.8.7 à l'heure actuelle.
|
2525
2820
|
|
2526
2821
|
## Essuyer les plâtres
|
2527
2822
|
|
2528
|
-
Si vous
|
2529
|
-
|
2823
|
+
Si vous souhaitez tester la toute dernière version de Sinatra, n'hésitez pas
|
2824
|
+
à faire tourner votre application sur la branche master, celle-ci devrait être
|
2530
2825
|
stable.
|
2531
2826
|
|
2532
|
-
|
2533
|
-
|
2827
|
+
Pour cela, la méthode la plus simple est d'installer une gem de prerelease que
|
2828
|
+
nous publions de temps en temps :
|
2534
2829
|
|
2535
|
-
```
|
2536
|
-
|
2830
|
+
``` shell
|
2831
|
+
gem install sinatra --pre
|
2537
2832
|
```
|
2833
|
+
Ce qui permet de bénéficier des toutes dernières fonctionnalités.
|
2538
2834
|
|
2539
|
-
|
2835
|
+
### Installer avec Bundler
|
2540
2836
|
|
2541
|
-
|
2837
|
+
Il est cependant conseillé de passer par [Bundler](http://gembundler.com/) pour
|
2838
|
+
faire tourner votre application avec la dernière version de Sinatra.
|
2542
2839
|
|
2543
|
-
|
2544
|
-
Sinatra, [Bundler](http://gembundler.com/) est recommandé.
|
2840
|
+
Pour commencer, installez bundler si nécessaire :
|
2545
2841
|
|
2546
|
-
|
2547
|
-
|
2548
|
-
```bash
|
2549
|
-
$ gem install bundler
|
2842
|
+
``` shell
|
2843
|
+
gem install bundler
|
2550
2844
|
```
|
2551
2845
|
|
2552
|
-
Ensuite, dans le dossier de votre projet
|
2846
|
+
Ensuite, créez un fichier `Gemfile` dans le dossier de votre projet :
|
2553
2847
|
|
2554
|
-
```ruby
|
2555
|
-
source
|
2556
|
-
gem 'sinatra', :
|
2848
|
+
``` ruby
|
2849
|
+
source 'https://rubygems.org'
|
2850
|
+
gem 'sinatra', :github => "sinatra/sinatra"
|
2557
2851
|
|
2558
2852
|
# autres dépendances
|
2559
|
-
gem 'haml' # par exemple
|
2560
|
-
gem 'activerecord', '~> 3.0' #
|
2561
|
-
# de ActiveRecord 3.x
|
2853
|
+
gem 'haml' # si par exemple vous utilisez haml
|
2854
|
+
gem 'activerecord', '~> 3.0' # au cas où vous auriez besoin de ActiveRecord 3.x
|
2562
2855
|
```
|
2563
2856
|
|
2564
|
-
Notez que vous
|
2565
|
-
ce fichier
|
2857
|
+
Notez que vous devez lister toutes les dépendances de votre application dans
|
2858
|
+
ce fichier `Gemfile`. Les dépendances directes de Sinatra (Rack et Tilt) seront
|
2566
2859
|
automatiquement téléchargées et ajoutées par Bundler.
|
2567
2860
|
|
2568
|
-
|
2861
|
+
Vous pouvez alors lancer votre application de la façon suivante :
|
2569
2862
|
|
2570
|
-
```
|
2571
|
-
|
2863
|
+
``` shell
|
2864
|
+
bundle exec ruby myapp.rb
|
2572
2865
|
```
|
2573
2866
|
|
2574
|
-
###
|
2867
|
+
### Faire un clone local
|
2575
2868
|
|
2576
|
-
|
2577
|
-
`sinatra/lib`
|
2869
|
+
Si vous ne souhaitez pas employer Bundler, vous pouvez cloner Sinatra en local
|
2870
|
+
dans votre projet et démarrez votre application avec le dossier `sinatra/lib`
|
2871
|
+
dans le `$LOAD_PATH` :
|
2578
2872
|
|
2579
|
-
```
|
2580
|
-
|
2581
|
-
|
2582
|
-
|
2873
|
+
``` shell
|
2874
|
+
cd myapp
|
2875
|
+
git clone git://github.com/sinatra/sinatra.git
|
2876
|
+
ruby -I sinatra/lib myapp.rb
|
2877
|
+
```
|
2583
2878
|
|
2584
|
-
|
2879
|
+
Et de temps en temps, vous devrez récupérer la dernière version du code source
|
2880
|
+
de Sinatra :
|
2585
2881
|
|
2586
|
-
```
|
2587
|
-
|
2588
|
-
|
2882
|
+
``` shell
|
2883
|
+
cd myapp/sinatra
|
2884
|
+
git pull
|
2589
2885
|
```
|
2590
2886
|
|
2591
|
-
###
|
2887
|
+
### Installer globalement
|
2592
2888
|
|
2593
|
-
|
2889
|
+
Une dernière méthode consiste à construire la gem vous-même :
|
2594
2890
|
|
2595
|
-
```
|
2596
|
-
|
2597
|
-
|
2598
|
-
|
2599
|
-
|
2891
|
+
``` shell
|
2892
|
+
git clone git://github.com/sinatra/sinatra.git
|
2893
|
+
cd sinatra
|
2894
|
+
rake sinatra.gemspec
|
2895
|
+
rake install
|
2600
2896
|
```
|
2601
2897
|
|
2602
|
-
Si vous installez les gems en tant que
|
2898
|
+
Si vous installez les gems en tant que root, vous devez encore faire un :
|
2603
2899
|
|
2604
|
-
```
|
2605
|
-
|
2900
|
+
``` shell
|
2901
|
+
sudo rake install
|
2606
2902
|
```
|
2607
2903
|
|
2608
2904
|
## Versions
|
2609
2905
|
|
2610
|
-
Sinatra se conforme aux
|
2906
|
+
Sinatra se conforme aux [versions sémantiques](http://semver.org/), aussi bien
|
2611
2907
|
SemVer que SemVerTag.
|
2612
2908
|
|
2613
2909
|
## Mais encore
|
@@ -2618,11 +2914,10 @@ SemVer que SemVerTag.
|
|
2618
2914
|
bug ? Besoin d'aide ? Vous avez un patch ?
|
2619
2915
|
* [Suivi des problèmes](http://github.com/sinatra/sinatra/issues)
|
2620
2916
|
* [Twitter](http://twitter.com/sinatra)
|
2621
|
-
* [Mailing List]
|
2622
|
-
*
|
2623
|
-
* [IRC : #sinatra](irc://chat.freenode.net/#sinatra) on http://freenode.net
|
2917
|
+
* [Mailing List](http://groups.google.com/group/sinatrarb/topics)
|
2918
|
+
* IRC : [#sinatra](irc://chat.freenode.net/#sinatra) sur http://freenode.net
|
2624
2919
|
* [Sinatra Book](http://sinatra-book.gittr.com) Tutoriels et recettes
|
2625
|
-
* [Sinatra Recipes](http://recipes.sinatrarb.com/) trucs et astuces rédigés par
|
2920
|
+
* [Sinatra Recipes](http://recipes.sinatrarb.com/) trucs et astuces rédigés par
|
2626
2921
|
la communauté
|
2627
2922
|
* Documentation API de la [dernière version](http://rubydoc.info/gems/sinatra)
|
2628
2923
|
ou du [HEAD courant](http://rubydoc.info/github/sinatra/sinatra) sur
|