sinatra 1.2.1 → 1.2.2
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 +28 -0
- data/README.de.rdoc +467 -395
- data/README.es.rdoc +56 -9
- data/README.pt-pt.rdoc +646 -0
- data/README.rdoc +40 -0
- data/Rakefile +14 -4
- data/lib/sinatra/base.rb +63 -25
- data/lib/sinatra/showexceptions.rb +1 -1
- data/sinatra.gemspec +3 -2
- data/test/encoding_test.rb +2 -2
- data/test/helpers_test.rb +62 -0
- data/test/routing_test.rb +90 -3
- metadata +198 -197
data/CHANGES
CHANGED
@@ -1,3 +1,31 @@
|
|
1
|
+
= 1.2.2 / 2011-04-08
|
2
|
+
|
3
|
+
* The `:provides => :js` condition now matches both `application/javascript`
|
4
|
+
and `text/javascript`. The `:provides => :xml` condition now matches both
|
5
|
+
`application/xml` and `text/xml`. The `Content-Type` header is set
|
6
|
+
accordingly. If the client accepts both, the `application/*` version is
|
7
|
+
preferred, since the `text/*` versions are deprecated. (Konstantin Haase)
|
8
|
+
|
9
|
+
* The `provides` condition now handles wildcards in `Accept` headers correctly.
|
10
|
+
Thus `:provides => :html` matches `text/html`, `text/*` and `*/*`.
|
11
|
+
(Konstantin Haase)
|
12
|
+
|
13
|
+
* When parsing `Accept` headers, `Content-Type` preferences are honored
|
14
|
+
according to RFC 2616 section 14.1. (Konstantin Haase)
|
15
|
+
|
16
|
+
* URIs passed to the `url` helper or `redirect` may now use any schema to be
|
17
|
+
identified as absolute URIs, not only `http` or `https`. (Konstantin Haase)
|
18
|
+
|
19
|
+
* Handles `Content-Type` strings that already contain parameters correctly in
|
20
|
+
`content_type` (example: `content_type "text/plain; charset=utf-16"`).
|
21
|
+
(Konstantin Haase)
|
22
|
+
|
23
|
+
* If a route with an empty pattern is defined (`get("") { ... }`) requests with
|
24
|
+
an empty path info match this route instead of "/". (Konstantin Haase)
|
25
|
+
|
26
|
+
* In development environment, when running under a nested path, the image URIs
|
27
|
+
on the error pages are set properly. (Konstantin Haase)
|
28
|
+
|
1
29
|
= 1.2.1 / 2011-03-17
|
2
30
|
|
3
31
|
* Use a generated session secret when using `enable :sessions`. (Konstantin
|
data/README.de.rdoc
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
= Sinatra
|
2
|
+
|
2
3
|
<i>Wichtig: Dieses Dokument ist eine Übersetzung aus dem Englischen und unter
|
3
|
-
Umständen nicht auf dem
|
4
|
+
Umständen nicht auf dem aktuellen Stand.</i>
|
4
5
|
|
5
6
|
Sinatra ist eine DSL, die das schnelle Erstellen von Webanwendungen in Ruby
|
6
|
-
mit
|
7
|
+
mit minimalem Aufwand ermöglicht:
|
7
8
|
|
8
9
|
# myapp.rb
|
9
10
|
require 'sinatra'
|
@@ -18,8 +19,9 @@ Einfach via +rubygems+ installieren und starten:
|
|
18
19
|
|
19
20
|
Die Seite kann nun unter http://localhost:4567 betrachtet werden.
|
20
21
|
|
21
|
-
Es wird empfohlen den Thin
|
22
|
-
den Sinatra, soweit vorhanden,
|
22
|
+
Es wird empfohlen, den Thin-Server via <tt>gem install thin</tt> zu
|
23
|
+
installieren, den Sinatra dann, soweit vorhanden, automatisch verwendet.
|
24
|
+
|
23
25
|
|
24
26
|
== Routen
|
25
27
|
|
@@ -47,7 +49,7 @@ definiert. Jeder dieser Routen wird ein Ruby-Block zugeordnet:
|
|
47
49
|
end
|
48
50
|
|
49
51
|
Die Routen werden in der Reihenfolge durchlaufen, in der sie definiert wurden.
|
50
|
-
Das erste
|
52
|
+
Das erste Routen-Muster, das mit dem Request übereinstimmt, wird ausgeführt.
|
51
53
|
|
52
54
|
Die Muster der Routen können benannte Parameter beinhalten, die über den
|
53
55
|
<tt>params</tt>-Hash zugänglich gemacht werden:
|
@@ -58,14 +60,14 @@ Die Muster der Routen können benannte Parameter beinhalten, die über den
|
|
58
60
|
"Hallo #{params[:name]}!"
|
59
61
|
end
|
60
62
|
|
61
|
-
Man kann auf diese auch mit
|
63
|
+
Man kann auf diese auch mit Block-Parametern zugreifen:
|
62
64
|
|
63
65
|
get '/hallo/:name' do |n|
|
64
66
|
"Hallo #{n}!"
|
65
67
|
end
|
66
68
|
|
67
|
-
|
68
|
-
<tt>params[:splat]</tt
|
69
|
+
Routen-Muster können auch mit Splat- oder Wildcard-Parametern über das
|
70
|
+
<tt>params[:splat]</tt>-Array angesprochen werden:
|
69
71
|
|
70
72
|
get '/sag/*/zu/*' do
|
71
73
|
# passt auf /sag/hallo/zu/welt
|
@@ -83,17 +85,18 @@ Routen mit regulären Ausdrücken sind auch möglich:
|
|
83
85
|
"Hallo, #{params[:captures].first}!"
|
84
86
|
end
|
85
87
|
|
86
|
-
Und auch hier
|
88
|
+
Und auch hier können Block-Parameter genutzt werden:
|
87
89
|
|
88
90
|
get %r{/hallo/([\w]+)} do |c|
|
89
91
|
"Hallo, #{c}!"
|
90
92
|
end
|
91
93
|
|
94
|
+
|
92
95
|
=== Bedingungen
|
93
96
|
|
94
97
|
An Routen können eine Vielzahl von Bedingungen angehängt werden, die erfüllt
|
95
98
|
sein müssen, damit der Block ausgeführt wird. Möglich wäre etwa eine
|
96
|
-
Einschränkung des User
|
99
|
+
Einschränkung des User-Agents:
|
97
100
|
|
98
101
|
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
|
99
102
|
"Du verwendest Songbird Version #{params[:agent][0]}"
|
@@ -117,7 +120,7 @@ Andere mitgelieferte Bedingungen sind +host_name+ und +provides+:
|
|
117
120
|
builder :feed
|
118
121
|
end
|
119
122
|
|
120
|
-
|
123
|
+
Es können auch andere Bedingungen relativ einfach hinzugefügt werden:
|
121
124
|
|
122
125
|
set(:probability) { |value| condition { rand <= value } }
|
123
126
|
|
@@ -129,25 +132,25 @@ Man kann auch relativ einfach eigene Bedingungen hinzufügen:
|
|
129
132
|
"Tut mir leid, verloren."
|
130
133
|
end
|
131
134
|
|
135
|
+
|
132
136
|
=== Rückgabewerte
|
133
137
|
|
134
|
-
Durch den Rückgabewert eines
|
135
|
-
festgelegt, der an den HTTP
|
136
|
-
weitergegeben wird. Im Normalfall handelt es sich hierbei, wie
|
137
|
-
|
138
|
-
|
138
|
+
Durch den Rückgabewert eines Routen-Blocks wird mindestens der Response-Body
|
139
|
+
festgelegt, der an den HTTP-Client, bzw. die nächste Rack-Middleware,
|
140
|
+
weitergegeben wird. Im Normalfall handelt es sich hierbei, wie in den
|
141
|
+
vorangehenden Beispielen zu sehen war, um einen String. Es werden allerdings
|
142
|
+
auch andere Werte akzeptiert.
|
139
143
|
|
140
|
-
|
141
|
-
Rack-Rückgabewert, einen
|
142
|
-
handelt:
|
144
|
+
Es kann jedes gültige Objekt zurückgegeben werden, bei dem es sich entweder um
|
145
|
+
einen Rack-Rückgabewert, einen Rack-Body oder einen HTTP-Status-Code handelt:
|
143
146
|
|
144
|
-
* Ein Array mit drei Elementen: <tt>[Status (Fixnum), Headers (Hash),
|
145
|
-
Body (
|
146
|
-
* Ein Array mit zwei Elementen: <tt>[Status (Fixnum), Response
|
147
|
-
#each)]</tt
|
148
|
-
* Ein Objekt, das auf <tt>#each</tt>
|
149
|
-
Block nur mit Strings als Übergabewerte aufruft.
|
150
|
-
* Ein Fixnum, das den Status
|
147
|
+
* Ein Array mit drei Elementen: <tt>[Status (Fixnum), Headers (Hash),
|
148
|
+
Response-Body (antwortet auf #each)]</tt>.
|
149
|
+
* Ein Array mit zwei Elementen: <tt>[Status (Fixnum), Response-Body (antwortet
|
150
|
+
auf #each)]</tt>.
|
151
|
+
* Ein Objekt, das auf <tt>#each</tt> antwortet und den an diese Methode
|
152
|
+
übergebenen Block nur mit Strings als Übergabewerte aufruft.
|
153
|
+
* Ein Fixnum, das den Status-Code festlegt.
|
151
154
|
|
152
155
|
Damit lässt sich relativ einfach Streaming implementieren:
|
153
156
|
|
@@ -159,11 +162,13 @@ Damit lässt sich relativ einfach Streaming implementieren:
|
|
159
162
|
|
160
163
|
get('/') { Stream.new }
|
161
164
|
|
162
|
-
|
165
|
+
|
166
|
+
=== Eigene Routen-Muster
|
167
|
+
|
163
168
|
Wie oben schon beschrieben, ist Sinatra von Haus aus mit Unterstützung für
|
164
|
-
String
|
165
|
-
Das muss aber noch nicht alles sein,
|
166
|
-
|
169
|
+
String-Muster und Reguläre Ausdrücke zum Abgleichen von Routen ausgestattet.
|
170
|
+
Das muss aber noch nicht alles sein, es können ohne großen Aufwand eigene
|
171
|
+
Routen-Muster erstellt werden:
|
167
172
|
|
168
173
|
class AllButPattern
|
169
174
|
Match = Struct.new(:captures)
|
@@ -186,7 +191,8 @@ eigene Routenmuster erstellen:
|
|
186
191
|
# ...
|
187
192
|
end
|
188
193
|
|
189
|
-
Beachte, dass das obige Beispiel etwas übertrieben wirkt. Es geht auch
|
194
|
+
Beachte, dass das obige Beispiel etwas übertrieben wirkt. Es geht auch
|
195
|
+
einfacher:
|
190
196
|
|
191
197
|
get // do
|
192
198
|
pass if request.path_info == "/index"
|
@@ -199,10 +205,11 @@ Oder unter Verwendung eines negativen look ahead:
|
|
199
205
|
# ...
|
200
206
|
end
|
201
207
|
|
208
|
+
|
202
209
|
== Statische Dateien
|
203
210
|
|
204
|
-
Statische Dateien werden aus dem <tt>./public</tt
|
205
|
-
möglich einen anderen Ort zu definieren, indem man die <tt>:public</tt
|
211
|
+
Statische Dateien werden aus dem <tt>./public</tt>-Ordner ausgeliefert. Es ist
|
212
|
+
möglich, einen anderen Ort zu definieren, indem man die <tt>:public</tt>-Option
|
206
213
|
setzt:
|
207
214
|
|
208
215
|
set :public, File.dirname(__FILE__) + '/static'
|
@@ -211,22 +218,24 @@ Zu beachten ist, dass der Ordnername public nicht Teil der URL ist. Die Datei
|
|
211
218
|
<tt>./public/css/style.css</tt> ist unter
|
212
219
|
<tt>http://example.com/css/style.css</tt> zu finden.
|
213
220
|
|
214
|
-
|
221
|
+
|
222
|
+
== Views/Templates
|
215
223
|
|
216
224
|
Standardmäßig wird davon ausgegangen, dass sich Templates im
|
217
|
-
<tt>./views</tt
|
218
|
-
|
225
|
+
<tt>./views</tt>-Ordner befinden. Es kann jedoch ein anderer Ordner festgelegt
|
226
|
+
werden:
|
219
227
|
|
220
228
|
set :views, File.dirname(__FILE__) + '/templates'
|
221
229
|
|
222
|
-
Eine wichtige Sache, die man sich hierbei merken sollte, ist
|
223
|
-
Symbols auf Templates verweisen sollte, auch wenn sich ein Template in
|
224
|
-
Unterordner befindet (in diesen Fall <tt>:'subdir/template'</tt>).
|
225
|
-
|
230
|
+
Eine wichtige Sache, die man sich hierbei merken sollte, ist, dass man immer
|
231
|
+
mit Symbols auf Templates verweisen sollte, auch wenn sich ein Template in
|
232
|
+
einem Unterordner befindet (in diesen Fall <tt>:'subdir/template'</tt>).
|
233
|
+
Rendering-Methoden rendern jeden String direkt.
|
234
|
+
|
226
235
|
|
227
236
|
=== Haml-Templates
|
228
237
|
|
229
|
-
Das +haml
|
238
|
+
Das +haml+-Gem wird benötigt, um Haml-Templates rendern zu können:
|
230
239
|
|
231
240
|
# haml muss eingebunden werden
|
232
241
|
require 'haml'
|
@@ -237,17 +246,18 @@ Das +haml+ gem wird benötigt, um Haml-Templates rendern zu können:
|
|
237
246
|
|
238
247
|
Dieser Code rendert <tt>./views/index.haml</tt>.
|
239
248
|
|
240
|
-
{
|
241
|
-
können global durch die
|
249
|
+
{Haml-Optionen}[http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#options]
|
250
|
+
können global durch die Sinatra-Konfiguration gesetzt werden,
|
242
251
|
siehe {Optionen und Konfiguration}[http://www.sinatrarb.com/configuration.html],
|
243
252
|
und individuell überschrieben werden.
|
244
253
|
|
245
|
-
set :haml, :format => :html5 # Standard
|
254
|
+
set :haml, :format => :html5 # Standard-Haml-Format ist :xhtml
|
246
255
|
|
247
256
|
get '/' do
|
248
257
|
haml :index, :format => :html4 # überschrieben
|
249
258
|
end
|
250
259
|
|
260
|
+
|
251
261
|
=== Erb-Templates
|
252
262
|
|
253
263
|
# erb muss eingebunden werden
|
@@ -259,9 +269,10 @@ und individuell überschrieben werden.
|
|
259
269
|
|
260
270
|
Dieser Code rendert <tt>./views/index.erb</tt>.
|
261
271
|
|
272
|
+
|
262
273
|
=== Erubis
|
263
274
|
|
264
|
-
Das +erubis
|
275
|
+
Das +erubis+-Gem wird benötigt, um Erubis-Templates rendern zu können:
|
265
276
|
|
266
277
|
# erbubis muss eingebunden werden
|
267
278
|
require 'erubis'
|
@@ -272,7 +283,7 @@ Das +erubis+ gem wird benötigt, um Erubis-Templates rendern zu können:
|
|
272
283
|
|
273
284
|
Dieser Code rendert <tt>./views/index.erubis</tt>.
|
274
285
|
|
275
|
-
Es ist auch möglich Erb
|
286
|
+
Es ist auch möglich, Erb durch Erubis zu ersetzen:
|
276
287
|
|
277
288
|
require 'erubis'
|
278
289
|
Tilt.register :erb, Tilt[:erubis]
|
@@ -283,9 +294,10 @@ Es ist auch möglich Erb mit Erubis zu ersetzen:
|
|
283
294
|
|
284
295
|
Dieser Code rendert ebenfalls <tt>./views/index.erb</tt>.
|
285
296
|
|
297
|
+
|
286
298
|
=== Builder-Templates
|
287
299
|
|
288
|
-
Das +builder
|
300
|
+
Das +builder+-Gem wird benötigt, um Builder-Templates rendern zu können:
|
289
301
|
|
290
302
|
# builder muss eingebunden werden
|
291
303
|
require 'builder'
|
@@ -296,9 +308,10 @@ Das +builder+ gem wird benötigt, um Builder-Templates rendern zu können:
|
|
296
308
|
|
297
309
|
Dieser Code rendert <tt>./views/index.builder</tt>.
|
298
310
|
|
311
|
+
|
299
312
|
=== Nokogiri-Templates
|
300
313
|
|
301
|
-
Das +nokogiri
|
314
|
+
Das +nokogiri+-Gem wird benötigt, um Nokogiri-Templates rendern zu können:
|
302
315
|
|
303
316
|
# nokogiri muss eingebunden werden
|
304
317
|
require 'nokogiri'
|
@@ -309,9 +322,10 @@ Das +nokogiri+ gem wird benötigt, um Nokogiri-Templates rendern zu können:
|
|
309
322
|
|
310
323
|
Dieser Code rendert <tt>./views/index.nokogiri</tt>.
|
311
324
|
|
325
|
+
|
312
326
|
=== Sass-Templates
|
313
327
|
|
314
|
-
Das +haml
|
328
|
+
Das +haml+- oder +sass+-Gem wird benötigt, um Sass-Templates rendern zu können:
|
315
329
|
|
316
330
|
# sass muss eingebunden werden
|
317
331
|
require 'sass'
|
@@ -322,9 +336,9 @@ Das +haml+ oder +sass+ gem wird benötigt, um Sass-Templates rendern zu können:
|
|
322
336
|
|
323
337
|
Dieser Code rendert <tt>./views/stylesheet.sass</tt>.
|
324
338
|
|
325
|
-
{Sass
|
326
|
-
können global durch die Sinatra-Konfiguration gesetzt werden,
|
327
|
-
|
339
|
+
{Sass-Optionen}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
|
340
|
+
können global durch die Sinatra-Konfiguration gesetzt werden, siehe
|
341
|
+
{Optionen und Konfiguration}[http://www.sinatrarb.com/configuration.html],
|
328
342
|
und individuell überschrieben werden.
|
329
343
|
|
330
344
|
set :sass, :style => :compact # Standard Sass-Style ist :nested
|
@@ -333,9 +347,10 @@ und individuell überschrieben werden.
|
|
333
347
|
sass :stylesheet, :style => :expanded # überschrieben
|
334
348
|
end
|
335
349
|
|
336
|
-
=== Scss-Templates
|
337
350
|
|
338
|
-
|
351
|
+
=== SCSS-Templates
|
352
|
+
|
353
|
+
Das +haml+- oder +sass+-Gem wird benötigt, um SCSS-Templates rendern zu können:
|
339
354
|
|
340
355
|
# sass muss eingebunden werden
|
341
356
|
require 'sass'
|
@@ -346,20 +361,21 @@ Das +haml+ oder +sass+ gem wird benötigt, um SCSS-Templates rendern zu können:
|
|
346
361
|
|
347
362
|
Dieser Code rendert <tt>./views/stylesheet.scss</tt>.
|
348
363
|
|
349
|
-
{
|
350
|
-
können global durch die Sinatra-Konfiguration gesetzt werden,
|
351
|
-
|
352
|
-
|
364
|
+
{SCSS-Optionen}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
|
365
|
+
können global durch die Sinatra-Konfiguration gesetzt werden, siehe
|
366
|
+
{Optionen und Konfiguration}[http://www.sinatrarb.com/configuration.html], und
|
367
|
+
individuell überschrieben werden.
|
353
368
|
|
354
|
-
set :scss, :style => :compact # Standard
|
369
|
+
set :scss, :style => :compact # Standard-SCSS-Style ist :nested
|
355
370
|
|
356
371
|
get '/stylesheet.css' do
|
357
372
|
scss :stylesheet, :style => :expanded # überschrieben
|
358
373
|
end
|
359
374
|
|
375
|
+
|
360
376
|
=== Less-Templates
|
361
377
|
|
362
|
-
Das +less
|
378
|
+
Das +less+-Gem wird benötigt, um Less-Templates rendern zu können:
|
363
379
|
|
364
380
|
# less muss eingebunden werden
|
365
381
|
require 'less'
|
@@ -370,9 +386,10 @@ Das +less+ gem wird benötigt, um Less-Templates rendern zu können:
|
|
370
386
|
|
371
387
|
Dieser Code rendert <tt>./views/stylesheet.less</tt>.
|
372
388
|
|
389
|
+
|
373
390
|
=== Liquid-Templates
|
374
391
|
|
375
|
-
Das +liquid
|
392
|
+
Das +liquid+-Gem wird benötigt, um Liquid-Templates rendern zu können:
|
376
393
|
|
377
394
|
# liquid muss eingebunden werden
|
378
395
|
require 'liquid'
|
@@ -383,14 +400,15 @@ Das +liquid+ gem wird benötigt, um Liquid-Templates rendern zu können:
|
|
383
400
|
|
384
401
|
Dieser Code rendert <tt>./views/index.liquid</tt>.
|
385
402
|
|
386
|
-
Da
|
387
|
-
|
403
|
+
Da aus Liquid-Templates heraus keine Methoden (abgesehen von +yield+)
|
404
|
+
aufgerufen werden können, ist es möglich, +locals+ zu übergeben:
|
388
405
|
|
389
406
|
liquid :index, :locals => { :key => 'value' }
|
390
407
|
|
408
|
+
|
391
409
|
=== Markdown-Templates
|
392
410
|
|
393
|
-
Das +rdiscount
|
411
|
+
Das +rdiscount+-Gem wird benötigt, um Markdown-Templates rendern zu können:
|
394
412
|
|
395
413
|
# rdiscount muss eingebunden werden
|
396
414
|
require "rdiscount"
|
@@ -402,22 +420,22 @@ Das +rdiscount+ gem wird benötigt, um Markdown-Templates rendern zu können:
|
|
402
420
|
Dieser Code rendert <tt>./views/index.markdown</tt> (+md+ und +mkd+ sind
|
403
421
|
ebenfalls zulässige Dateiendungen).
|
404
422
|
|
405
|
-
Da es weder möglich ist Methoden aufzurufen, noch +locals+ zu übergeben, ist
|
406
|
-
es am sinnvollsten Markdown in Kombination mit einer anderen Template-Engine
|
423
|
+
Da es weder möglich ist, Methoden aufzurufen, noch +locals+ zu übergeben, ist
|
424
|
+
es am sinnvollsten, Markdown in Kombination mit einer anderen Template-Engine
|
407
425
|
zu nutzen:
|
408
426
|
|
409
427
|
erb :overview, :locals => { :text => markdown(:introduction) }
|
410
428
|
|
411
|
-
Es ist auch möglich die +markdown
|
429
|
+
Es ist auch möglich, die +markdown+-Methode aus anderen Templates heraus
|
412
430
|
aufzurufen:
|
413
431
|
|
414
432
|
%h1 Hallo von Haml!
|
415
433
|
%p= markdown(:greetings)
|
416
434
|
|
417
|
-
Da man Ruby aus Markdown heraus nicht aufrufen kann, ist es nicht
|
418
|
-
|
419
|
-
|
420
|
-
|
435
|
+
Da man Ruby aus Markdown heraus nicht aufrufen kann, ist es nicht möglich,
|
436
|
+
Layouts zu verwenden, die in Markdown geschrieben sind. Es ist aber möglich,
|
437
|
+
einen anderen Renderer für das Template zu verwenden als für das Layout, indem
|
438
|
+
man die <tt>:layout_engine</tt>-Option angibt:
|
421
439
|
|
422
440
|
get '/' do
|
423
441
|
markdown :index, :layout_engine => :erb
|
@@ -426,7 +444,7 @@ Layout, indem man die <tt>:layout_engine</tt> option angibt:
|
|
426
444
|
Das wird <tt>./views/index.md</tt> mit <tt>./views/layout.erb</tt> als Layout
|
427
445
|
rendern.
|
428
446
|
|
429
|
-
Denk
|
447
|
+
Denk daran, dass solche Einstellungen auch global gesetzt werden können:
|
430
448
|
|
431
449
|
set :markdown, :layout_engine => :haml, :layout => :post
|
432
450
|
|
@@ -434,10 +452,10 @@ Denk dran, dass man solche Einstellungen auch global setzen kann:
|
|
434
452
|
markdown :index
|
435
453
|
end
|
436
454
|
|
437
|
-
Das wird <tt>./views/index.md</tt> (und jedes andere Markdown
|
455
|
+
Das wird <tt>./views/index.md</tt> (und jedes andere Markdown-Template) mit
|
438
456
|
<tt>./views/post.haml</tt> als Layout rendern.
|
439
457
|
|
440
|
-
Ebenso ist es möglich Markdown mit BlueCloth anstelle von RDiscount zu parsen:
|
458
|
+
Ebenso ist es möglich, Markdown mit BlueCloth anstelle von RDiscount zu parsen:
|
441
459
|
|
442
460
|
require 'bluecloth'
|
443
461
|
|
@@ -451,9 +469,10 @@ Ebenso ist es möglich Markdown mit BlueCloth anstelle von RDiscount zu parsen:
|
|
451
469
|
|
452
470
|
Das sollte <tt>./views/index.md</tt> mit BlueCloth rendern.
|
453
471
|
|
472
|
+
|
454
473
|
=== Textile-Templates
|
455
474
|
|
456
|
-
Das +redcloth
|
475
|
+
Das +redcloth+-Gem wird benötigt, um Textile-Templates rendern zu können:
|
457
476
|
|
458
477
|
# redcloth muss eingebunden werden
|
459
478
|
require "redcloth"
|
@@ -464,32 +483,31 @@ Das +redcloth+ gem wird benötigt, um Textile-Templates rendern zu können:
|
|
464
483
|
|
465
484
|
Dieser Code rendert <tt>./views/index.textile</tt>.
|
466
485
|
|
467
|
-
Da es weder möglich ist Methoden aufzurufen, noch +locals+ zu übergeben, ist
|
468
|
-
es
|
469
|
-
|
486
|
+
Da es weder möglich ist, Methoden aufzurufen, noch +locals+ zu übergeben, ist
|
487
|
+
es sinnvoll, Textile in Kombination mit einer anderen Template-Engine zu
|
488
|
+
nutzen:
|
470
489
|
|
471
490
|
erb :overview, :locals => { :text => textile(:introduction) }
|
472
491
|
|
473
|
-
Es ist auch möglich die +textile
|
492
|
+
Es ist auch möglich, die +textile+-Methode aus anderen Templates heraus
|
474
493
|
aufzurufen:
|
475
494
|
|
476
495
|
%h1 Hallo von Haml!
|
477
496
|
%p= textile(:greetings)
|
478
497
|
|
479
|
-
Da man Ruby aus Textile heraus nicht aufrufen kann, ist es nicht
|
480
|
-
|
481
|
-
|
482
|
-
|
498
|
+
Da man Ruby aus Textile heraus nicht aufrufen kann, ist es nicht möglich,
|
499
|
+
Layouts zu verwenden, die in Textile geschrieben sind. Es ist aber möglich,
|
500
|
+
einen anderen Renderer für das Template zu verwenden als für das Layout, indem
|
501
|
+
man die <tt>:layout_engine</tt>-Option angibt:
|
483
502
|
|
484
503
|
get '/' do
|
485
504
|
textile :index, :layout_engine => :erb
|
486
505
|
end
|
487
506
|
|
488
|
-
Das wird <tt>./views/index.textile</tt> mit
|
489
|
-
|
490
|
-
rendern.
|
507
|
+
Das wird <tt>./views/index.textile</tt> mit <tt>./views/layout.erb</tt> als
|
508
|
+
Layout rendern.
|
491
509
|
|
492
|
-
Denk
|
510
|
+
Denk daran, dass solche Einstellungen auch global gesetzt werden können:
|
493
511
|
|
494
512
|
set :textile, :layout_engine => :haml, :layout => :post
|
495
513
|
|
@@ -497,12 +515,13 @@ Denk dran, dass man solche Einstellungen auch global setzen kann:
|
|
497
515
|
textile :index
|
498
516
|
end
|
499
517
|
|
500
|
-
Das wird <tt>./views/index.textile</tt> (und jedes andere Markdown
|
518
|
+
Das wird <tt>./views/index.textile</tt> (und jedes andere Markdown-Template)
|
501
519
|
mit <tt>./views/post.haml</tt> als Layout rendern.
|
502
520
|
|
521
|
+
|
503
522
|
=== RDoc-Templates
|
504
523
|
|
505
|
-
Das +rdoc
|
524
|
+
Das +rdoc+-Gem wird benötigt, um RDoc-Templates rendern zu können:
|
506
525
|
|
507
526
|
# rdoc/markup/to_html muss eingebunden werden
|
508
527
|
require "rdoc/markup/to_html"
|
@@ -513,32 +532,30 @@ Das +rdoc+ gem wird benötigt, um RDoc-Templates rendern zu können:
|
|
513
532
|
|
514
533
|
Dieser Code rendert <tt>./views/index.rdoc</tt>.
|
515
534
|
|
516
|
-
Da es weder möglich ist Methoden aufzurufen, noch +locals+ zu übergeben, ist
|
517
|
-
es
|
518
|
-
zu nutzen:
|
535
|
+
Da es weder möglich ist, Methoden aufzurufen, noch +locals+ zu übergeben, ist
|
536
|
+
es sinnvoll, RDoc in Kombination mit einer anderen Template-Engine zu nutzen:
|
519
537
|
|
520
538
|
erb :overview, :locals => { :text => rdoc(:introduction) }
|
521
539
|
|
522
|
-
Es ist auch möglich die +rdoc
|
540
|
+
Es ist auch möglich, die +rdoc+-Methode aus anderen Templates heraus
|
523
541
|
aufzurufen:
|
524
542
|
|
525
543
|
%h1 Hallo von Haml!
|
526
544
|
%p= rdoc(:greetings)
|
527
545
|
|
528
|
-
Da man Ruby aus RDoc heraus nicht aufrufen kann, ist es nicht
|
529
|
-
|
530
|
-
|
531
|
-
|
546
|
+
Da man Ruby aus RDoc heraus nicht aufrufen kann, ist es nicht möglich, Layouts
|
547
|
+
zu verwenden, die in RDoc geschrieben sind. Es ist aber möglich, einen anderen
|
548
|
+
Renderer für das Template zu verwenden als für das Layout, indem man die
|
549
|
+
<tt>:layout_engine</tt> option angibt:
|
532
550
|
|
533
551
|
get '/' do
|
534
552
|
rdoc :index, :layout_engine => :erb
|
535
553
|
end
|
536
554
|
|
537
|
-
Das wird <tt>./views/index.rdoc</tt> mit
|
538
|
-
<tt>./views/layout.erb</tt> als Layout
|
555
|
+
Das wird <tt>./views/index.rdoc</tt> mit <tt>./views/layout.erb</tt> als Layout
|
539
556
|
rendern.
|
540
557
|
|
541
|
-
Denk
|
558
|
+
Denk daran, dass solche Einstellungen auch global gesetzt werden können:
|
542
559
|
|
543
560
|
set :rdoc, :layout_engine => :haml, :layout => :post
|
544
561
|
|
@@ -546,13 +563,13 @@ Denk dran, dass man solche Einstellungen auch global setzen kann:
|
|
546
563
|
rdoc :index
|
547
564
|
end
|
548
565
|
|
549
|
-
Das wird <tt>./views/index.rdoc</tt> (und jedes andere Markdown
|
566
|
+
Das wird <tt>./views/index.rdoc</tt> (und jedes andere Markdown-Template) mit
|
550
567
|
<tt>./views/post.haml</tt> als Layout rendern.
|
551
568
|
|
552
569
|
|
553
570
|
=== Radius-Templates
|
554
571
|
|
555
|
-
Das +radius
|
572
|
+
Das +radius+-Gem wird benötigt, um Radius-Templates rendern zu können:
|
556
573
|
|
557
574
|
# radius muss eingebunden werden
|
558
575
|
require 'radius'
|
@@ -563,14 +580,15 @@ Das +radius+ gem wird benötigt, um Radius-Templates rendern zu können:
|
|
563
580
|
|
564
581
|
Dieser Code rendert <tt>./views/index.radius</tt>.
|
565
582
|
|
566
|
-
Da
|
567
|
-
|
583
|
+
Da aus Radius-Templates heraus keine Methoden (abgesehen von +yield+)
|
584
|
+
aufgerufen werden können, es es möglich, +locals+ zu übergeben:
|
568
585
|
|
569
586
|
radius :index, :locals => { :key => 'value' }
|
570
587
|
|
588
|
+
|
571
589
|
=== Markaby-Templates
|
572
590
|
|
573
|
-
Das +markaby
|
591
|
+
Das +markaby+-Gem wird benötigt, um Markaby-Templates rendern zu können:
|
574
592
|
|
575
593
|
# markaby muss eingebunden werden
|
576
594
|
require 'markaby'
|
@@ -581,9 +599,10 @@ Das +markaby+ gem wird benötigt, um Markaby-Templates rendern zu können:
|
|
581
599
|
|
582
600
|
Dieser Code rendert <tt>./views/index.mab</tt>.
|
583
601
|
|
602
|
+
|
584
603
|
=== Slim-Templates
|
585
604
|
|
586
|
-
Das +slim
|
605
|
+
Das +slim+-Gem wird benötigt, um Slim-Templates rendern zu können:
|
587
606
|
|
588
607
|
# slim muss eingebunden werden
|
589
608
|
require 'slim'
|
@@ -594,10 +613,11 @@ Das +slim+ gem wird benötigt, um Slim-Templates rendern zu können:
|
|
594
613
|
|
595
614
|
Dieser Code rendert <tt>./views/index.slim</tt>.
|
596
615
|
|
616
|
+
|
597
617
|
=== CoffeeScript-Templates
|
598
618
|
|
599
|
-
Das
|
600
|
-
benötigt, um JavaScript auf dem Server ausführen zu können:
|
619
|
+
Das <tt>coffee-script</tt>-Gem und mindestens eine der folgenden Optionen
|
620
|
+
werden benötigt, um JavaScript auf dem Server ausführen zu können:
|
601
621
|
|
602
622
|
* +node+ (von Node.js) befindet sich im Pfad
|
603
623
|
* du bist unter OS X
|
@@ -606,7 +626,7 @@ benötigt, um JavaScript auf dem Server ausführen zu können:
|
|
606
626
|
Siehe auch http://github.com/josh/ruby-coffee-script für eine vollständige
|
607
627
|
Liste aller Optionen.
|
608
628
|
|
609
|
-
Nun
|
629
|
+
Nun können CoffeeScript-Templates in der Applikation gerendert werden:
|
610
630
|
|
611
631
|
# coffee-script muss eingebunden werden
|
612
632
|
require 'coffee-script'
|
@@ -617,6 +637,7 @@ Nun kannst Du CoffeeScript Templates in Deiner App rendern:
|
|
617
637
|
|
618
638
|
Dieser Code rendert <tt>./views/application.coffee</tt>.
|
619
639
|
|
640
|
+
|
620
641
|
=== Inline-Templates
|
621
642
|
|
622
643
|
get '/' do
|
@@ -625,10 +646,11 @@ Dieser Code rendert <tt>./views/application.coffee</tt>.
|
|
625
646
|
|
626
647
|
Rendert den Inline-Template-String.
|
627
648
|
|
649
|
+
|
628
650
|
=== Auf Variablen in Templates zugreifen
|
629
651
|
|
630
|
-
Templates werden
|
631
|
-
Routen sind auch direkt im Template verfügbar:
|
652
|
+
Templates werden in demselben Kontext ausgeführt wie Routen. Instanzvariablen
|
653
|
+
in Routen sind auch direkt im Template verfügbar:
|
632
654
|
|
633
655
|
get '/:id' do
|
634
656
|
@foo = Foo.find(params[:id])
|
@@ -645,6 +667,7 @@ Oder durch einen expliziten Hash von lokalen Variablen:
|
|
645
667
|
Dies wird typischerweise bei Verwendung von Subtemplates (partials) in anderen
|
646
668
|
Templates eingesetzt.
|
647
669
|
|
670
|
+
|
648
671
|
=== Inline-Templates
|
649
672
|
|
650
673
|
Templates können auch am Ende der Datei definiert werden:
|
@@ -664,11 +687,12 @@ Templates können auch am Ende der Datei definiert werden:
|
|
664
687
|
@@ index
|
665
688
|
%div.title Hallo Welt!!!!!
|
666
689
|
|
667
|
-
Anmerkung: Inline-Templates die in der Datei definiert sind, die <tt>require
|
690
|
+
Anmerkung: Inline-Templates, die in der Datei definiert sind, die <tt>require
|
668
691
|
'sinatra'</tt> aufruft, werden automatisch geladen. Um andere Inline-Templates
|
669
|
-
in anderen Dateien aufzurufen, muss <tt>enable :inline_templates</tt>
|
692
|
+
in anderen Dateien aufzurufen, muss explizit <tt>enable :inline_templates</tt>
|
670
693
|
verwendet werden.
|
671
694
|
|
695
|
+
|
672
696
|
=== Benannte Templates
|
673
697
|
|
674
698
|
Templates können auch mit der Top-Level <tt>template</tt>-Methode definiert
|
@@ -687,24 +711,28 @@ werden:
|
|
687
711
|
end
|
688
712
|
|
689
713
|
Wenn ein Template mit dem Namen "layout" existiert, wird es bei jedem Aufruf
|
690
|
-
verwendet. Durch <tt>:layout => false</tt> kann das Ausführen verhindert
|
714
|
+
verwendet. Durch <tt>:layout => false</tt> kann das Ausführen verhindert
|
715
|
+
werden:
|
691
716
|
|
692
717
|
get '/' do
|
693
718
|
haml :index, :layout => !request.xhr?
|
694
719
|
end
|
695
720
|
|
721
|
+
|
696
722
|
=== Dateiendungen zuordnen
|
697
723
|
|
698
|
-
Um eine Dateiendung einer Template
|
699
|
-
<tt>Tilt.register</tt
|
700
|
-
Templates
|
724
|
+
Um eine Dateiendung einer Template-Engine zuzuordnen, kann
|
725
|
+
<tt>Tilt.register</tt> genutzt werden. Wenn etwa die Dateiendung +tt+ für
|
726
|
+
Textile-Templates genutzt werden soll, lässt sich dies wie folgt
|
727
|
+
bewerkstelligen:
|
701
728
|
|
702
729
|
Tilt.register :tt, Tilt[:textile]
|
703
730
|
|
704
|
-
=== Eine eigene Template Engine hinzufügen
|
705
731
|
|
706
|
-
|
707
|
-
|
732
|
+
=== Eine eigene Template-Engine hinzufügen
|
733
|
+
|
734
|
+
Zu allererst muss die Engine bei Tilt registriert und danach eine
|
735
|
+
Rendering-Methode erstellt werden:
|
708
736
|
|
709
737
|
Tilt.register :mtt, MeineTolleTemplateEngine
|
710
738
|
|
@@ -717,14 +745,16 @@ Rendering-Methode erstellen:
|
|
717
745
|
end
|
718
746
|
|
719
747
|
Dieser Code rendert <tt>./views/application.mtt</tt>. Siehe
|
720
|
-
github.com/rtomayko/tilt[https://github.com/rtomayko/tilt],
|
721
|
-
|
748
|
+
github.com/rtomayko/tilt[https://github.com/rtomayko/tilt], um mehr über Tilt
|
749
|
+
zu lernen.
|
750
|
+
|
722
751
|
|
723
752
|
== Filter
|
724
753
|
|
725
|
-
Before-Filter werden
|
726
|
-
|
727
|
-
Instanzvariablen in Filtern können in Routen und Templates verwendet
|
754
|
+
Before-Filter werden vor jedem Request in demselben Kontext, wie danach die
|
755
|
+
Routen, ausgeführt. So können etwa Request und Antwort geändert werden.
|
756
|
+
Gesetzte Instanzvariablen in Filtern können in Routen und Templates verwendet
|
757
|
+
werden:
|
728
758
|
|
729
759
|
before do
|
730
760
|
@note = 'Hi!'
|
@@ -736,16 +766,16 @@ Instanzvariablen in Filtern können in Routen und Templates verwendet werden:
|
|
736
766
|
params[:splat] #=> 'bar/baz'
|
737
767
|
end
|
738
768
|
|
739
|
-
After-Filter werden nach jedem Request
|
769
|
+
After-Filter werden nach jedem Request in demselben Kontext ausgeführt und
|
740
770
|
können ebenfalls Request und Antwort ändern. In Before-Filtern gesetzte
|
741
|
-
Instanzvariablen können in After-
|
771
|
+
Instanzvariablen können in After-Filtern verwendet werden:
|
742
772
|
|
743
773
|
after do
|
744
774
|
puts response.status
|
745
775
|
end
|
746
776
|
|
747
|
-
Filter können optional auch mit einem
|
748
|
-
den Request-Pfad passen
|
777
|
+
Filter können optional auch mit einem Muster ausgestattet werden, welches auf
|
778
|
+
den Request-Pfad passen muss, damit der Filter ausgeführt wird:
|
749
779
|
|
750
780
|
before '/protected/*' do
|
751
781
|
authenticate!
|
@@ -766,9 +796,10 @@ werden:
|
|
766
796
|
# ...
|
767
797
|
end
|
768
798
|
|
799
|
+
|
769
800
|
== Helfer
|
770
801
|
|
771
|
-
Durch die Top-Level <tt>helpers</tt>-Methode
|
802
|
+
Durch die Top-Level <tt>helpers</tt>-Methode werden sogenannte Helfer-Methoden
|
772
803
|
definiert, die in Routen und Templates verwendet werden können:
|
773
804
|
|
774
805
|
helpers do
|
@@ -781,9 +812,10 @@ definiert, die in Routen und Templates verwendet werden können:
|
|
781
812
|
bar(params[:name])
|
782
813
|
end
|
783
814
|
|
784
|
-
|
815
|
+
|
816
|
+
=== Sessions verwenden
|
785
817
|
Sessions werden verwendet, um Zustände zwischen den Requests zu speichern.
|
786
|
-
Sind sie aktiviert,
|
818
|
+
Sind sie aktiviert, kann ein Session-Hash je Benutzer-Session verwendet werden.
|
787
819
|
|
788
820
|
enable :sessions
|
789
821
|
|
@@ -797,9 +829,9 @@ Sind sie aktiviert, hat man einen Session Hash pro Benutzer Session:
|
|
797
829
|
|
798
830
|
Beachte, dass <tt>enable :sessions</tt> alle Daten in einem Cookie speichert.
|
799
831
|
Unter Umständen kann dies negative Effekte haben, z.B. verursachen viele Daten
|
800
|
-
höheren, teilweise überflüssigen Traffic. Um das zu vermeiden, kann
|
801
|
-
|
802
|
-
|
832
|
+
höheren, teilweise überflüssigen Traffic. Um das zu vermeiden, kann eine Rack-
|
833
|
+
Session-Middleware verwendet werden. Dabei wird auf <tt>enable :sessions</tt>
|
834
|
+
verzichtet und die Middleware wie üblich im Programm eingebunden:
|
803
835
|
|
804
836
|
use Rack::Session::Pool, :expire_after => 2592000
|
805
837
|
|
@@ -812,20 +844,21 @@ aufrufen, sondern die Middleware wie üblich in das Programm einbinden:
|
|
812
844
|
end
|
813
845
|
|
814
846
|
Um die Sicherheit zu erhöhen, werden Cookies, die Session-Daten führen, mit
|
815
|
-
einem sogenannten Session
|
816
|
-
|
817
|
-
|
818
|
-
|
847
|
+
einem sogenannten Session-Secret signiert. Da sich dieses Geheimwort bei jedem
|
848
|
+
Neustart der Applikation automatisch ändert, ist es sinnvoll, ein eigenes zu
|
849
|
+
wählen, damit sich alle Instanzen der Applikation dasselbe Session-Secret
|
850
|
+
teilen:
|
819
851
|
|
820
852
|
set :session_secret, 'super secret'
|
821
853
|
|
854
|
+
|
822
855
|
== Anhalten
|
823
856
|
|
824
|
-
Zum sofortigen
|
857
|
+
Zum sofortigen Stoppen eines Request in einem Filter oder einer Route:
|
825
858
|
|
826
859
|
halt
|
827
860
|
|
828
|
-
Der Status kann beim
|
861
|
+
Der Status kann beim Stoppen auch angegeben werden:
|
829
862
|
|
830
863
|
halt 410
|
831
864
|
|
@@ -837,14 +870,15 @@ Oder beides:
|
|
837
870
|
|
838
871
|
halt 401, 'verschwinde!'
|
839
872
|
|
840
|
-
Sogar mit
|
873
|
+
Sogar mit Headern:
|
841
874
|
|
842
875
|
halt 402, {'Content-Type' => 'text/plain'}, 'Rache'
|
843
876
|
|
844
|
-
Natürlich ist es auch möglich ein Template mit +halt+ zu verwenden:
|
877
|
+
Natürlich ist es auch möglich, ein Template mit +halt+ zu verwenden:
|
845
878
|
|
846
879
|
halt erb(:error)
|
847
880
|
|
881
|
+
|
848
882
|
== Weiterspringen
|
849
883
|
|
850
884
|
Eine Route kann mittels <tt>pass</tt> zu der nächsten passenden Route springen:
|
@@ -855,13 +889,14 @@ Eine Route kann mittels <tt>pass</tt> zu der nächsten passenden Route springen:
|
|
855
889
|
end
|
856
890
|
|
857
891
|
get '/raten/*' do
|
858
|
-
'Du hast mich
|
892
|
+
'Du hast mich nicht!'
|
859
893
|
end
|
860
894
|
|
861
895
|
Der Block wird sofort verlassen und es wird nach der nächsten treffenden Route
|
862
|
-
gesucht. Ein 404
|
896
|
+
gesucht. Ein 404-Fehler wird zurückgegeben, wenn kein treffendes Routen-Muster
|
863
897
|
gefunden wird.
|
864
898
|
|
899
|
+
|
865
900
|
=== Eine andere Route ansteuern
|
866
901
|
|
867
902
|
Manchmal entspricht +pass+ nicht den Anforderungen, wenn das Ergebnis einer
|
@@ -877,22 +912,23 @@ anderen Route gefordert wird. Um das zu erreichen, lässt sich +call+ nutzen:
|
|
877
912
|
end
|
878
913
|
|
879
914
|
Beachte, dass in dem oben angegeben Beispiel die Performance erheblich erhöht
|
880
|
-
werden kann, wenn
|
881
|
-
und
|
915
|
+
werden kann, wenn <tt>"bar"</tt> in eine Helfer-Methode umgewandelt wird, auf
|
916
|
+
die <tt>/foo</tt> und <tt>/bar</tt> zugreifen können.
|
917
|
+
|
918
|
+
Wenn der Request innerhalb derselben Applikations-Instanz aufgerufen und keine
|
919
|
+
Kopie der Instanz erzeugt werden soll, kann <tt>call!</tt> anstelle von
|
920
|
+
+call+ verwendet werden.
|
882
921
|
|
883
|
-
|
884
|
-
Kopie der Instanz erzeugt werden soll, dann verwende +call!+ anstelle von
|
885
|
-
+call+.
|
922
|
+
Die Rack-Spezifikationen enthalten weitere Informationen zu +call+.
|
886
923
|
|
887
|
-
Die Rack Spezifikationen enthalten weitere Informationen zu +call+.
|
888
924
|
|
889
|
-
=== Body, Status
|
925
|
+
=== Body, Status-Code und Header setzen
|
890
926
|
|
891
|
-
Es ist möglich und empfohlen den Status
|
927
|
+
Es ist möglich und empfohlen, den Status-Code sowie den Response-Body mit einem
|
892
928
|
Returnwert in der Route zu setzen. In manchen Situationen kann es jedoch sein,
|
893
929
|
dass der Body an irgendeiner anderen Stelle während der Ausführung gesetzt
|
894
|
-
wird. Das lässt sich mit der
|
895
|
-
verwendet,
|
930
|
+
wird. Das lässt sich mit der Helfer-Methode +body+ bewerkstelligen. Wird +body+
|
931
|
+
verwendet, lässt sich der Body jederzeit über diese Methode aufrufen:
|
896
932
|
|
897
933
|
get '/foo' do
|
898
934
|
body "bar"
|
@@ -902,11 +938,11 @@ verwendet, dann lässt sich der Body jederzeit über diese Methode aufrufen:
|
|
902
938
|
puts body
|
903
939
|
end
|
904
940
|
|
905
|
-
Ebenso ist es möglich einen Block an +body+ weiterzureichen, der dann vom
|
906
|
-
Handler ausgeführt wird (lässt sich z.B. zur Umsetzung von Streaming
|
907
|
-
siehe auch "Rückgabewerte").
|
941
|
+
Ebenso ist es möglich, einen Block an +body+ weiterzureichen, der dann vom
|
942
|
+
Rack-Handler ausgeführt wird (lässt sich z.B. zur Umsetzung von Streaming
|
943
|
+
einsetzen, siehe auch "Rückgabewerte").
|
908
944
|
|
909
|
-
Vergleichbar mit +body+ lassen sich auch Status
|
945
|
+
Vergleichbar mit +body+ lassen sich auch Status-Code und Header setzen:
|
910
946
|
|
911
947
|
get '/foo' do
|
912
948
|
status 418
|
@@ -916,9 +952,10 @@ Vergleichbar mit +body+ lassen sich auch Status Code und Header setzen:
|
|
916
952
|
halt "Ich bin ein Teekesselchen"
|
917
953
|
end
|
918
954
|
|
919
|
-
Genau wie bei +body
|
955
|
+
Genau wie bei +body+ liest ein Aufrufen von +headers+ oder +status+ ohne
|
920
956
|
Argumente den aktuellen Wert aus.
|
921
957
|
|
958
|
+
|
922
959
|
== Mime-Types
|
923
960
|
|
924
961
|
Wenn <tt>send_file</tt> oder statische Dateien verwendet werden, kann es
|
@@ -927,40 +964,42 @@ vorkommen, dass Sinatra den Mime-Typ nicht kennt. Registriert wird dieser mit
|
|
927
964
|
|
928
965
|
mime_type :foo, 'text/foo'
|
929
966
|
|
930
|
-
Es kann aber auch der +content_type
|
967
|
+
Es kann aber auch der +content_type+-Helfer verwendet werden:
|
931
968
|
|
932
969
|
get '/' do
|
933
970
|
content_type :foo
|
934
971
|
"foo foo foo"
|
935
972
|
end
|
936
973
|
|
974
|
+
|
937
975
|
=== URLs generieren
|
938
976
|
|
939
|
-
Zum Generieren von URLs sollte
|
940
|
-
beim Einsatz von Haml:
|
977
|
+
Zum Generieren von URLs sollte die +url+-Helfer-Methode genutzen werden, so
|
978
|
+
z.B. beim Einsatz von Haml:
|
941
979
|
|
942
980
|
%a{:href => url('/foo')} foo
|
943
981
|
|
944
|
-
Soweit vorhanden, wird Rücksicht auf
|
982
|
+
Soweit vorhanden, wird Rücksicht auf Proxys und Rack-Router genommen.
|
945
983
|
|
946
|
-
Diese Methode ist ebenso über
|
984
|
+
Diese Methode ist ebenso über das Alias +to+ zu erreichen (siehe Beispiel
|
947
985
|
unten).
|
948
986
|
|
949
|
-
=== Browserumleitung
|
950
987
|
|
951
|
-
|
988
|
+
=== Browser-Umleitung
|
989
|
+
|
990
|
+
Eine Browser-Umleitung kann mithilfe der +redirect+-Helfer-Methode erreicht
|
952
991
|
werden:
|
953
992
|
|
954
993
|
get '/foo' do
|
955
994
|
redirect to('/bar')
|
956
995
|
end
|
957
996
|
|
958
|
-
Weitere Parameter werden wie Argumente der +halt
|
997
|
+
Weitere Parameter werden wie Argumente der +halt+-Methode behandelt:
|
959
998
|
|
960
999
|
redirect to('/bar'), 303
|
961
|
-
redirect 'http://google.com', 'Hier bist
|
1000
|
+
redirect 'http://google.com', 'Hier bist du falsch'
|
962
1001
|
|
963
|
-
Ebenso leicht lässt sich ein Schritt zurück mit dem Alias
|
1002
|
+
Ebenso leicht lässt sich ein Schritt zurück mit dem Alias
|
964
1003
|
<tt>redirect back</tt> erreichen:
|
965
1004
|
|
966
1005
|
get '/foo' do
|
@@ -972,12 +1011,12 @@ Ebenso leicht lässt sich ein Schritt zurück mit dem Alias
|
|
972
1011
|
redirect back
|
973
1012
|
end
|
974
1013
|
|
975
|
-
Um Argumente an ein Redirect weiterzugeben,
|
976
|
-
|
1014
|
+
Um Argumente an ein Redirect weiterzugeben, können sie entweder dem Query
|
1015
|
+
übergeben:
|
977
1016
|
|
978
1017
|
redirect to('/bar?summe=42')
|
979
1018
|
|
980
|
-
|
1019
|
+
oder eine Session verwendet werden:
|
981
1020
|
|
982
1021
|
enable :session
|
983
1022
|
|
@@ -990,9 +1029,10 @@ Oder man verwendet eine Session:
|
|
990
1029
|
session[:secret]
|
991
1030
|
end
|
992
1031
|
|
1032
|
+
|
993
1033
|
=== Dateien versenden
|
994
1034
|
|
995
|
-
Zum
|
1035
|
+
Zum Versenden von Dateien kann die <tt>send_file</tt>-Helfer-Methode verwendet
|
996
1036
|
werden:
|
997
1037
|
|
998
1038
|
get '/' do
|
@@ -1004,35 +1044,36 @@ Für <tt>send_file</tt> stehen einige Hash-Optionen zur Verfügung:
|
|
1004
1044
|
send_file 'foo.png', :type => :jpg
|
1005
1045
|
|
1006
1046
|
[filename]
|
1007
|
-
Dateiname als Response.
|
1047
|
+
Dateiname als Response. Standardwert ist der eigentliche Dateiname.
|
1008
1048
|
|
1009
1049
|
[last_modified]
|
1010
|
-
Wert für den Last-Modified
|
1050
|
+
Wert für den Last-Modified-Header, Standardwert ist +mtime+ der Datei.
|
1011
1051
|
|
1012
1052
|
[type]
|
1013
|
-
|
1053
|
+
Content-Type, der verwendet werden soll. Wird, wenn nicht angegeben, von der
|
1014
1054
|
Dateiendung abgeleitet.
|
1015
1055
|
|
1016
1056
|
[disposition]
|
1017
1057
|
Verwendet für Content-Disposition. Mögliche Werte sind: +nil+ (Standard),
|
1018
|
-
<tt>:attachment</tt> und <tt>:inline</tt
|
1058
|
+
<tt>:attachment</tt> und <tt>:inline</tt>.
|
1019
1059
|
|
1020
1060
|
[length]
|
1021
|
-
Content-Length
|
1061
|
+
Content-Length-Header. Standardwert ist die Dateigröße.
|
1062
|
+
|
1063
|
+
Soweit vom Rack-Handler unterstützt, werden neben der Übertragung über den
|
1064
|
+
Ruby-Prozess auch andere Möglichkeiten genutzt. Bei Verwendung der
|
1065
|
+
<tt>send_file</tt>-Helfer-Methode kümmert sich Sinatra selbstständig um die
|
1066
|
+
Range-Requests.
|
1022
1067
|
|
1023
|
-
Soweit vom Rack Handler unterstützt, werden neben der Übertragung über den Ruby
|
1024
|
-
Prozess auch andere Möglichkeiten genutzt. Bei Verwendung der
|
1025
|
-
<tt>send_file</tt> Helfermethode kümmert sich Sinatra selbständig um die
|
1026
|
-
Range Requests.
|
1027
1068
|
|
1028
1069
|
== Das Request-Objekt
|
1029
1070
|
|
1030
|
-
Auf das +request+-
|
1031
|
-
|
1071
|
+
Auf das +request+-Objekt der eigehenden Anfrage kann vom Anfrage-Scope aus
|
1072
|
+
zugegriffen werden:
|
1032
1073
|
|
1033
1074
|
# App läuft unter http://example.com/example
|
1034
1075
|
get '/foo' do
|
1035
|
-
request.body # Request
|
1076
|
+
request.body # Request-Body des Clients (siehe unten)
|
1036
1077
|
request.scheme # "http"
|
1037
1078
|
request.script_name # "/example"
|
1038
1079
|
request.path_info # "/foo"
|
@@ -1044,20 +1085,20 @@ zugreifen:
|
|
1044
1085
|
request.host # "example.com"
|
1045
1086
|
request.get? # true (ähnliche Methoden für andere Verben)
|
1046
1087
|
request.form_data? # false
|
1047
|
-
request["SOME_HEADER"] # Wert des SOME_HEADER-
|
1088
|
+
request["SOME_HEADER"] # Wert des SOME_HEADER-Headers
|
1048
1089
|
request.referrer # der Referrer des Clients oder '/'
|
1049
|
-
request.user_agent # User
|
1090
|
+
request.user_agent # User-Agent (genutzt von :agent-Bedingung)
|
1050
1091
|
request.cookies # Hash der Cookies
|
1051
1092
|
request.xhr? # Ist dies eine Ajax-Anfrage?
|
1052
1093
|
request.url # "http://example.com/example/foo"
|
1053
1094
|
request.path # "/example/foo"
|
1054
|
-
request.ip # Client
|
1095
|
+
request.ip # Client-IP-Addresse
|
1055
1096
|
request.secure? # false (wäre true bei SSL)
|
1056
|
-
request.forwarded? # true (wenn hinter Reverse
|
1057
|
-
requuest.env # env-Hash den Rack durchreicht
|
1097
|
+
request.forwarded? # true (wenn hinter Reverse-Proxy)
|
1098
|
+
requuest.env # env-Hash, den Rack durchreicht
|
1058
1099
|
end
|
1059
1100
|
|
1060
|
-
Manche Optionen, wie etwa <tt>script_name</tt> oder <tt>path_info</tt
|
1101
|
+
Manche Optionen, wie etwa <tt>script_name</tt> oder <tt>path_info</tt>, sind
|
1061
1102
|
auch schreibbar:
|
1062
1103
|
|
1063
1104
|
before { request.path_info = "/" }
|
@@ -1066,25 +1107,26 @@ auch schreibbar:
|
|
1066
1107
|
"Alle Anfragen kommen hier an!"
|
1067
1108
|
end
|
1068
1109
|
|
1069
|
-
Der <tt>request.body</tt> ist
|
1110
|
+
Der <tt>request.body</tt> ist ein IO- oder StringIO-Objekt:
|
1070
1111
|
|
1071
1112
|
post "/api" do
|
1072
|
-
request.body.rewind
|
1113
|
+
request.body.rewind # falls schon jemand davon gelesen hat
|
1073
1114
|
daten = JSON.parse request.body.read
|
1074
1115
|
"Hallo #{daten['name']}!"
|
1075
1116
|
end
|
1076
1117
|
|
1118
|
+
|
1077
1119
|
=== Anhänge
|
1078
1120
|
|
1079
|
-
Damit der Browser erkennt, dass ein Response gespeichert
|
1080
|
-
|
1121
|
+
Damit der Browser erkennt, dass ein Response gespeichert und nicht im Browser
|
1122
|
+
angezeigt werden soll, kann der +attachment+-Helfer verwendet werden:
|
1081
1123
|
|
1082
1124
|
get '/' do
|
1083
1125
|
attachment
|
1084
1126
|
"Speichern!"
|
1085
1127
|
end
|
1086
1128
|
|
1087
|
-
Ebenso kann
|
1129
|
+
Ebenso kann eine Dateiname als Parameter hinzugefügt werden:
|
1088
1130
|
|
1089
1131
|
get '/' do
|
1090
1132
|
attachment "info.txt"
|
@@ -1092,9 +1134,9 @@ Ebenso kann man einen Dateinamen als Parameter hinzufügen:
|
|
1092
1134
|
end
|
1093
1135
|
|
1094
1136
|
|
1095
|
-
=== Nachschlagen von Template
|
1137
|
+
=== Nachschlagen von Template-Dateien
|
1096
1138
|
|
1097
|
-
Die <tt>find_template</tt
|
1139
|
+
Die <tt>find_template</tt>-Helfer-Methode wird genutzt, um Template-Dateien zum
|
1098
1140
|
Rendern aufzufinden:
|
1099
1141
|
|
1100
1142
|
find_template settings.views, 'foo', Tilt[:haml] do |file|
|
@@ -1102,8 +1144,8 @@ Rendern aufzufinden:
|
|
1102
1144
|
end
|
1103
1145
|
|
1104
1146
|
Das ist zwar nicht wirklich brauchbar, aber wenn man sie überschreibt, kann sie
|
1105
|
-
nützlich werden, um eigene
|
1106
|
-
dann, wenn
|
1147
|
+
nützlich werden, um eigene Nachschlage-Mechanismen einzubauen. Zum Beispiel
|
1148
|
+
dann, wenn mehr als nur ein view-Verzeichnis verwendet werden soll:
|
1107
1149
|
|
1108
1150
|
set :views, ['views', 'templates']
|
1109
1151
|
|
@@ -1113,7 +1155,7 @@ dann, wenn man mehr als nur ein view-Verzeichnis verwenden möchte:
|
|
1113
1155
|
end
|
1114
1156
|
end
|
1115
1157
|
|
1116
|
-
Ein anderes Beispiel wäre
|
1158
|
+
Ein anderes Beispiel wäre, verschiedene Vereichnisse für verschiedene Engines
|
1117
1159
|
zu verwenden:
|
1118
1160
|
|
1119
1161
|
set :views, :sass => 'views/sass', :haml => 'templates', :default => 'views'
|
@@ -1126,16 +1168,17 @@ zu verwenden:
|
|
1126
1168
|
end
|
1127
1169
|
end
|
1128
1170
|
|
1129
|
-
Ebensogut könnte
|
1130
|
-
|
1171
|
+
Ebensogut könnte eine Extension aber auch geschrieben und mit anderen geteilt
|
1172
|
+
werden!
|
1131
1173
|
|
1132
1174
|
Beachte, dass <tt>find_template</tt> nicht prüft, ob eine Datei tatsächlich
|
1133
1175
|
existiert. Es wird lediglich der angegebene Block aufgerufen und nach allen
|
1134
|
-
möglichen Pfaden gesucht. Das ergibt kein
|
1176
|
+
möglichen Pfaden gesucht. Das ergibt kein Performance-Problem, da +render+
|
1135
1177
|
+block+ verwendet, sobald eine Datei gefunden wurde. Ebenso werden
|
1136
|
-
|
1137
|
-
Das sollte
|
1138
|
-
Methoden zusammenbastelt.
|
1178
|
+
Template-Pfade samt Inhalt gecached, solange nicht im Entwicklungsmodus
|
1179
|
+
gearbeitet wird. Das sollte im Hinterkopf behalten werden, wenn irgendwelche
|
1180
|
+
verrückten Methoden zusammenbastelt werden.
|
1181
|
+
|
1139
1182
|
|
1140
1183
|
== Konfiguration
|
1141
1184
|
|
@@ -1154,11 +1197,11 @@ Wird einmal beim Starten in jedweder Umgebung ausgeführt:
|
|
1154
1197
|
# das gleiche wie `set :option, false`
|
1155
1198
|
disable :option
|
1156
1199
|
|
1157
|
-
#
|
1200
|
+
# dynamische Einstellungen mit Blöcken
|
1158
1201
|
set(:css_dir) { File.join(views, 'css') }
|
1159
1202
|
end
|
1160
1203
|
|
1161
|
-
Läuft nur, wenn die Umgebung (RACK_ENV
|
1204
|
+
Läuft nur, wenn die Umgebung (RACK_ENV-Umgebungsvariable) auf
|
1162
1205
|
<tt>:production</tt> gesetzt ist:
|
1163
1206
|
|
1164
1207
|
configure :production do
|
@@ -1172,7 +1215,7 @@ gesetzt ist:
|
|
1172
1215
|
...
|
1173
1216
|
end
|
1174
1217
|
|
1175
|
-
|
1218
|
+
Diese Einstellungen sind über +settings+ erreichbar:
|
1176
1219
|
|
1177
1220
|
configure do
|
1178
1221
|
set :foo, 'bar'
|
@@ -1184,25 +1227,26 @@ Zugang zu diesen Einstellungen bekommt man über +settings+:
|
|
1184
1227
|
...
|
1185
1228
|
end
|
1186
1229
|
|
1230
|
+
|
1187
1231
|
=== Mögliche Einstellungen
|
1188
1232
|
|
1189
|
-
[absolute_redirects] Wenn ausgeschaltet wird Sinatra relative Redirects
|
1233
|
+
[absolute_redirects] Wenn ausgeschaltet, wird Sinatra relative Redirects
|
1190
1234
|
zulassen. Jedoch ist Sinatra dann nicht mehr mit RFC 2616
|
1191
1235
|
(HTTP 1.1) konform, das nur absolute Redirects zulässt.
|
1192
1236
|
|
1193
|
-
Sollte eingeschaltet werden, wenn
|
1194
|
-
Reverse
|
1195
|
-
Beachte, dass die +url
|
1196
|
-
absolute URLs erstellen wird, es sei denn
|
1197
|
-
|
1237
|
+
Sollte eingeschaltet werden, wenn die Applikation hinter
|
1238
|
+
einem Reverse-Proxy liegt, der nicht ordentlich
|
1239
|
+
eingerichtet ist. Beachte, dass die +url+-Helfer-Methode
|
1240
|
+
nach wie vor absolute URLs erstellen wird, es sei denn,
|
1241
|
+
es wird als zweiter Parameter +false+ angegeben.
|
1198
1242
|
|
1199
1243
|
Standardmäßig nicht aktiviert.
|
1200
1244
|
|
1201
1245
|
|
1202
|
-
[add_charsets] Mime
|
1246
|
+
[add_charsets] Mime-Types werden hier automatisch der Helfer-Methode
|
1203
1247
|
<tt>content_type</tt> zugeordnet.
|
1204
1248
|
|
1205
|
-
Es empfielt sich Werte hinzuzufügen
|
1249
|
+
Es empfielt sich, Werte hinzuzufügen statt sie zu
|
1206
1250
|
überschreiben:
|
1207
1251
|
|
1208
1252
|
settings.add_charsets << "application/foobar"
|
@@ -1211,7 +1255,7 @@ Zugang zu diesen Einstellungen bekommt man über +settings+:
|
|
1211
1255
|
Wurzel-, Inline-, View- und öffentliche Verzeichnis des
|
1212
1256
|
Projekts festzustellen.
|
1213
1257
|
|
1214
|
-
[bind] IP
|
1258
|
+
[bind] IP-Address, an die gebunden wird (Standardwert: 0.0.0.0).
|
1215
1259
|
Wird nur für den eingebauten Server verwendet.
|
1216
1260
|
|
1217
1261
|
[default_encoding] Das Encoding, falls keines angegeben wurde.
|
@@ -1220,18 +1264,18 @@ Zugang zu diesen Einstellungen bekommt man über +settings+:
|
|
1220
1264
|
[dump_errors] Fehler im Log anzeigen.
|
1221
1265
|
|
1222
1266
|
[environment] Momentane Umgebung. Standardmäßig auf
|
1223
|
-
<tt>content_type</tt>
|
1224
|
-
|
1267
|
+
<tt>content_type</tt> oder <tt>"development"</tt>
|
1268
|
+
eingestellt, soweit ersteres nicht vorhanden.
|
1225
1269
|
|
1226
1270
|
[logging] Den Logger verwenden.
|
1227
1271
|
|
1228
1272
|
[lock] Jeder Request wird gelocked. Es kann nur ein Request pro
|
1229
|
-
Ruby
|
1273
|
+
Ruby-Prozess gleichzeitig verarbeitet werden.
|
1230
1274
|
|
1231
|
-
Eingeschaltet wenn die
|
1275
|
+
Eingeschaltet, wenn die Applikation threadsicher ist.
|
1232
1276
|
Standardmäßig nicht aktiviert.
|
1233
1277
|
|
1234
|
-
[method_override] Verwende <tt>_method</tt>, um put/delete
|
1278
|
+
[method_override] Verwende <tt>_method</tt>, um put/delete-Formulardaten in
|
1235
1279
|
Browsern zu verwenden, die dies normalerweise nicht
|
1236
1280
|
unterstützen.
|
1237
1281
|
|
@@ -1240,12 +1284,12 @@ Zugang zu diesen Einstellungen bekommt man über +settings+:
|
|
1240
1284
|
|
1241
1285
|
[prefixed_redirects] Entscheidet, ob <tt>request.script_name</tt> in Redirects
|
1242
1286
|
eingefügt wird oder nicht, wenn kein absoluter Pfad
|
1243
|
-
angegeben ist. Auf diese
|
1244
|
-
<tt>redirect '/foo'</tt> so als
|
1245
|
-
<tt>redirect to('/foo')</tt
|
1287
|
+
angegeben ist. Auf diese Weise verhält sich
|
1288
|
+
<tt>redirect '/foo'</tt> so, als wäre es ein
|
1289
|
+
<tt>redirect to('/foo')</tt>.
|
1246
1290
|
Standardmäßig nicht aktiviert.
|
1247
1291
|
|
1248
|
-
[public] Das öffentliche Verzeichnis aus dem Daten zur Verfügung
|
1292
|
+
[public] Das öffentliche Verzeichnis, aus dem Daten zur Verfügung
|
1249
1293
|
gestellt werden können.
|
1250
1294
|
|
1251
1295
|
[reload_templates] Entscheidet, ob Templates zwischen Anfragen neu geladen
|
@@ -1257,14 +1301,14 @@ Zugang zu diesen Einstellungen bekommt man über +settings+:
|
|
1257
1301
|
|
1258
1302
|
[raise_errors] Einen Ausnahmezustand aufrufen. Beendet die Applikation.
|
1259
1303
|
|
1260
|
-
[run] Wenn aktiviert, wird Sinatra versuchen den Webserver zu
|
1304
|
+
[run] Wenn aktiviert, wird Sinatra versuchen, den Webserver zu
|
1261
1305
|
starten. Nicht verwenden, wenn Rackup oder anderes
|
1262
1306
|
verwendet werden soll.
|
1263
1307
|
|
1264
1308
|
[running] Läuft der eingebaute Server? Diese Einstellung nicht
|
1265
1309
|
ändern!
|
1266
1310
|
|
1267
|
-
[server] Server oder Liste von Servern die als eingebaute Server
|
1311
|
+
[server] Server oder Liste von Servern, die als eingebaute Server
|
1268
1312
|
zur Verfügung stehen.
|
1269
1313
|
Standardmäßig auf ['thin', 'mongrel', 'webrick']
|
1270
1314
|
voreingestellt. Die Anordnung gibt die Priorität vor.
|
@@ -1276,54 +1320,57 @@ Zugang zu diesen Einstellungen bekommt man über +settings+:
|
|
1276
1320
|
[static] Entscheidet, ob Sinatra statische Dateien zur Verfügung
|
1277
1321
|
stellen soll oder nicht.
|
1278
1322
|
Sollte nicht aktiviert werden, wenn ein Server verwendet
|
1279
|
-
wird, der dies auch
|
1323
|
+
wird, der dies auch selbstständig erledigen kann.
|
1280
1324
|
Deaktivieren wird die Performance erhöhen.
|
1281
1325
|
Standardmäßig aktiviert.
|
1282
1326
|
|
1283
1327
|
[views] Verzeichnis der Views.
|
1284
1328
|
|
1329
|
+
|
1285
1330
|
== Fehlerbehandlung
|
1286
1331
|
|
1287
|
-
Error
|
1332
|
+
Error-Handler laufen in demselben Kontext wie Routen und Filter, was bedeutet,
|
1288
1333
|
dass alle Goodies wie <tt>haml</tt>, <tt>erb</tt>, <tt>halt</tt>, etc.
|
1289
1334
|
verwendet werden können.
|
1290
1335
|
|
1336
|
+
|
1291
1337
|
=== Nicht gefunden
|
1292
1338
|
|
1293
|
-
Wenn eine <tt>Sinatra::NotFound</tt
|
1294
|
-
Statuscode 404 ist, wird der <tt>not_found</tt
|
1339
|
+
Wenn eine <tt>Sinatra::NotFound</tt>-Exception geworfen wird oder der
|
1340
|
+
Statuscode 404 ist, wird der <tt>not_found</tt>-Handler ausgeführt:
|
1295
1341
|
|
1296
1342
|
not_found do
|
1297
1343
|
'Seite kann nirgendwo gefunden werden.'
|
1298
1344
|
end
|
1299
1345
|
|
1346
|
+
|
1300
1347
|
=== Fehler
|
1301
1348
|
|
1302
|
-
Der +error
|
1303
|
-
|
1304
|
-
<tt>sinatra.error</tt
|
1349
|
+
Der +error+-Handler wird immer ausgeführt, wenn eine Exception in einem
|
1350
|
+
Routen-Block oder in einem Filter geworfen wurde. Die Exception kann über die
|
1351
|
+
<tt>sinatra.error</tt>-Rack-Variable angesprochen werden:
|
1305
1352
|
|
1306
1353
|
error do
|
1307
|
-
'Entschuldige es gab einen hässlichen Fehler - ' + env['sinatra.error'].name
|
1354
|
+
'Entschuldige, es gab einen hässlichen Fehler - ' + env['sinatra.error'].name
|
1308
1355
|
end
|
1309
1356
|
|
1310
1357
|
Benutzerdefinierte Fehler:
|
1311
1358
|
|
1312
1359
|
error MeinFehler do
|
1313
|
-
'
|
1360
|
+
'Au weia, ' + request.env['sinatra.error'].message
|
1314
1361
|
end
|
1315
1362
|
|
1316
1363
|
Dann, wenn das passiert:
|
1317
1364
|
|
1318
1365
|
get '/' do
|
1319
|
-
raise MeinFehler, 'etwas
|
1366
|
+
raise MeinFehler, 'etwas Schlimmes ist passiert'
|
1320
1367
|
end
|
1321
1368
|
|
1322
|
-
|
1369
|
+
bekommt man dieses:
|
1323
1370
|
|
1324
|
-
|
1371
|
+
Au weia, etwas Schlimmes ist passiert
|
1325
1372
|
|
1326
|
-
Alternativ kann ein Error
|
1373
|
+
Alternativ kann ein Error-Handler auch für einen Status-Code definiert werden:
|
1327
1374
|
|
1328
1375
|
error 403 do
|
1329
1376
|
'Zugriff verboten'
|
@@ -1333,25 +1380,26 @@ Alternativ kann ein Error Handler auch für Statuscode definiert werden:
|
|
1333
1380
|
403
|
1334
1381
|
end
|
1335
1382
|
|
1336
|
-
Oder ein
|
1383
|
+
Oder ein Status-Code-Bereich:
|
1337
1384
|
|
1338
1385
|
error 400..510 do
|
1339
|
-
'
|
1386
|
+
'Hallo?'
|
1340
1387
|
end
|
1341
1388
|
|
1342
|
-
Sinatra setzt verschiedene <tt>not_found</tt
|
1343
|
-
|
1389
|
+
Sinatra setzt verschiedene <tt>not_found</tt>- und <tt>error</tt>-Handler in
|
1390
|
+
der Development-Umgebung.
|
1391
|
+
|
1344
1392
|
|
1345
|
-
== Rack
|
1393
|
+
== Rack-Middleware
|
1346
1394
|
|
1347
|
-
Sinatra baut auf Rack[http://rack.rubyforge.org/], einem
|
1348
|
-
|
1349
|
-
Features für Entwickler ist der Support von
|
1350
|
-
|
1351
|
-
|
1395
|
+
Sinatra baut auf Rack[http://rack.rubyforge.org/], einem minimalistischen
|
1396
|
+
Standard-Interface für Ruby-Webframeworks. Eines der interessantesten
|
1397
|
+
Features für Entwickler ist der Support von Middlewares, die zwischen den
|
1398
|
+
Server und die Anwendung geschaltet werden und so HTTP-Request und/oder Antwort
|
1399
|
+
überwachen und/oder manipulieren können.
|
1352
1400
|
|
1353
|
-
Sinatra macht das
|
1354
|
-
Methode +use+ zu einem Kinderspiel:
|
1401
|
+
Sinatra macht das Erstellen von Middleware-Verkettungen mit der
|
1402
|
+
Top-Level-Methode +use+ zu einem Kinderspiel:
|
1355
1403
|
|
1356
1404
|
require 'sinatra'
|
1357
1405
|
require 'meine_middleware'
|
@@ -1364,22 +1412,23 @@ Methode +use+ zu einem Kinderspiel:
|
|
1364
1412
|
end
|
1365
1413
|
|
1366
1414
|
Die Semantik von +use+ entspricht der gleichnamigen Methode der
|
1367
|
-
Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html]
|
1415
|
+
Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html]-DSL
|
1368
1416
|
(meist verwendet in Rackup-Dateien). Ein Beispiel dafür ist, dass die
|
1369
|
-
+use+-Methode mehrere/verschiedene Argumente und auch Blöcke
|
1417
|
+
+use+-Methode mehrere/verschiedene Argumente und auch Blöcke entgegennimmt:
|
1370
1418
|
|
1371
1419
|
use Rack::Auth::Basic do |username, password|
|
1372
1420
|
username == 'admin' && password == 'geheim'
|
1373
1421
|
end
|
1374
1422
|
|
1375
|
-
Rack bietet eine Vielzahl von
|
1376
|
-
URL-Routing, Authentifizierung und Session-Verarbeitung.
|
1377
|
-
|
1378
|
-
|
1423
|
+
Rack bietet eine Vielzahl von Standard-Middlewares für Logging, Debugging,
|
1424
|
+
URL-Routing, Authentifizierung und Session-Verarbeitung. Sinatra verwendet
|
1425
|
+
viele von diesen Komponenten automatisch, abhängig von der Konfiguration. So
|
1426
|
+
muss +use+ häufig nicht explizit verwendet werden.
|
1427
|
+
|
1379
1428
|
|
1380
1429
|
== Testen
|
1381
1430
|
|
1382
|
-
Sinatra
|
1431
|
+
Sinatra-Tests können mit jedem auf Rack aufbauendem Test-Framework geschrieben
|
1383
1432
|
werden. {Rack::Test}[http://gitrdoc.com/brynary/rack-test] wird empfohlen:
|
1384
1433
|
|
1385
1434
|
require 'my_sinatra_app'
|
@@ -1409,19 +1458,21 @@ werden. {Rack::Test}[http://gitrdoc.com/brynary/rack-test] wird empfohlen:
|
|
1409
1458
|
end
|
1410
1459
|
end
|
1411
1460
|
|
1412
|
-
Anmerkung: Das eingebaute Sinatra::Test
|
1413
|
-
Klasse werden seit Version 0.9.2 nicht mehr unterstützt.
|
1461
|
+
Anmerkung: Das eingebaute Sinatra::Test-Modul und die
|
1462
|
+
Sinatra::TestHarness-Klasse werden seit Version 0.9.2 nicht mehr unterstützt.
|
1463
|
+
|
1464
|
+
|
1465
|
+
== Sinatra::Base - Middleware, Bibliotheken und modulare Anwendungen
|
1414
1466
|
|
1415
|
-
|
1467
|
+
Das Definieren einer Top-Level-Anwendung funktioniert gut für
|
1468
|
+
Mikro-Anwendungen, hat aber Nachteile, wenn wiederverwendbare Komponenten wie
|
1469
|
+
Middleware, Rails Metal, einfache Bibliotheken mit Server-Komponenten oder auch
|
1470
|
+
Sinatra-Erweiterungen geschrieben werden sollen.
|
1416
1471
|
|
1417
|
-
|
1418
|
-
|
1419
|
-
|
1420
|
-
|
1421
|
-
Die Top-Level DSL belastet den Objekt-Namespace und setzt einen
|
1422
|
-
Microanwendungsstil voraus (eine einzelne Anwendungsdatei, ./public und ./views
|
1423
|
-
Ordner, Logging, Exception-Detail-Seite, usw.). Genau hier kommt Sinatra::Base
|
1424
|
-
ins Spiel:
|
1472
|
+
Die Top-Level-DSL belastet den Objekt-Namespace und setzt einen
|
1473
|
+
Mikro-Anwendungsstil voraus (eine einzelne Anwendungsdatei, ./public und
|
1474
|
+
./views Ordner, Logging, Exception-Detail-Seite, usw.). Genau hier kommt
|
1475
|
+
Sinatra::Base ins Spiel:
|
1425
1476
|
|
1426
1477
|
require 'sinatra/base'
|
1427
1478
|
|
@@ -1436,43 +1487,44 @@ ins Spiel:
|
|
1436
1487
|
|
1437
1488
|
Die MyApp-Klasse ist eine unabhängige Rack-Komponente, die als Middleware,
|
1438
1489
|
Endpunkt oder via Rails Metal verwendet werden kann. Verwendet wird sie durch
|
1439
|
-
+use+ oder +run+ von einer Rackup
|
1440
|
-
einer Bibliothek:
|
1490
|
+
+use+ oder +run+ von einer Rackup-<tt>config.ru</tt>-Datei oder als
|
1491
|
+
Server-Komponente einer Bibliothek:
|
1441
1492
|
|
1442
1493
|
MyApp.run! :host => 'localhost', :port => 9090
|
1443
1494
|
|
1444
|
-
Die Methoden der Sinatra::Base-Subklasse sind genau
|
1445
|
-
|
1495
|
+
Die Methoden der Sinatra::Base-Subklasse sind genau dieselben wie die der
|
1496
|
+
Top-Level-DSL. Die meisten Top-Level-Anwendungen können mit nur zwei
|
1446
1497
|
Veränderungen zu Sinatra::Base-Komponenten konvertiert werden:
|
1447
1498
|
|
1448
1499
|
* Die Datei sollte <tt>require 'sinatra/base'</tt> anstelle von
|
1449
1500
|
<tt>require 'sinatra/base'</tt> aufrufen, ansonsten werden alle von
|
1450
|
-
Sinatras DSL
|
1451
|
-
* Alle Routen, Error
|
1501
|
+
Sinatras DSL-Methoden in den Top-Level-Namespace importiert.
|
1502
|
+
* Alle Routen, Error-Handler, Filter und Optionen der Applikation müssen in
|
1452
1503
|
einer Subklasse von Sinatra::Base definiert werden.
|
1453
1504
|
|
1454
1505
|
<tt>Sinatra::Base</tt> ist ein unbeschriebenes Blatt. Die meisten Optionen sind
|
1455
|
-
per
|
1506
|
+
per Standard deaktiviert. Das betrifft auch den eingebauten Server. Siehe
|
1456
1507
|
{Optionen und Konfiguration}[http://sinatra.github.com/configuration.html] für
|
1457
1508
|
Details über mögliche Optionen.
|
1458
1509
|
|
1510
|
+
|
1459
1511
|
=== Modularer vs. klassischer Stil
|
1460
1512
|
|
1461
1513
|
Entgegen häufiger Meinungen gibt es nichts gegen den klassischen Stil
|
1462
1514
|
einzuwenden. Solange es die Applikation nicht beeinträchtigt, besteht kein
|
1463
|
-
Grund eine modulare Applikation zu erstellen.
|
1515
|
+
Grund, eine modulare Applikation zu erstellen.
|
1464
1516
|
|
1465
1517
|
Lediglich zwei Nachteile gegenüber dem modularen Stil sollten beachtet werden:
|
1466
1518
|
|
1467
|
-
* Es kann nur eine Sinatra Applikation pro Ruby
|
1468
|
-
zum Einsatz kommen, muss auf
|
1519
|
+
* Es kann nur eine Sinatra Applikation pro Ruby-Prozess laufen. Sollten mehrere
|
1520
|
+
zum Einsatz kommen, muss auf den modularen Stil umgestiegen werden.
|
1469
1521
|
|
1470
|
-
* Der klassische Stil füllt Object mit
|
1471
|
-
Applikation als
|
1472
|
-
umgestiegen werden.
|
1522
|
+
* Der klassische Stil füllt Object mit Delegations-Methoden. Sollte die
|
1523
|
+
Applikation als Gem/Bibliothek zum Einsatz kommen, sollte auf den modularen
|
1524
|
+
Stil umgestiegen werden.
|
1473
1525
|
|
1474
|
-
Es gibt keinen Grund, warum
|
1475
|
-
|
1526
|
+
Es gibt keinen Grund, warum modulare und klassische Elemente nicht
|
1527
|
+
vermischt werden sollten.
|
1476
1528
|
|
1477
1529
|
Will man jedoch von einem Stil auf den anderen umsteigen, sollten einige
|
1478
1530
|
Unterschiede beachtet werden:
|
@@ -1488,7 +1540,7 @@ Unterschiede beachtet werden:
|
|
1488
1540
|
|
1489
1541
|
=== Eine modulare Applikation bereitstellen
|
1490
1542
|
|
1491
|
-
Es gibt zwei übliche Wege eine modulare Anwendung zu starten. Zum einen über
|
1543
|
+
Es gibt zwei übliche Wege, eine modulare Anwendung zu starten. Zum einen über
|
1492
1544
|
<tt>run!</tt>:
|
1493
1545
|
|
1494
1546
|
# mein_app.rb
|
@@ -1497,7 +1549,7 @@ Es gibt zwei übliche Wege eine modulare Anwendung zu starten. Zum einen über
|
|
1497
1549
|
class MeinApp < Sinatra::Base
|
1498
1550
|
# ... Anwendungscode hierhin ...
|
1499
1551
|
|
1500
|
-
# starte den Server, wenn die Ruby
|
1552
|
+
# starte den Server, wenn die Ruby-Datei direkt ausgeführt wird
|
1501
1553
|
run! if app_file == $0
|
1502
1554
|
end
|
1503
1555
|
|
@@ -1505,8 +1557,8 @@ Starte mit:
|
|
1505
1557
|
|
1506
1558
|
ruby mein_app.rb
|
1507
1559
|
|
1508
|
-
Oder über eine <tt>config.ru</tt
|
1509
|
-
verwenden:
|
1560
|
+
Oder über eine <tt>config.ru</tt>-Datei, die es erlaubt, einen beliebigen
|
1561
|
+
Rack-Handler zu verwenden:
|
1510
1562
|
|
1511
1563
|
# config.ru
|
1512
1564
|
require 'mein_app'
|
@@ -1516,6 +1568,7 @@ Starte:
|
|
1516
1568
|
|
1517
1569
|
rackup -p 4567
|
1518
1570
|
|
1571
|
+
|
1519
1572
|
=== Eine klassische Anwendung mit einer config.ru verwenden
|
1520
1573
|
|
1521
1574
|
Schreibe eine Anwendungsdatei:
|
@@ -1527,31 +1580,33 @@ Schreibe eine Anwendungsdatei:
|
|
1527
1580
|
'Hallo Welt!'
|
1528
1581
|
end
|
1529
1582
|
|
1530
|
-
|
1583
|
+
sowie eine dazugehörige <tt>config.ru</tt>-Datei:
|
1531
1584
|
|
1532
1585
|
require 'app'
|
1533
1586
|
run Sinatra::Application
|
1534
1587
|
|
1535
|
-
=== Wann verwendet man eine config.ru?
|
1536
1588
|
|
1537
|
-
|
1589
|
+
=== Wann sollte eine config.ru-Datei verwendet werden?
|
1590
|
+
|
1591
|
+
Anzeichen dafür, dass eine <tt>config.ru</tt>-Datei gebraucht wird:
|
1538
1592
|
|
1539
|
-
*
|
1593
|
+
* Es soll ein anderer Rack-Handler verwendet werden (Passenger, Unicorn,
|
1540
1594
|
Heroku, ...).
|
1541
|
-
*
|
1542
|
-
*
|
1595
|
+
* Es gibt mehr als nur eine Subklasse von <tt>Sinatra::Base</tt>.
|
1596
|
+
* Sinatra soll als Middleware verwendet werden, nicht als Endpunkt.
|
1597
|
+
|
1598
|
+
<b>Es gibt keinen Grund, eine <tt>config.ru</tt>-Datei zu verwenden, nur weil
|
1599
|
+
eine Anwendung im modularen Stil betrieben werden soll. Ebenso wird keine
|
1600
|
+
Anwendung mit modularem Stil benötigt, um eine <tt>config.ru</tt>-Datei zu
|
1601
|
+
verwenden.</b>
|
1543
1602
|
|
1544
|
-
<b>Es gibt keinen Grund eine <tt>config.ru</tt> zu verwenden, nur weil man eine
|
1545
|
-
Anwendung im modularen Stil betreiben möchte. Ebenso braucht man keine
|
1546
|
-
Anwendung im modularen Stil, um eine <tt>config.ru</tt> verwenden zu können.
|
1547
|
-
</b>
|
1548
1603
|
|
1549
1604
|
=== Sinatra als Middleware nutzen
|
1550
1605
|
|
1551
|
-
Es ist nicht nur möglich andere Rack-Middleware mit Sinatra zu nutzen,
|
1552
|
-
|
1553
|
-
Rack-Endpunkt
|
1554
|
-
Sinatra-Anwendung
|
1606
|
+
Es ist nicht nur möglich, andere Rack-Middleware mit Sinatra zu nutzen, es kann
|
1607
|
+
außerdem jede Sinatra-Anwendung selbst als Middleware vor jeden beliebigen
|
1608
|
+
Rack-Endpunkt gehangen werden. Bei diesem Endpunkt muss es sich nicht um eine
|
1609
|
+
andere Sinatra-Anwendung handeln, es kann jede andere Rack-Anwendung sein
|
1555
1610
|
(Rails/Ramaze/Camping/...):
|
1556
1611
|
|
1557
1612
|
require 'sinatra/base'
|
@@ -1583,22 +1638,23 @@ Sinatra-Anwendung handen, es kann jede andere Rack-Anwendung sein
|
|
1583
1638
|
get('/') { "Hallo #{session['user_name']}." }
|
1584
1639
|
end
|
1585
1640
|
|
1641
|
+
|
1586
1642
|
== Geltungsbereich und Bindung
|
1587
1643
|
|
1588
|
-
Der Geltungsbereich (
|
1644
|
+
Der Geltungsbereich (Scope) legt fest, welche Methoden und Variablen zur
|
1589
1645
|
Verfügung stehen.
|
1590
1646
|
|
1591
|
-
=== Anwendungs- oder Klassenscope
|
1592
1647
|
|
1593
|
-
|
1594
|
-
|
1595
|
-
|
1596
|
-
|
1597
|
-
|
1598
|
-
|
1599
|
-
|
1648
|
+
=== Anwendungs- oder Klassen-Scope
|
1649
|
+
|
1650
|
+
Jede Sinatra-Anwendung entspricht einer Sinatra::Base-Subklasse. Falls die Top-
|
1651
|
+
Level-DSL verwendet wird (<tt>require 'sinatra'</tt>), handelt es sich um
|
1652
|
+
Sinatra::Application, andernfalls ist es jene Subklasse, die explizit angelegt
|
1653
|
+
wurde. Auf Klassenebene stehen Methoden wie +get+ oder +before+ zur Verfügung,
|
1654
|
+
es gibt aber keinen Zugriff auf das +request+-Object oder die +session+, da nur
|
1655
|
+
eine einzige Klasse für alle eingehenden Anfragen genutzt wird.
|
1600
1656
|
|
1601
|
-
Optionen die via +set+ gesetzt werden, sind Methoden auf Klassenebene:
|
1657
|
+
Optionen, die via +set+ gesetzt werden, sind Methoden auf Klassenebene:
|
1602
1658
|
|
1603
1659
|
class MyApp < Sinatra::Base
|
1604
1660
|
# Hey, ich bin im Anwendungsscope!
|
@@ -1606,67 +1662,69 @@ Optionen die via +set+ gesetzt werden, sind Methoden auf Klassenebene:
|
|
1606
1662
|
foo # => 42
|
1607
1663
|
|
1608
1664
|
get '/foo' do
|
1609
|
-
# Hey, ich bin nicht mehr im
|
1665
|
+
# Hey, ich bin nicht mehr im Anwendungs-Scope!
|
1610
1666
|
end
|
1611
1667
|
end
|
1612
1668
|
|
1613
|
-
Im
|
1669
|
+
Im Anwendungs-Scope befindet man sich:
|
1614
1670
|
|
1615
|
-
* In der
|
1616
|
-
* In Methoden die von Erweiterungen definiert werden.
|
1671
|
+
* In der Anwendungs-Klasse.
|
1672
|
+
* In Methoden, die von Erweiterungen definiert werden.
|
1617
1673
|
* Im Block, der an +helpers+ übergeben wird.
|
1618
|
-
* In Procs und Blöcken die an +set+ übergeben werden.
|
1674
|
+
* In Procs und Blöcken, die an +set+ übergeben werden.
|
1619
1675
|
|
1620
|
-
|
1676
|
+
Auf das Scope-Objekt (die Klasse) kann wie folgt zugegriffen werden:
|
1621
1677
|
|
1622
|
-
* Über das Objekt,
|
1678
|
+
* Über das Objekt, das an den +configure+-Block übergeben wird (<tt>configure
|
1623
1679
|
{ |c| ... }</tt>).
|
1624
1680
|
* +settings+ aus den anderen Scopes heraus.
|
1625
1681
|
|
1626
|
-
=== Anfrage- oder Instanzscope
|
1627
1682
|
|
1628
|
-
|
1629
|
-
|
1630
|
-
|
1631
|
-
|
1632
|
-
|
1683
|
+
=== Anfrage- oder Instanz-Scope
|
1684
|
+
|
1685
|
+
Für jede eingehende Anfrage wird eine neue Instanz der Anwendungs-Klasse
|
1686
|
+
erstellt und alle Handler in diesem Scope ausgeführt. Aus diesem Scope
|
1687
|
+
heraus kann auf +request+ oder +session+ zugegriffen und Methoden wie +erb+
|
1688
|
+
oder +haml+ aufgerufen werden. Außerdem kann mit der +settings+-Method auf den
|
1689
|
+
Anwendungs-Scope zugegriffen werden:
|
1633
1690
|
|
1634
1691
|
class MyApp < Sinatra::Base
|
1635
|
-
# Hey, ich bin im
|
1692
|
+
# Hey, ich bin im Anwendungs-Scope!
|
1636
1693
|
get '/neue_route/:name' do
|
1637
|
-
#
|
1694
|
+
# Anfrage-Scope für '/neue_route/:name'
|
1638
1695
|
@value = 42
|
1639
1696
|
|
1640
1697
|
settings.get "/#{params[:name]}" do
|
1641
|
-
#
|
1642
|
-
@value # => nil (nicht
|
1698
|
+
# Anfrage-Scope für "/#{params[:name]}"
|
1699
|
+
@value # => nil (nicht dieselbe Anfrage)
|
1643
1700
|
end
|
1644
1701
|
|
1645
1702
|
"Route definiert!"
|
1646
1703
|
end
|
1647
1704
|
end
|
1648
1705
|
|
1649
|
-
Im
|
1706
|
+
Im Anfrage-Scope befindet man sich:
|
1650
1707
|
|
1651
|
-
* In get/head/post/put/delete
|
1652
|
-
* In before/after
|
1653
|
-
* In
|
1708
|
+
* In get/head/post/put/delete-Blöcken
|
1709
|
+
* In before/after-Filtern
|
1710
|
+
* In Helfer-Methoden
|
1654
1711
|
* In Templates
|
1655
1712
|
|
1713
|
+
|
1656
1714
|
=== Delegation-Scope
|
1657
1715
|
|
1658
|
-
Vom Delegation-Scope aus werden Methoden einfach an den
|
1659
|
-
weitergeleitet. Dieser verhält sich jedoch nicht 100%ig wie der
|
1716
|
+
Vom Delegation-Scope aus werden Methoden einfach an den Klassen-Scope
|
1717
|
+
weitergeleitet. Dieser verhält sich jedoch nicht 100%ig wie der Klassen-Scope,
|
1660
1718
|
da man nicht die Bindung der Klasse besitzt: Nur Methoden, die explizit als
|
1661
|
-
delegierbar markiert wurden stehen hier zur Verfügung und
|
1662
|
-
die Variablen des Klassenscopes
|
1663
|
-
anderes +self+).
|
1664
|
-
:methoden_name</tt>
|
1719
|
+
delegierbar markiert wurden, stehen hier zur Verfügung und es kann nicht auf
|
1720
|
+
die Variablen des Klassenscopes zugegriffen werden (mit anderen Worten: es gibt
|
1721
|
+
ein anderes +self+). Weitere Delegationen können mit
|
1722
|
+
<tt>Sinatra::Delegator.delegate :methoden_name</tt> hinzugefügt werden.
|
1665
1723
|
|
1666
1724
|
Im Delegation-Scop befindet man sich:
|
1667
1725
|
|
1668
|
-
* Im Top-Level, wenn
|
1669
|
-
* In einem Objekt,
|
1726
|
+
* Im Top-Level, wenn <tt>require 'sinatra'</tt> aufgerufen wurde.
|
1727
|
+
* In einem Objekt, das mit dem <tt>Sinatra::Delegator</tt>-Mixin erweitert
|
1670
1728
|
wurde.
|
1671
1729
|
|
1672
1730
|
Schau am besten im Code nach: Hier ist
|
@@ -1674,9 +1732,10 @@ Schau am besten im Code nach: Hier ist
|
|
1674
1732
|
definiert und wird in den
|
1675
1733
|
{globalen Namespace eingebunden}[http://github.com/sinatra/sinatra/blob/master/lib/sinatra/main.rb#L25].
|
1676
1734
|
|
1735
|
+
|
1677
1736
|
== Kommandozeile
|
1678
1737
|
|
1679
|
-
Sinatra
|
1738
|
+
Sinatra-Anwendungen können direkt von der Kommandozeile aus gestartet werden:
|
1680
1739
|
|
1681
1740
|
ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-h HOST] [-s HANDLER]
|
1682
1741
|
|
@@ -1686,23 +1745,24 @@ Die Optionen sind:
|
|
1686
1745
|
-p # Port setzen (Standard ist 4567)
|
1687
1746
|
-h # Host setzen (Standard ist 0.0.0.0)
|
1688
1747
|
-e # Umgebung setzen (Standard ist development)
|
1689
|
-
-s # Rack
|
1690
|
-
-x # Mutex
|
1748
|
+
-s # Rack-Server/Handler setzen (Standard ist thin)
|
1749
|
+
-x # Mutex-Lock einschalten (Standard ist off)
|
1750
|
+
|
1691
1751
|
|
1692
1752
|
== Systemanforderungen
|
1693
1753
|
|
1694
|
-
Es wird empfohlen Sinatra unter Ruby 1.8.7, 1.9.2, JRuby oder Rubinius zu
|
1754
|
+
Es wird empfohlen, Sinatra unter Ruby 1.8.7, 1.9.2, JRuby oder Rubinius zu
|
1695
1755
|
installieren.
|
1696
1756
|
|
1697
1757
|
Die folgenden Versionen werden offiziell unterstützt:
|
1698
1758
|
|
1699
1759
|
[ Ruby 1.8.6 ]
|
1700
|
-
Es wird nicht empfohlen 1.8.6 für Sinatra einzusetzen. Trotzdem wird es
|
1701
|
-
offiziell bis Sinatra 1.3.0 unterstützt werden. RDoc und CoffeeScript
|
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-
|
1702
1762
|
Templates werden in dieser Version nicht unterstützt. 1.8.6 hat ein größeres
|
1703
|
-
Speicherleck in seiner Hash
|
1763
|
+
Speicherleck in seiner Hash-Implementation, das von Sinatra-Versionen vor
|
1704
1764
|
1.1.1 ausgelöst wird. Die aktuelle Version verhindert das zwar explizit, aber
|
1705
|
-
unter
|
1765
|
+
unter Einbußen in der Performance. Ebenso muss Sinatra mit Rack 1.1.x laufen,
|
1706
1766
|
da Rack >= 1.2 Ruby 1.8.6 nicht mehr unterstützt.
|
1707
1767
|
|
1708
1768
|
[ Ruby 1.8.7 ]
|
@@ -1711,81 +1771,90 @@ Die folgenden Versionen werden offiziell unterstützt:
|
|
1711
1771
|
|
1712
1772
|
[ Ruby 1.9.2 ]
|
1713
1773
|
1.9.2 wird unterstützt und empfohlen. Beachte, dass Markaby und Radius
|
1714
|
-
momentan noch nicht kompatibel
|
1774
|
+
momentan noch nicht kompatibel mit 1.9 sind. Version 1.9.0p0 sollte nicht
|
1715
1775
|
verwendet werden, da unter Sinatra immer wieder Segfaults auftreten.
|
1716
1776
|
|
1717
1777
|
[ Rubinius ]
|
1718
|
-
Rubinius (rbx >= 1.2.
|
1719
|
-
|
1778
|
+
Rubinius (rbx >= 1.2.3) wird offiziell unter Einbezug aller Templates
|
1779
|
+
unterstützt.
|
1720
1780
|
|
1721
1781
|
[ JRuby ]
|
1722
|
-
|
1723
|
-
Bibliotheken Dritter sind nicht bekannt. Falls JRuby zum Einsatz kommt,
|
1724
|
-
aber darauf geachtet werden, dass ein JRuby
|
1725
|
-
der Thin
|
1782
|
+
JRuby wird offiziell unterstützt (JRuby >= 1.6.0). Probleme mit Template-
|
1783
|
+
Bibliotheken Dritter sind nicht bekannt. Falls JRuby zum Einsatz kommt,
|
1784
|
+
sollte aber darauf geachtet werden, dass ein JRuby-Rack-Handler zum Einsatz
|
1785
|
+
kommt – der Thin-Web-Server wird bisher nicht unterstütz. JRubys
|
1786
|
+
Unterstützung für C-Erweiterungen sind zur Zeit noch experimenteller Natur,
|
1787
|
+
betrifft im Moment aber nur RDiscount.
|
1726
1788
|
|
1727
|
-
Weiterhin werden wir auf kommende Ruby
|
1789
|
+
Weiterhin werden wir auf kommende Ruby-Versionen ein Auge haben.
|
1728
1790
|
|
1729
|
-
Die nachfolgend aufgeführten Ruby
|
1791
|
+
Die nachfolgend aufgeführten Ruby-Implementationen werden offiziell nicht von
|
1730
1792
|
Sinatra unterstützt, funktionieren aber normalerweise:
|
1731
1793
|
|
1732
1794
|
* Ältere Versionen von JRuby und Rubinius
|
1733
|
-
* MacRuby
|
1734
|
-
* Maglev
|
1735
|
-
* IronRuby
|
1795
|
+
* MacRuby, Maglev, IronRuby
|
1736
1796
|
* Ruby 1.9.0 und 1.9.1
|
1737
1797
|
|
1738
1798
|
Nicht offiziell unterstützt bedeutet, dass wenn Sachen nicht funktionieren,
|
1739
|
-
|
1799
|
+
wir davon ausgehen, dass es nicht an Sinatra sondern an der jeweiligen
|
1740
1800
|
Implentierung liegt.
|
1741
1801
|
|
1742
|
-
|
1802
|
+
Im Rahmen unserer CI (Kontinuierlichen Integration) wird bereits ruby-head
|
1803
|
+
(das kommende Ruby 1.9.3) mit eingebunden. Da noch alles im Fluss ist, kann zur
|
1804
|
+
Zeit für nichts garantiert werden. Es kann aber erwartet werden, dass Ruby
|
1805
|
+
1.9.3p0 von Sinatra unterstützt werden wird.
|
1806
|
+
|
1807
|
+
Sinatra sollte auf jedem Betriebssystem laufen, dass den gewählten Ruby-
|
1743
1808
|
Interpreter unterstützt.
|
1744
1809
|
|
1810
|
+
|
1745
1811
|
== Der neueste Stand (The Bleeding Edge)
|
1746
|
-
Um auf dem neusten Stand zu bleiben,
|
1747
|
-
sollte recht stabil sein. Ebenso gibt es von Zeit zu Zeit prerelease Gems,
|
1748
|
-
|
1812
|
+
Um auf dem neusten Stand zu bleiben, kann der Master-Branch verwendet werden.
|
1813
|
+
Er sollte recht stabil sein. Ebenso gibt es von Zeit zu Zeit prerelease Gems,
|
1814
|
+
die so installiert werden:
|
1749
1815
|
|
1750
1816
|
gem install sinatra --pre
|
1751
1817
|
|
1818
|
+
|
1752
1819
|
=== Mit Bundler
|
1753
|
-
Wenn du deine App mit der neusten Version von Sinatra mit
|
1754
|
-
{Bundler}[http://gembundler.com/] nutzen willst, dann ist dies der
|
1755
|
-
vorgeschlagene Weg:
|
1756
1820
|
|
1757
|
-
|
1821
|
+
Wenn die Applikation mit der neuesten Version von Sinatra und
|
1822
|
+
{Bundler}[http://gembundler.com/] genutzt werden soll, schlagen wir folgenden
|
1823
|
+
Weg vor:
|
1824
|
+
|
1825
|
+
Soweit Bundler noch nicht installiert ist, folgendes:
|
1758
1826
|
|
1759
1827
|
gem install bundler
|
1760
|
-
|
1761
|
-
|
1762
|
-
|
1828
|
+
|
1829
|
+
Anschließend wird eine +Gemfile+-Datei im Projektverzeichnis mit folgendem
|
1830
|
+
Inhalt erstellt:
|
1763
1831
|
|
1764
1832
|
source :rubygems
|
1765
1833
|
gem 'sinatra', :git => "git://github.com/sinatra/sinatra.git"
|
1766
1834
|
|
1767
1835
|
# evtl. andere Abhängigkeiten
|
1768
|
-
gem 'haml' # z.B. wenn du
|
1836
|
+
gem 'haml' # z.B. wenn du Haml verwendest...
|
1769
1837
|
gem 'activerecord', '~> 3.0' # ...oder ActiveRecord 3.x
|
1770
1838
|
|
1771
|
-
Beachte:
|
1772
|
-
|
1839
|
+
Beachte: Hier sollten alle Abhängigkeiten eingetragen werden. Sinatras eigene,
|
1840
|
+
direkte Abhängigkeiten (Tilt und Rack) werden von Bundler automatisch aus dem
|
1773
1841
|
Gemfile von Sinatra hinzugefügt.
|
1774
1842
|
|
1775
|
-
Jetzt kannst du deine
|
1843
|
+
Jetzt kannst du deine Applikation starten:
|
1776
1844
|
|
1777
1845
|
bundle exec ruby myapp.rb
|
1846
|
+
|
1778
1847
|
|
1779
1848
|
=== Eigenes Repository
|
1780
|
-
Um auf
|
1781
|
-
angelegt werden. Gestartet wird in der Anwendung mit dem <tt>sinatra/lib</tt
|
1849
|
+
Um auf dem neuesten Stand von Sinatras Code zu sein, kann eine lokale Kopie
|
1850
|
+
angelegt werden. Gestartet wird in der Anwendung mit dem <tt>sinatra/lib</tt>-
|
1782
1851
|
Ordner im <tt>LOAD_PATH</tt>:
|
1783
1852
|
|
1784
1853
|
cd myapp
|
1785
1854
|
git clone git://github.com/sinatra/sinatra.git
|
1786
1855
|
ruby -Isinatra/lib myapp.rb
|
1787
1856
|
|
1788
|
-
Alternativ kann der <tt>sinatra/lib</tt
|
1857
|
+
Alternativ kann der <tt>sinatra/lib</tt>-Ordner zum <tt>LOAD_PATH</tt> in
|
1789
1858
|
der Anwendung hinzugefügt werden:
|
1790
1859
|
|
1791
1860
|
$LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
|
@@ -1796,38 +1865,41 @@ der Anwendung hinzugefügt werden:
|
|
1796
1865
|
"Ich laufe auf Version " + Sinatra::VERSION
|
1797
1866
|
end
|
1798
1867
|
|
1799
|
-
Um Sinatra
|
1868
|
+
Um Sinatra-Code von Zeit zu Zeit zu aktualisieren:
|
1800
1869
|
|
1801
1870
|
cd myproject/sinatra
|
1802
1871
|
git pull
|
1803
1872
|
|
1873
|
+
|
1804
1874
|
=== Gem erstellen
|
1805
1875
|
|
1806
|
-
Aus der eigenen lokalen Kopie kann nun auch ein globales
|
1876
|
+
Aus der eigenen lokalen Kopie kann nun auch ein globales Gem gebaut werden:
|
1807
1877
|
|
1808
1878
|
git clone git://github.com/sinatra/sinatra.git
|
1809
1879
|
cd sinatra
|
1810
1880
|
rake sinatra.gemspec
|
1811
1881
|
rake install
|
1812
1882
|
|
1813
|
-
Falls
|
1814
|
-
|
1883
|
+
Falls Gems als Root installiert werden sollen, sollte die letzte Zeile
|
1884
|
+
folgendermaßen lauten:
|
1815
1885
|
|
1816
1886
|
sudo rake install
|
1817
1887
|
|
1818
|
-
== Versionsverfahren
|
1819
1888
|
|
1820
|
-
|
1821
|
-
|
1889
|
+
== Versions-Verfahren
|
1890
|
+
|
1891
|
+
Sinatra folgt dem sogenannten {Semantic Versioning}[http://semver.org/], d.h.
|
1892
|
+
SemVer und SemVerTag.
|
1893
|
+
|
1822
1894
|
|
1823
1895
|
== Mehr
|
1824
1896
|
|
1825
|
-
* {Projekt
|
1897
|
+
* {Projekt-Website}[http://sinatra.github.com/] - Ergänzende Dokumentation,
|
1826
1898
|
News und Links zu anderen Ressourcen.
|
1827
1899
|
* {Hilfe beisteuern}[http://sinatra.github.com/contributing.html] - Einen
|
1828
1900
|
Fehler gefunden? Brauchst du Hilfe? Hast du einen Patch?
|
1829
|
-
* {Issue
|
1901
|
+
* {Issue-Tracker}[http://github.com/sinatra/sinatra/issues]
|
1830
1902
|
* {Twitter}[http://twitter.com/sinatra]
|
1831
|
-
* {
|
1903
|
+
* {Mailing-Liste}[http://groups.google.com/group/sinatrarb]
|
1832
1904
|
* {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] auf http://freenode.net
|
1833
1905
|
|