sinatra 1.3.0.a → 1.3.0.b
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sinatra might be problematic. Click here for more details.
- data/CHANGES +26 -0
- data/Gemfile +1 -0
- data/README.de.rdoc +103 -39
- data/README.es.rdoc +69 -23
- data/README.fr.rdoc +128 -49
- data/README.rdoc +67 -23
- data/README.ru.rdoc +177 -158
- data/lib/sinatra/base.rb +76 -31
- data/lib/sinatra/showexceptions.rb +1 -1
- data/sinatra.gemspec +2 -3
- data/test/delegator_test.rb +20 -1
- data/test/helpers_test.rb +23 -1
- data/test/routing_test.rb +90 -3
- data/test/templates_test.rb +1 -1
- metadata +3 -4
- data/test/hello.mab +0 -1
data/CHANGES
CHANGED
@@ -15,11 +15,37 @@
|
|
15
15
|
classic style) than `Sinatra::Application` by setting `Delegator.target`.
|
16
16
|
This was mainly introduced to ease testing. (Konstantin Haase)
|
17
17
|
|
18
|
+
* Added `request.accept?` and `request.preferred_type` to ease dealing with
|
19
|
+
`Accept` headers. (Konstantin Haase)
|
20
|
+
|
18
21
|
= 1.2.2 / Not Yet Released
|
19
22
|
|
23
|
+
* The `:provides => :js` condition now matches both `application/javascript`
|
24
|
+
and `text/javascript`. The `:provides => :xml` condition now matches both
|
25
|
+
`application/xml` and `text/xml`. The `Content-Type` header is set
|
26
|
+
accordingly. If the client accepts both, the `application/*` version is
|
27
|
+
preferred, since the `text/*` versions are deprecated. (Konstantin Haase)
|
28
|
+
|
29
|
+
* The `provides` condition now handles wildcards in `Accept` headers correctly.
|
30
|
+
Thus `:provides => :html` matches `text/html`, `text/*` and `*/*`.
|
31
|
+
(Konstantin Haase)
|
32
|
+
|
33
|
+
* When parsing `Accept` headers, `Content-Type` preferences are honored
|
34
|
+
according to RFC 2616 section 14.1. (Konstantin Haase)
|
35
|
+
|
20
36
|
* URIs passed to the `url` helper or `redirect` may now use any schema to be
|
21
37
|
identified as absolute URIs, not only `http` or `https`. (Konstantin Haase)
|
22
38
|
|
39
|
+
* Handles `Content-Type` strings that already contain parameters correctly in
|
40
|
+
`content_type` (example: `content_type "text/plain; charset=utf-16"`).
|
41
|
+
(Konstantin Haase)
|
42
|
+
|
43
|
+
* If a route with an empty pattern is defined (`get("") { ... }`) requests with
|
44
|
+
an empty path info match this route instead of "/". (Konstantin Haase)
|
45
|
+
|
46
|
+
* In development environment, when running under a nested path, the image URIs
|
47
|
+
on the error pages are set properly. (Konstantin Haase)
|
48
|
+
|
23
49
|
= 1.2.1 / 2011-03-17
|
24
50
|
|
25
51
|
* Use a generated session secret when using `enable :sessions`. (Konstantin
|
data/Gemfile
CHANGED
data/README.de.rdoc
CHANGED
@@ -851,6 +851,11 @@ teilen:
|
|
851
851
|
|
852
852
|
set :session_secret, 'super secret'
|
853
853
|
|
854
|
+
Zur weiteren Konfiguration kann man einen Hash mit Optionen in den +sessions+
|
855
|
+
Einstellungen ablegen.
|
856
|
+
|
857
|
+
set :sessions, :domain => 'foo.com'
|
858
|
+
|
854
859
|
|
855
860
|
== Anhalten
|
856
861
|
|
@@ -955,6 +960,31 @@ Vergleichbar mit +body+ lassen sich auch Status-Code und Header setzen:
|
|
955
960
|
Genau wie bei +body+ liest ein Aufrufen von +headers+ oder +status+ ohne
|
956
961
|
Argumente den aktuellen Wert aus.
|
957
962
|
|
963
|
+
=== Logger
|
964
|
+
|
965
|
+
Im Geltungsbereich eines Request stellt die +logger+ Helfer-Methode eine
|
966
|
+
+Logger+ Instanz zur Verfügung:
|
967
|
+
|
968
|
+
get '/' do
|
969
|
+
logger.info "es passiert gerade etwas"
|
970
|
+
# ...
|
971
|
+
end
|
972
|
+
|
973
|
+
Der Logger übernimmt dabei automatisch alle im Rack-Handler eingestellten Log-
|
974
|
+
Vorgaben. Ist Loggen ausgeschaltet, gibt die Methode ein Leerobjekt zurück.
|
975
|
+
In den Routen und Filtern muss man sich also nicht weiter darum kümmern.
|
976
|
+
|
977
|
+
|
978
|
+
Beachte, dass das Loggen standardmäßig nur für <tt>Sinatra::Application</tt>
|
979
|
+
voreingestellt ist. Wird über <tt>Sinatra::Base</tt> vererbt, muss es erst
|
980
|
+
aktiviert werden:
|
981
|
+
|
982
|
+
class MyApp < Sinatra::Base
|
983
|
+
configure(:production, :development) do
|
984
|
+
enable :logging
|
985
|
+
end
|
986
|
+
end
|
987
|
+
|
958
988
|
|
959
989
|
== Mime-Types
|
960
990
|
|
@@ -1073,29 +1103,33 @@ zugegriffen werden:
|
|
1073
1103
|
|
1074
1104
|
# App läuft unter http://example.com/example
|
1075
1105
|
get '/foo' do
|
1076
|
-
|
1077
|
-
request.
|
1078
|
-
request.
|
1079
|
-
request.
|
1080
|
-
request.
|
1081
|
-
request.
|
1082
|
-
request.
|
1083
|
-
request.
|
1084
|
-
request.
|
1085
|
-
request.
|
1086
|
-
request.
|
1087
|
-
request.
|
1088
|
-
request
|
1089
|
-
request.
|
1090
|
-
request.
|
1091
|
-
request.
|
1092
|
-
request
|
1093
|
-
request.
|
1094
|
-
request.
|
1095
|
-
request.
|
1096
|
-
request.
|
1097
|
-
request.
|
1098
|
-
|
1106
|
+
t = %w[text/css text/html application/javascript]
|
1107
|
+
request.accept # ['text/html', '*/*']
|
1108
|
+
request.accept? 'text/xml' # true
|
1109
|
+
request.preferred_type(t) # 'text/html'
|
1110
|
+
request.body # Request-Body des Client (siehe unten)
|
1111
|
+
request.scheme # "http"
|
1112
|
+
request.script_name # "/example"
|
1113
|
+
request.path_info # "/foo"
|
1114
|
+
request.port # 80
|
1115
|
+
request.request_method # "GET"
|
1116
|
+
request.query_string # ""
|
1117
|
+
request.content_length # Länge des request.body
|
1118
|
+
request.media_type # Medientypus von request.body
|
1119
|
+
request.host # "example.com"
|
1120
|
+
request.get? # true (ähnliche Methoden für andere Verben)
|
1121
|
+
request.form_data? # false
|
1122
|
+
request["IRGENDEIN_HEADER"] # Wert von IRGENDEIN_HEADER header
|
1123
|
+
request.referrer # Der Referrer des Clients oder '/'
|
1124
|
+
request.user_agent # User-Agent (verwendet in der :agent Bedingung)
|
1125
|
+
request.cookies # Hash des Browser-Cookies
|
1126
|
+
request.xhr? # Ist das hier ein Ajax-Request?
|
1127
|
+
request.url # "http://example.com/example/foo"
|
1128
|
+
request.path # "/example/foo"
|
1129
|
+
request.ip # IP-Adresse des Clients
|
1130
|
+
request.secure? # false (true wenn SSL)
|
1131
|
+
request.forwarded? # true (Wenn es hinter einem Reverse-Proxy verwendet wird)
|
1132
|
+
request.env # vollständiger env-Hash von Rack übergeben
|
1099
1133
|
end
|
1100
1134
|
|
1101
1135
|
Manche Optionen, wie etwa <tt>script_name</tt> oder <tt>path_info</tt>, sind
|
@@ -1292,10 +1326,7 @@ Diese Einstellungen sind über +settings+ erreichbar:
|
|
1292
1326
|
[public] Das öffentliche Verzeichnis, aus dem Daten zur Verfügung
|
1293
1327
|
gestellt werden können.
|
1294
1328
|
|
1295
|
-
[reload_templates]
|
1296
|
-
werden sollen oder nicht. Unter Ruby 1.8.6 ist es im
|
1297
|
-
Entwicklungsmodus eingeschaltet (um einen Fehler in Ruby
|
1298
|
-
auszugleichen, der ein Speicherleck verursacht).
|
1329
|
+
[reload_templates] Im development-Modus aktiviert.
|
1299
1330
|
|
1300
1331
|
[root] Wurzelverzeichnis des Projekts.
|
1301
1332
|
|
@@ -1638,6 +1669,47 @@ andere Sinatra-Anwendung handeln, es kann jede andere Rack-Anwendung sein
|
|
1638
1669
|
get('/') { "Hallo #{session['user_name']}." }
|
1639
1670
|
end
|
1640
1671
|
|
1672
|
+
=== Dynamische Applikationserstellung
|
1673
|
+
|
1674
|
+
Manche Situationen erfordern die Erstellung neuer Applikationen zur Laufzeit,
|
1675
|
+
ohne dass sie einer Konstanten zugeordnet werden. Dies lässt sich mit
|
1676
|
+
`Sinatra.new` erreichen:
|
1677
|
+
|
1678
|
+
require 'sinatra/base'
|
1679
|
+
my_app = Sinatra.new { get('/') { "hallo" } }
|
1680
|
+
my_app.run!
|
1681
|
+
|
1682
|
+
|
1683
|
+
Die Applikation kann mit Hilfe eines optionalen Parameters erstellt werden:
|
1684
|
+
|
1685
|
+
require 'sinatra/base'
|
1686
|
+
|
1687
|
+
controller = Sinatra.new do
|
1688
|
+
enable :logging
|
1689
|
+
helpers MyHelpers
|
1690
|
+
end
|
1691
|
+
|
1692
|
+
map('/a') do
|
1693
|
+
run Sinatra.new(controller) { get('/') { 'a' } }
|
1694
|
+
end
|
1695
|
+
|
1696
|
+
map('/b') do
|
1697
|
+
run Sinatra.new(controller) { get('/') { 'b' } }
|
1698
|
+
end
|
1699
|
+
|
1700
|
+
Das ist besonders dann interessant, wenn Sinatra-Erweiterungen getestet werden
|
1701
|
+
oder Sinatra in einer Bibliothek Verwendung findet.
|
1702
|
+
|
1703
|
+
Ebenso lassen sich damit hervorragend Sinatra-Middlewares erstellen:
|
1704
|
+
|
1705
|
+
require 'sinatra/base'
|
1706
|
+
|
1707
|
+
use Sinatra do
|
1708
|
+
get('/') { ... }
|
1709
|
+
end
|
1710
|
+
|
1711
|
+
run RailsProject::Application
|
1712
|
+
|
1641
1713
|
|
1642
1714
|
== Geltungsbereich und Bindung
|
1643
1715
|
|
@@ -1672,6 +1744,7 @@ Im Anwendungs-Scope befindet man sich:
|
|
1672
1744
|
* In Methoden, die von Erweiterungen definiert werden.
|
1673
1745
|
* Im Block, der an +helpers+ übergeben wird.
|
1674
1746
|
* In Procs und Blöcken, die an +set+ übergeben werden.
|
1747
|
+
* Der an <tt>Sinatra.new</tt> übergebene Block
|
1675
1748
|
|
1676
1749
|
Auf das Scope-Objekt (die Klasse) kann wie folgt zugegriffen werden:
|
1677
1750
|
|
@@ -1751,20 +1824,8 @@ Die Optionen sind:
|
|
1751
1824
|
|
1752
1825
|
== Systemanforderungen
|
1753
1826
|
|
1754
|
-
Es wird empfohlen, Sinatra unter Ruby 1.8.7, 1.9.2, JRuby oder Rubinius zu
|
1755
|
-
installieren.
|
1756
|
-
|
1757
1827
|
Die folgenden Versionen werden offiziell unterstützt:
|
1758
1828
|
|
1759
|
-
[ Ruby 1.8.6 ]
|
1760
|
-
Es wird nicht empfohlen, 1.8.6 für Sinatra einzusetzen. Trotzdem wird es
|
1761
|
-
offiziell bis Sinatra 1.3.0 unterstützt werden. RDoc- und CoffeeScript-
|
1762
|
-
Templates werden in dieser Version nicht unterstützt. 1.8.6 hat ein größeres
|
1763
|
-
Speicherleck in seiner Hash-Implementation, das von Sinatra-Versionen vor
|
1764
|
-
1.1.1 ausgelöst wird. Die aktuelle Version verhindert das zwar explizit, aber
|
1765
|
-
unter Einbußen in der Performance. Ebenso muss Sinatra mit Rack 1.1.x laufen,
|
1766
|
-
da Rack >= 1.2 Ruby 1.8.6 nicht mehr unterstützt.
|
1767
|
-
|
1768
1829
|
[ Ruby 1.8.7 ]
|
1769
1830
|
1.8.7 wird vollständig unterstützt, aber solange nichts dagegen spricht,
|
1770
1831
|
wird ein Update auf 1.9.2 oder ein Umstieg auf JRuby/Rubinius empfohlen.
|
@@ -1786,6 +1847,8 @@ Die folgenden Versionen werden offiziell unterstützt:
|
|
1786
1847
|
Unterstützung für C-Erweiterungen sind zur Zeit noch experimenteller Natur,
|
1787
1848
|
betrifft im Moment aber nur RDiscount.
|
1788
1849
|
|
1850
|
+
<b>Ruby 1.8.6 wird nicht weiter unterstützt.</b>
|
1851
|
+
|
1789
1852
|
Weiterhin werden wir auf kommende Ruby-Versionen ein Auge haben.
|
1790
1853
|
|
1791
1854
|
Die nachfolgend aufgeführten Ruby-Implementationen werden offiziell nicht von
|
@@ -1794,6 +1857,7 @@ Sinatra unterstützt, funktionieren aber normalerweise:
|
|
1794
1857
|
* Ältere Versionen von JRuby und Rubinius
|
1795
1858
|
* MacRuby, Maglev, IronRuby
|
1796
1859
|
* Ruby 1.9.0 und 1.9.1
|
1860
|
+
* Ruby 1.8.6 mit {backports}[https://github.com/marcandre/backports/#readme]
|
1797
1861
|
|
1798
1862
|
Nicht offiziell unterstützt bedeutet, dass wenn Sachen nicht funktionieren,
|
1799
1863
|
wir davon ausgehen, dass es nicht an Sinatra sondern an der jeweiligen
|
data/README.es.rdoc
CHANGED
@@ -1129,29 +1129,33 @@ petición (filtros, rutas y manejadores de errores) a través del método
|
|
1129
1129
|
|
1130
1130
|
# app corriendo en http://ejemplo.com/ejemplo
|
1131
1131
|
get '/foo' do
|
1132
|
-
|
1133
|
-
request.
|
1134
|
-
request.
|
1135
|
-
request.
|
1136
|
-
request.
|
1137
|
-
request.
|
1138
|
-
request.
|
1139
|
-
request.
|
1140
|
-
request.
|
1141
|
-
request.
|
1142
|
-
request.
|
1143
|
-
request.
|
1144
|
-
request
|
1145
|
-
request.
|
1146
|
-
request.
|
1147
|
-
request.
|
1148
|
-
request
|
1149
|
-
request.
|
1150
|
-
request.
|
1151
|
-
request.
|
1152
|
-
request.
|
1153
|
-
request.
|
1154
|
-
|
1132
|
+
t = %w[text/css text/html application/javascript]
|
1133
|
+
request.accept # ['text/html', '*/*']
|
1134
|
+
request.accept? 'text/xml' # true
|
1135
|
+
request.preferred_type(t) # 'text/html'
|
1136
|
+
request.body # cuerpo de la petición enviado por el cliente (ver más abajo)
|
1137
|
+
request.scheme # "http"
|
1138
|
+
request.script_name # "/ejemplo"
|
1139
|
+
request.path_info # "/foo"
|
1140
|
+
request.port # 80
|
1141
|
+
request.request_method # "GET"
|
1142
|
+
request.query_string # ""
|
1143
|
+
request.content_length # longitud de request.body
|
1144
|
+
request.media_type # tipo de medio de request.body
|
1145
|
+
request.host # "ejemplo.com"
|
1146
|
+
request.get? # true (hay métodos análogos para los otros verbos)
|
1147
|
+
request.form_data? # false
|
1148
|
+
request["UNA_CABECERA"] # valor de la cabecera UNA_CABECERA
|
1149
|
+
request.referrer # la referencia del cliente o '/'
|
1150
|
+
request.user_agent # user agent (usado por la condición :agent)
|
1151
|
+
request.cookies # hash de las cookies del browser
|
1152
|
+
request.xhr? # es una petición ajax?
|
1153
|
+
request.url # "http://ejemplo.com/ejemplo/foo"
|
1154
|
+
request.path # "/ejemplo/foo"
|
1155
|
+
request.ip # dirección IP del cliente
|
1156
|
+
request.secure? # false (sería true sobre ssl)
|
1157
|
+
request.forwarded? # true (si se está corriendo atrás de un proxy inverso)
|
1158
|
+
requuest.env # hash de entorno directamente entregado por Rack
|
1155
1159
|
end
|
1156
1160
|
|
1157
1161
|
Algunas opciones, como <tt>script_name</tt> o <tt>path_info</tt> pueden
|
@@ -1661,6 +1665,48 @@ aplicación basada en Rack (Rails/Ramaze/Camping/...):
|
|
1661
1665
|
get('/') { "Hola #{session['nombre_de_usuario']}." }
|
1662
1666
|
end
|
1663
1667
|
|
1668
|
+
=== Creación Dinámica de Aplicaciones
|
1669
|
+
|
1670
|
+
Puede que en algunas ocasiones quieras crear nuevas aplicaciones en
|
1671
|
+
tiempo de ejecución sin tener que asignarlas a una constante. Para
|
1672
|
+
esto tenés `Sinatra.new`:
|
1673
|
+
|
1674
|
+
require 'sinatra/base'
|
1675
|
+
mi_app = Sinatra.new { get('/') { "hola" } }
|
1676
|
+
mi_app.run!
|
1677
|
+
|
1678
|
+
Acepta como argumento opcional una aplicación desde la que se
|
1679
|
+
heredará:
|
1680
|
+
|
1681
|
+
require 'sinatra/base'
|
1682
|
+
|
1683
|
+
controller = Sinatra.new do
|
1684
|
+
enable :logging
|
1685
|
+
helpers MisHelpers
|
1686
|
+
end
|
1687
|
+
|
1688
|
+
map('/a') do
|
1689
|
+
run Sinatra.new(controller) { get('/') { 'a' } }
|
1690
|
+
end
|
1691
|
+
|
1692
|
+
map('/b') do
|
1693
|
+
run Sinatra.new(controller) { get('/') { 'b' } }
|
1694
|
+
end
|
1695
|
+
|
1696
|
+
Construir aplicaciones de esta forma resulta especialmente útil para
|
1697
|
+
testear extensiones Sinatra o para usar Sinatra en tus librerías.
|
1698
|
+
|
1699
|
+
Por otro lado, hace extremadamente sencillo usar Sinatra como
|
1700
|
+
middleware:
|
1701
|
+
|
1702
|
+
require 'sinatra/base'
|
1703
|
+
|
1704
|
+
use Sinatra do
|
1705
|
+
get('/') { ... }
|
1706
|
+
end
|
1707
|
+
|
1708
|
+
run ProyectoRails::Application
|
1709
|
+
|
1664
1710
|
== Ámbitos y Ligaduras
|
1665
1711
|
|
1666
1712
|
El ámbito en el que te encontrás determina que métodos y variables están
|
data/README.fr.rdoc
CHANGED
@@ -36,6 +36,10 @@ Chaque route est associée à un bloc:
|
|
36
36
|
end
|
37
37
|
|
38
38
|
put '/' do
|
39
|
+
.. remplacer quelque chose ..
|
40
|
+
end
|
41
|
+
|
42
|
+
patch '/' do
|
39
43
|
.. changer quelque chose ..
|
40
44
|
end
|
41
45
|
|
@@ -842,6 +846,19 @@ choix comme vous le feriez pour n'importe quel autre +middleware+ :
|
|
842
846
|
session[:valeur] = params[:valeur]
|
843
847
|
end
|
844
848
|
|
849
|
+
Pour renforcer la sécurité, les données de session dans le cookie sont signées
|
850
|
+
avec une clé secrète de session. Une clé secrète est générée pour vous au
|
851
|
+
hasard par Sinatra. Toutefois, comme cette clé change à chaque démarrage de
|
852
|
+
votre application, vous pouvez définir cette clé vous-même afin que toutes
|
853
|
+
les instances de votre application la partage:
|
854
|
+
|
855
|
+
set :session_secret, 'super secret'
|
856
|
+
|
857
|
+
Si vous souhaitez avoir plus de contrôle, vous pouvez également enregistrer un
|
858
|
+
+hash+ avec des options lors de la configuration de +sessions+:
|
859
|
+
|
860
|
+
set :sessions, :domain => 'foo.com'
|
861
|
+
|
845
862
|
== Halt
|
846
863
|
|
847
864
|
Pour arrêter immédiatement la requête dans un filtre ou un gestionnaire de
|
@@ -948,6 +965,31 @@ retour et les entêtes :
|
|
948
965
|
Comme +body+, +headers+ et +status+ peuvent être utilisés sans arguments
|
949
966
|
pour accéder à leurs valeurs.
|
950
967
|
|
968
|
+
=== Journalisation (Logging)
|
969
|
+
|
970
|
+
Dans le contexte de la requête, la méthode utilitaire +logger+ expose une
|
971
|
+
instance de +logger+:
|
972
|
+
|
973
|
+
get '/' do
|
974
|
+
logger.info "chargement des données"
|
975
|
+
# ...
|
976
|
+
end
|
977
|
+
|
978
|
+
Ce +logger+ va automatiquement prendre en compte les paramètres de
|
979
|
+
configuration pour la journalisation de votre gestionnaire Rack. Si la
|
980
|
+
journalisation est désactivée, cette méthode renverra un objet factice et
|
981
|
+
vous n'avez pas à vous en inquiéter dans vos routes en le filtrant.
|
982
|
+
|
983
|
+
Notez que la journalisation est seulement activée par défaut pour
|
984
|
+
<tt>Sinatra::Application</tt>, donc si vous héritez de <tt>Sinatra::Base</tt>,
|
985
|
+
vous aurez à l'activer vous-même:
|
986
|
+
|
987
|
+
class MonApp < Sinatra::Base
|
988
|
+
configure(:production, :development) do
|
989
|
+
enable :logging
|
990
|
+
end
|
991
|
+
end
|
992
|
+
|
951
993
|
=== Types Mime
|
952
994
|
|
953
995
|
Quand vous utilisez <tt>send_file</tt> ou des fichiers statiques, vous
|
@@ -1121,32 +1163,36 @@ de la requête (filtres, routes, gestionnaires d'erreur) au moyen de la méthode
|
|
1121
1163
|
|
1122
1164
|
# application tournant à l'adresse http://exemple.com/exemple
|
1123
1165
|
get '/foo' do
|
1124
|
-
|
1125
|
-
|
1126
|
-
request.
|
1127
|
-
request.
|
1128
|
-
request.
|
1129
|
-
|
1130
|
-
request.
|
1131
|
-
request.
|
1132
|
-
request.
|
1133
|
-
request.
|
1134
|
-
request.
|
1135
|
-
request.
|
1136
|
-
|
1137
|
-
request.
|
1138
|
-
request
|
1139
|
-
request.
|
1140
|
-
|
1141
|
-
request.
|
1142
|
-
request
|
1143
|
-
request.
|
1144
|
-
request.
|
1145
|
-
request.
|
1146
|
-
request.
|
1147
|
-
request.
|
1148
|
-
request.
|
1149
|
-
|
1166
|
+
t = %w[text/css text/html application/javascript]
|
1167
|
+
request.accept # ['text/html', '*/*']
|
1168
|
+
request.accept? 'text/xml' # true
|
1169
|
+
request.preferred_type(t) # 'text/html'
|
1170
|
+
request.body # corps de la requête envoyée par le client
|
1171
|
+
# (voir ci-dessous)
|
1172
|
+
request.scheme # "http"
|
1173
|
+
request.script_name # "/exemple"
|
1174
|
+
request.path_info # "/foo"
|
1175
|
+
request.port # 80
|
1176
|
+
request.request_method # "GET"
|
1177
|
+
request.query_string # ""
|
1178
|
+
request.content_length # taille de request.body
|
1179
|
+
request.media_type # type de média pour request.body
|
1180
|
+
request.host # "exemple.com"
|
1181
|
+
request.get? # true (méthodes similaires pour les autres
|
1182
|
+
# verbes HTTP)
|
1183
|
+
request.form_data? # false
|
1184
|
+
request["UN_ENTETE"] # valeur de l'entête UN_ENTETE
|
1185
|
+
request.referer # référant du client ou '/'
|
1186
|
+
request.user_agent # user agent (utilisé par la condition :agent)
|
1187
|
+
request.cookies # tableau contenant les cookies du navigateur
|
1188
|
+
request.xhr? # requête AJAX ?
|
1189
|
+
request.url # "http://exemple.com/exemple/foo"
|
1190
|
+
request.path # "/exemple/foo"
|
1191
|
+
request.ip # adresse IP du client
|
1192
|
+
request.secure? # false
|
1193
|
+
request.forwarded? # vrai (si on est derrière un proxy inverse)
|
1194
|
+
request.env # tableau brut de l'environnement fourni par
|
1195
|
+
# Rack
|
1150
1196
|
end
|
1151
1197
|
|
1152
1198
|
Certaines options, telles que <tt>script_name</tt> ou <tt>path_info</tt>
|
@@ -1339,9 +1385,7 @@ Vous pouvez accéder à ces paramètres via <tt>settings</tt> :
|
|
1339
1385
|
[public] dossier duquel les fichiers publics sont servis
|
1340
1386
|
|
1341
1387
|
[reload_templates] si oui ou non les templates doivent être rechargés
|
1342
|
-
entre les requêtes. Activé en mode développement
|
1343
|
-
et sur Ruby 1.8.6 (pour compenser un bug Ruby
|
1344
|
-
occasionnant une fuite de mémoire).
|
1388
|
+
entre les requêtes. Activé en mode développement.
|
1345
1389
|
|
1346
1390
|
[root] dossier racine du projet.
|
1347
1391
|
|
@@ -1669,6 +1713,46 @@ application Sinatra, ou n'importe quelle application basée sur Rack
|
|
1669
1713
|
get('/') { "Bonjour #{session['nom_utilisateur']}." }
|
1670
1714
|
end
|
1671
1715
|
|
1716
|
+
=== Création dynamique d'applications
|
1717
|
+
|
1718
|
+
Il se peut que vous ayez besoin de créer une nouvelle application à l'exécution
|
1719
|
+
sans avoir à les assigner à une constante, vous pouvez le faire grâce à
|
1720
|
+
`Sinatra.new`:
|
1721
|
+
|
1722
|
+
require 'sinatra/base'
|
1723
|
+
mon_app = Sinatra.new { get('/') { "salut" } }
|
1724
|
+
mon_app.run!
|
1725
|
+
|
1726
|
+
L'application dont elle hérite peut être passé en argument optionnel:
|
1727
|
+
|
1728
|
+
require 'sinatra/base'
|
1729
|
+
|
1730
|
+
controleur = Sinatra.new do
|
1731
|
+
enable :logging
|
1732
|
+
helpers MyHelpers
|
1733
|
+
end
|
1734
|
+
|
1735
|
+
map('/a') do
|
1736
|
+
run Sinatra.new(controleur) { get('/') { 'a' } }
|
1737
|
+
end
|
1738
|
+
|
1739
|
+
map('/b') do
|
1740
|
+
run Sinatra.new(controleur) { get('/') { 'b' } }
|
1741
|
+
end
|
1742
|
+
|
1743
|
+
C'est notamment utile pour tester des extensions à Sinatra ou bien pour
|
1744
|
+
utiliser Sinatra dans votre propre bibliothèque.
|
1745
|
+
|
1746
|
+
Cela permet également d'utiliser très facilement Sinatra comme middleware:
|
1747
|
+
|
1748
|
+
require 'sinatra/base'
|
1749
|
+
|
1750
|
+
use Sinatra do
|
1751
|
+
get('/') { ... }
|
1752
|
+
end
|
1753
|
+
|
1754
|
+
run RailsProject::Application
|
1755
|
+
|
1672
1756
|
== Contextes et Binding
|
1673
1757
|
|
1674
1758
|
Le contexte dans lequel vous êtes détermine les méthodes et variables
|
@@ -1702,6 +1786,7 @@ Vous avez le binding du contexte de l'application dans:
|
|
1702
1786
|
* Les méthodes définies par les extensions
|
1703
1787
|
* Le bloc passé à `helpers`
|
1704
1788
|
* Les procs/blocs utilisés comme argument pour `set`
|
1789
|
+
* Le bloc passé à <tt>Sinatra.new</tt>
|
1705
1790
|
|
1706
1791
|
Vous pouvez atteindre ce contexte (donc la classe) de la façon suivante:
|
1707
1792
|
|
@@ -1776,21 +1861,8 @@ Les options sont:
|
|
1776
1861
|
|
1777
1862
|
== Configuration nécessaire
|
1778
1863
|
|
1779
|
-
Il est recommandé d'installer Sinatra sur Ruby 1.8.7, 1.9.2, JRuby ou
|
1780
|
-
Rubinius.
|
1781
|
-
|
1782
1864
|
Les versions suivantes de Ruby sont officiellement supportées :
|
1783
1865
|
|
1784
|
-
[ Ruby 1.8.6 ]
|
1785
|
-
Il n'est pas recommandé d'utiliser 1.8.6 pour Sinatra. Toutefois, ce sera
|
1786
|
-
officiellement supporté jusqu'à l'arrivée Sinatra 1.3.0. Les templates RDoc
|
1787
|
-
et CoffeeScript ne sont pas supportés par cette version de Ruby. 1.8.6
|
1788
|
-
contient un défaut majeur de fuite de mémoire dans l'implémentation de Hash,
|
1789
|
-
qui est déclenché par les versions de Sinatra antérieure à 1.1.1. La version
|
1790
|
-
actuelle prévient explicitement ce risque au prix de la performance. Vous
|
1791
|
-
devrez utiliser Rack 1.1.x dans la mesure où Rack >= 1.2 ne supporte plus
|
1792
|
-
1.8.6.
|
1793
|
-
|
1794
1866
|
[ Ruby 1.8.7 ]
|
1795
1867
|
1.8.7 est complètement supporté, toutefois si rien ne vous y retient, nous
|
1796
1868
|
vous recommandons de passer à 1.9.2 ou bien de passer à JRuby ou Rubinius.
|
@@ -1801,14 +1873,18 @@ Les versions suivantes de Ruby sont officiellement supportées :
|
|
1801
1873
|
réputé causer des erreurs de segmentation lorque Sinatra est utilisé.
|
1802
1874
|
|
1803
1875
|
[ Rubinius ]
|
1804
|
-
Rubinius est officiellement supporté (Rubinius >= 1.2.
|
1805
|
-
|
1876
|
+
Rubinius est officiellement supporté (Rubinius >= 1.2.3), tout fonctionne,
|
1877
|
+
y compris tous les langages de template.
|
1806
1878
|
|
1807
1879
|
[ JRuby ]
|
1808
|
-
JRuby est officiellement supporté (JRuby >= 1.
|
1880
|
+
JRuby est officiellement supporté (JRuby >= 1.6.0). Aucune anomalie avec
|
1809
1881
|
des bibliothèques de templates tierces ne sont connues. Toutefois, si vous
|
1810
1882
|
choisissez JRuby, alors tournez vous vers des gestionnaires Rack JRuby car
|
1811
|
-
le serveur Thin n'est pas
|
1883
|
+
le serveur Thin n'est pas complètement supporté par JRuby. Le support des
|
1884
|
+
extensions C dans JRuby est encore expérimental, ce qui n'affecte que
|
1885
|
+
RDiscount.
|
1886
|
+
|
1887
|
+
<b>Ruby 1.8.6 n'est plus supporté.</b>
|
1812
1888
|
|
1813
1889
|
Nous gardons également un oeil sur les versions Ruby à venir.
|
1814
1890
|
|
@@ -1816,15 +1892,18 @@ Les implémentations Ruby suivantes ne sont pas officiellement supportées mais
|
|
1816
1892
|
sont toujours connues comme permettant à Sinatra de fonctionner :
|
1817
1893
|
|
1818
1894
|
* Plus anciennes versions de JRuby et Rubinius
|
1819
|
-
* MacRuby
|
1820
|
-
* Maglev
|
1821
|
-
* IronRuby
|
1895
|
+
* MacRuby, Maglev, IronRuby
|
1822
1896
|
* Ruby 1.9.0 et 1.9.1
|
1897
|
+
* Ruby 1.8.6 avec {backports}[https://github.com/marcandre/backports/#readme]
|
1823
1898
|
|
1824
1899
|
Ne pas être officiellement supporté signifie que si les choses se passent mal
|
1825
1900
|
sur ces plateformes et non sur celles supportées, nous considérons que
|
1826
1901
|
l'anomalie est de le ressort, pas du nôtre.
|
1827
1902
|
|
1903
|
+
Nous faisons également notre intégration continue (CI) avec ruby-head (la
|
1904
|
+
future 1.9.3), mais nous ne pouvons rien garantir étant donné que c'est
|
1905
|
+
constant mouvement. Vous pouvez vous attendre à ce que 1.9.3p0 soit supporté.
|
1906
|
+
|
1828
1907
|
Sinatra devrait fonctionner sur n'importe quel système d'exploitation
|
1829
1908
|
supportant l'implémentation Ruby choisie.
|
1830
1909
|
|