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 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
@@ -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 aktuellsten Stand.</i>
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 minimalen Aufwand ermöglicht:
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 Server via <tt>gem install thin</tt> zu installieren,
22
- den Sinatra, soweit vorhanden, dann automatisch verwendet.
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 Routemuster, das mit dem Request übereinstimmt, wird ausgeführt.
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 Blockparametern zugreifen:
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
- Routenmuster können auch mit Splat- oder Wildcardparametern über das
68
- <tt>params[:splat]</tt> Array angesprochen werden:
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 kann man Blockparameter nutzen:
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 Agents:
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
- Man kann auch relativ einfach eigene Bedingungen hinzufügen:
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 Routenblocks wird mindestens der Response Body
135
- festgelegt, der an den HTTP Client, bzw die nächste Rack Middleware
136
- weitergegeben wird. Im Normalfall handelt es sich hierbei, wie
137
- in den vorangehenden Beispielen zu sehen war, um einen String. Es werden
138
- allerdings auch andere Werte akzeptiert.
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
- Man kann jedes Objekt zurückgeben, bei dem es sich entweder um einenen validen
141
- Rack-Rückgabewert, einen validen Rack-Body oder einen HTTP Status Code
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), Response
145
- Body (hört auf #each)]</tt>
146
- * Ein Array mit zwei Elementen: <tt>[Status (Fixnum), Response Body (hört auf
147
- #each)]</tt>
148
- * Ein Objekt, das auf <tt>#each</tt> hört und den an diese Methode übergebenen
149
- Block nur mit Strings als Übergabewerte aufruft.
150
- * Ein Fixnum, das den Status Code festlegt.
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
- ===Eigene Routenmuster
165
+
166
+ === Eigene Routen-Muster
167
+
163
168
  Wie oben schon beschrieben, ist Sinatra von Haus aus mit Unterstützung für
164
- String Muster und Reguläre Ausdrücke zum Abgleichen von Routen ausgestattet.
165
- Das muss aber noch nicht alles sein, man kann ohne größeren Aufwand auch
166
- eigene Routenmuster erstellen:
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 leichter:
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> Ordner ausgeliefert. Es ist
205
- möglich einen anderen Ort zu definieren, indem man die <tt>:public</tt> Option
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
- == Views / Templates
221
+
222
+ == Views/Templates
215
223
 
216
224
  Standardmäßig wird davon ausgegangen, dass sich Templates im
217
- <tt>./views</tt> Ordner befinden. Man kann jedoch einen anderen Ordner
218
- festlegen:
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 das man immer mit
223
- Symbols auf Templates verweisen sollte, auch wenn sich ein Template in einem
224
- Unterordner befindet (in diesen Fall <tt>:'subdir/template'</tt>).
225
- Renderingmethoden rendern jeden String direkt.
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+ gem wird benötigt, um Haml-Templates rendern zu können:
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
- {Hamls Optionen}[http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#options]
241
- können global durch die Sinatrakonfiguration gesetzt werden,
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 Haml-Format ist :xhtml
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+ gem wird benötigt, um Erubis-Templates rendern zu können:
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 mit Erubis zu ersetzen:
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+ gem wird benötigt, um Builder-Templates rendern zu können:
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+ gem wird benötigt, um Nokogiri-Templates rendern zu können:
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+ oder +sass+ gem wird benötigt, um Sass-Templates rendern zu können:
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 Optionen}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
326
- können global durch die Sinatra-Konfiguration gesetzt werden,
327
- siehe {Optionen und Konfiguration}[http://www.sinatrarb.com/configuration.html],
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
- Das +haml+ oder +sass+ gem wird benötigt, um SCSS-Templates rendern zu können:
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
- {Scss Optionen}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
350
- können global durch die Sinatra-Konfiguration gesetzt werden,
351
- siehe {Optionen und Konfiguration}[http://www.sinatrarb.com/configuration.html],
352
- und individuell überschrieben werden.
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 Scss-Style ist :nested
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+ gem wird benötigt, um Less-Templates rendern zu können:
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+ gem wird benötigt, um Liquid-Templates rendern zu können:
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 man aus Liquid-Templates heraus keine Methoden (abgesehen von +yield+)
387
- aufrufen kann, will man nahezu in allen Fällen +locals+ übergeben:
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+ gem wird benötigt, um Markdown-Templates rendern zu können:
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+ Methode aus anderen Templates heraus
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
- möglich Layouts zu verwenden, die in Markdown geschrieben sind. Es ist aber
419
- möglich einen anderen Renderer für das Template zu verwenden als für das
420
- Layout, indem man die <tt>:layout_engine</tt> option angibt:
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 dran, dass man solche Einstellungen auch global setzen kann:
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 Template) mit
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+ gem wird benötigt, um Textile-Templates rendern zu können:
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 am sinnvollsten Textile in Kombination mit einer anderen Template-Engine
469
- zu nutzen:
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+ Methode aus anderen Templates heraus
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
- möglich Layouts zu verwenden, die in Textile geschrieben sind. Es ist aber
481
- möglich einen anderen Renderer für das Template zu verwenden als für das
482
- Layout, indem man die <tt>:layout_engine</tt> option angibt:
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
- <tt>./views/layout.erb</tt> als Layout
490
- rendern.
507
+ Das wird <tt>./views/index.textile</tt> mit <tt>./views/layout.erb</tt> als
508
+ Layout rendern.
491
509
 
492
- Denk dran, dass man solche Einstellungen auch global setzen kann:
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 Template)
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+ gem wird benötigt, um RDoc-Templates rendern zu können:
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 am sinnvollsten RDoc in Kombination mit einer anderen Template-Engine
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+ Methode aus anderen Templates heraus
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
- möglich Layouts zu verwenden, die in RDoc geschrieben sind. Es ist aber
530
- möglich einen anderen Renderer für das Template zu verwenden als für das
531
- Layout, indem man die <tt>:layout_engine</tt> option angibt:
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 dran, dass man solche Einstellungen auch global setzen kann:
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 Template) mit
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+ gem wird benötigt, um Radius-Templates rendern zu können:
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 man aus Radius-Templates heraus keine Methoden (abgesehen von +yield+)
567
- aufrufen kann, will man nahezu in allen Fällen +locals+ übergeben:
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+ gem wird benötigt, um Markaby-Templates rendern zu können:
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+ gem wird benötigt, um Slim-Templates rendern zu können:
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 +coffee+-script gem und mindestens eine der folgenden Optionen werden
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 kannst Du CoffeeScript Templates in Deiner App rendern:
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 im selben Kontext ausgeführt wie Routen. Instanzvariablen in
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> explizit
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 werden:
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 Engine zuzuordnen, benutzt man am besten
699
- <tt>Tilt.register</tt>. Wenn man zum Beispiel die Dateiendung +tt+ für Textile
700
- Templates nutzen möchte, so lässt sich das wie folgt bewerkstelligen:
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
- Zu allererst muss man die Engine bei Tilt registrieren und danach eine
707
- Rendering-Methode erstellen:
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
- um mehr über Tilt zu lernen.
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 immer vor jedem Request in dem selben Kontext wie danach
726
- die Routen ausgeführt. So kann man etwa Request und Antwort ändern. Gesetzte
727
- Instanzvariablen in Filtern können in Routen und Templates verwendet werden:
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 im selben Kontext ausgeführt, und
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-Filterm verwendet werden:
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 Pattern ausgestattet werden, welche auf
748
- den Request-Pfad passen müssen, damit der Filter ausgeführt wird:
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, werden sogenannte Helfer-Methoden
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
- ===Sessions verwenden
815
+
816
+ === Sessions verwenden
785
817
  Sessions werden verwendet, um Zustände zwischen den Requests zu speichern.
786
- Sind sie aktiviert, hat man einen Session Hash pro Benutzer Session:
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 man eine
801
- Rack Session Middleware verwenden. Dann aber *nicht* <tt>enable :sessions</tt>
802
- aufrufen, sondern die Middleware wie üblich in das Programm einbinden:
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 Secret signiert. Da sich jedoch dieses Geheimwort
816
- bei jedem Neustart der Applikation automatisch ändert, ist es sinnvoll selber
817
- eins zu wählen, damit alle Instanzen der Applikation sich das gleiche Session
818
- Secret teilen:
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 stoppen eines Request in einem Filter oder einer Route:
857
+ Zum sofortigen Stoppen eines Request in einem Filter oder einer Route:
825
858
 
826
859
  halt
827
860
 
828
- Der Status kann beim stoppen auch angegeben werden:
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 Headers:
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 verfehlt!'
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 Fehler wird zurückgegeben, wenn kein treffendes Routen-Muster
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 man +"bar"+ in eine Helfermethode umwandelt, auf die +/foo+
881
- und +/bar+ zugreifen können.
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
- Wenn der Request innerhalb der gleichen App-Instanz aufgerufen und keine
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 Code und Header setzen
925
+ === Body, Status-Code und Header setzen
890
926
 
891
- Es ist möglich und empfohlen den Status Code sowie den Response Body mit einem
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 Helfermethode +body+ bewerkstelligen. Wird +body+
895
- verwendet, dann lässt sich der Body jederzeit über diese Methode aufrufen:
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 Rack
906
- Handler ausgeführt wird (lässt sich z.B. zur Umsetzung von Streaming einsetzen,
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 Code und Header setzen:
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+, liest ein Aufrufen von +headers+ oder +status+ ohne
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+ Helfer verwendet werden:
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 man die +url+ Helfermethode nutzen, so z.B.
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 Proxies und Rack Router genommen.
982
+ Soweit vorhanden, wird Rücksicht auf Proxys und Rack-Router genommen.
945
983
 
946
- Diese Methode ist ebenso über den Alias +to+ zu erreichen (siehe Beispiel
984
+ Diese Methode ist ebenso über das Alias +to+ zu erreichen (siehe Beispiel
947
985
  unten).
948
986
 
949
- === Browserumleitung
950
987
 
951
- Eine Browserumleitung kann mit Hilfe der +redirect+ Hilfsmethode erreicht
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+ Methode behandelt:
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 Du falsch'
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, fügt man sie entweder dem Query
976
- hinzu:
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
- Oder man verwendet eine Session:
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 versenden von Dateien kann die <tt>send_file</tt> Helfermethode verwende
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. Standartwert ist der eigentliche Dateiname
1047
+ Dateiname als Response. Standardwert ist der eigentliche Dateiname.
1008
1048
 
1009
1049
  [last_modified]
1010
- Wert für den Last-Modified Header, Standardwert ist +mtime+ der Datei.
1050
+ Wert für den Last-Modified-Header, Standardwert ist +mtime+ der Datei.
1011
1051
 
1012
1052
  [type]
1013
- content type der verwendet werden soll. Wird, wenn nicht angegeben, von der
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 Header. Standardwert ist die Dateigröße
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+-Objeket der eigehenden Anfrage kann man vom Anfragescope aus
1031
- zugreifen:
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 Body des Clients (siehe unten)
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-headers
1088
+ request["SOME_HEADER"] # Wert des SOME_HEADER-Headers
1048
1089
  request.referrer # der Referrer des Clients oder '/'
1049
- request.user_agent # User Agent (genutzt von :agent-Bedingung)
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 IP-Addresse
1095
+ request.ip # Client-IP-Addresse
1055
1096
  request.secure? # false (wäre true bei SSL)
1056
- request.forwarded? # true (wenn hinter Reverse Proxy)
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> sind
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 einn IO- oder StringIO-Objekt:
1110
+ Der <tt>request.body</tt> ist ein IO- oder StringIO-Objekt:
1070
1111
 
1071
1112
  post "/api" do
1072
- request.body.rewind # falls schon jemand davon gelesen hat
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 werden soll und nicht
1080
- im Browser angezeigt wird, kann der +attachment+ Helfer verwendet werden:
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 man einen Dateinamen als Parameter hinzufügen:
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 Dateien
1137
+ === Nachschlagen von Template-Dateien
1096
1138
 
1097
- Die <tt>find_template</tt> Helfermethode wird genutzt, um Template Dateien zum
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 Nachschlagemechanismen einzubauen. Zum Beispiel
1106
- dann, wenn man mehr als nur ein view-Verzeichnis verwenden möchte:
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 es verschiedene Vereichnisse für verschiedene Engines
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 man eine Extension schreiben und diese dann mit anderen
1130
- teilen!
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 Performanceproblem, da +render+
1176
+ möglichen Pfaden gesucht. Das ergibt kein Performance-Problem, da +render+
1135
1177
  +block+ verwendet, sobald eine Datei gefunden wurde. Ebenso werden
1136
- Templatepfade samt Inhalt gecached, solange man nicht im Entwicklungsmodus ist.
1137
- Das sollte man im Hinterkopf behalten, wenn man irgendwelche verrückten
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
- # Dynamische Einstellungen mit Blöcken
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 Umgebungsvariable) auf
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
- Zugang zu diesen Einstellungen bekommt man über +settings+:
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 man hinter einem
1194
- Reverse Proxy ist, der nicht ordentlich eingerichtet ist.
1195
- Beachte, dass die +url+ Helfermethode nach wie vor
1196
- absolute URLs erstellen wird, es sei denn man gibt als
1197
- zweiten Parameter +false+ an.
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 Types werden hier automatisch der Helfermethode
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 anstellen von
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 Address an die gebunden wird (Standardwert: 0.0.0.0).
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> eingestellt oder
1224
- <tt>"development"</tt> soweit ersteres nicht vorhanden.
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 Prozess gleichzeitig verarbeitet werden.
1273
+ Ruby-Prozess gleichzeitig verarbeitet werden.
1230
1274
 
1231
- Eingeschaltet wenn die Application Thread-Safe ist.
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 Formulardaten in
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 Art und Weise verhält sich
1244
- <tt>redirect '/foo'</tt> so als ob es ein
1245
- <tt>redirect to('/foo')</tt> wäre.
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 selbständig erledigen kann.
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 Handler laufen im selben Kontext wie Routen und Filter, was bedeutet,
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> Exception geworfen wird oder der
1294
- Statuscode 404 ist, wird der <tt>not_found</tt> Handler ausgeführt:
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+ Handler wird immer ausgeführt, wenn eine Exception in einem
1303
- Routenblock oder in einen Filter geworfen wurde. Die Exception kann über die
1304
- <tt>sinatra.error</tt> Rack-Variable angesprochen werden:
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
- 'Was passiert ist...' + request.env['sinatra.error'].message
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 schlechtes'
1366
+ raise MeinFehler, 'etwas Schlimmes ist passiert'
1320
1367
  end
1321
1368
 
1322
- Bekommt man dieses:
1369
+ bekommt man dieses:
1323
1370
 
1324
- Was passiert ist... etwas schlechtes
1371
+ Au weia, etwas Schlimmes ist passiert
1325
1372
 
1326
- Alternativ kann ein Error Handler auch für Statuscode definiert werden:
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 Statuscode-Bereich:
1383
+ Oder ein Status-Code-Bereich:
1337
1384
 
1338
1385
  error 400..510 do
1339
- 'Bums'
1386
+ 'Hallo?'
1340
1387
  end
1341
1388
 
1342
- Sinatra setzt verschiedene <tt>not_found</tt> und <tt>error</tt>
1343
- Handler in der Development Umgebung.
1389
+ Sinatra setzt verschiedene <tt>not_found</tt>- und <tt>error</tt>-Handler in
1390
+ der Development-Umgebung.
1391
+
1344
1392
 
1345
- == Rack Middleware
1393
+ == Rack-Middleware
1346
1394
 
1347
- Sinatra baut auf Rack[http://rack.rubyforge.org/], einem minimalen
1348
- Standardinterface für Ruby Webframeworks. Eines der interessantesten
1349
- Features für Entwickler ist der Support von Middleware, die
1350
- zwischen den Server und die Anwendung geschaltet wird und so HTTP
1351
- Request und/oder Antwort überwachen und/oder manipulieren kann.
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 erstellen von Middleware-Verkettungen mit der Top-Level
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] DSL
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 entgegen nimmt:
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 standard Middleware für Logging, Debugging,
1376
- URL-Routing, Authentifizierung und Session-Verarbeitung.
1377
- Sinatra verwendet viele von diesen Komponenten automatisch, abhängig von der
1378
- Konfiguration. So muss man häufig +use+ nicht explizit verwenden.
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 Tests können mit jedem auf Rack aufbauendem Test Framework geschrieben
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 Modul und die Sinatra::TestHarness
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
- == Sinatra::Base - Middleware, Bibliotheken, und modulare Anwendungen
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
- Das Definitieren einer Top-Level Anwendung funktioniert gut für
1418
- Microanwendungen, hat aber Nachteile, wenn man wiederverwendbare Komponenten
1419
- wie Middleware, Rails Metal, einfache Bibliotheken mit Server Komponenten
1420
- oder auch Sinatra Erweiterungen bauen will.
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 +config.ru+ Datei oder als Serverkomponente
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 die selben wie die
1445
- der Top-Level DSL. Die meisten Top-Level Anwendungen können mit nur zwei
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 Methoden in den Top-Level- Namespace importiert.
1451
- * Alle Routen, Error Handler, Filter und Optionen der Applikation müssen in
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 default deaktiviert. Das betrifft auch den eingebauten Server. Siehe
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 Prozess laufen. Sollten mehrere
1468
- zum Einsatz kommen, muss auf modular umgestiegen werden.
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 Delegationsmethoden. Sollte die
1471
- Applikation als gem/Bibliothek zum Einsatz kommen, sollte auf modular
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 man modulare und klassische Elemente nicht
1475
- vermischen sollte.
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 Datei direkt ausgeführt wird
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>, die es erlaubt irgendeinen Rack Handler zu
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
- Sowie eine dazugehörige <tt>config.ru</tt>:
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
- Anzeichen dafür, dass man eine <tt>config.ru</tt> braucht:
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
- * Man möchte einen anderen Rack Handler verwenden (Passenger, Unicorn,
1593
+ * Es soll ein anderer Rack-Handler verwendet werden (Passenger, Unicorn,
1540
1594
  Heroku, ...).
1541
- * Man möchte mehr als eine Subklasse von <tt>Sinatra::Base</tt>.
1542
- * Man möchte Sinatra als Middleware verwenden, nicht als Endpoint.
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, man
1552
- kann außerdem jede Sinatra-Anwendung selbst als Middlware vor jeden beliebigen
1553
- Rack-Endpunkt hängen. Bei diesem Endpunkt muss es sich nicht um eine andere
1554
- Sinatra-Anwendung handen, es kann jede andere Rack-Anwendung sein
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 (scope) legt fest, welche Methoden und Variablen zur
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
- Jede Sinatra-Anwendung entspricht einer Sinatra::Base-Subklasse. Falls man die
1594
- Top-Level-DSL verwendet (<tt>require 'sinatra'</tt>), so handelt es sich
1595
- hierbei um Sinatra::Application, andernfalls is es jene Subklasse, die man
1596
- explizit angelegt hat. Auf Klassenebene stehen Methoden wie +get+ oder +before+
1597
- zur Verfügung, man hat aber keinen Zugriff auf das +request+-Object oder die
1598
- +session+, da nur eine einzige Klasse für alle eingehenden Anfragen genutzt
1599
- wird.
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 Anwendungsscope!
1665
+ # Hey, ich bin nicht mehr im Anwendungs-Scope!
1610
1666
  end
1611
1667
  end
1612
1668
 
1613
- Im Anwendungsscope befindet man sich:
1669
+ Im Anwendungs-Scope befindet man sich:
1614
1670
 
1615
- * In der Anwendungsklasse.
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
- Man kann auf das Scope-Object (die Klasse) wie folgt zugreifen:
1676
+ Auf das Scope-Objekt (die Klasse) kann wie folgt zugegriffen werden:
1621
1677
 
1622
- * Über das Objekt, dass an den +configure+-Block übergeben wird (<tt>configure
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
- Für jede eingehende Anfrage wird eine neue Instanz der Anwendungsklasse
1629
- erstellt und alle Handlers werden in diesem Scope ausgeführt. Aus diesem Scope
1630
- heraus kann man auf +request+ oder +session+ zugreifen und Methoden wie +erb+
1631
- oder +haml+ aufrufen. Man kann mit der +settings+ Methode außerdem auf den
1632
- Anwengungsscope zugreifen:
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 Anwendungsscope!
1692
+ # Hey, ich bin im Anwendungs-Scope!
1636
1693
  get '/neue_route/:name' do
1637
- # Anfragescope für '/neue_route/:name'
1694
+ # Anfrage-Scope für '/neue_route/:name'
1638
1695
  @value = 42
1639
1696
 
1640
1697
  settings.get "/#{params[:name]}" do
1641
- # Anfragescope für "/#{params[:name]}"
1642
- @value # => nil (nicht die gleiche Anfrage)
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 Anfragescope befindet man sich:
1706
+ Im Anfrage-Scope befindet man sich:
1650
1707
 
1651
- * In get/head/post/put/delete Blöcken
1652
- * In before/after Filtern
1653
- * In Helfermethoden
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 Klassenscope
1659
- weitergeleitet. Dieser verhält sich jedoch nicht 100%ig wie der Klassenscope,
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 man kann nicht auf
1662
- die Variablen des Klassenscopes zugreifen (mit anderen Worten: man hat ein
1663
- anderes +self+). Man kann mit <tt>Sinatra::Delegator.delegate
1664
- :methoden_name</tt> auch weitere Delegationen hinzufügen.
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 man <tt>require 'sinatra'</tt> aufgerufen hat.
1669
- * In einem Objekt, dass mit dem <tt>Sinatra::Delegator</tt> mixin erweitert
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 Anwendungen können direkt von der Kommandozeile aus gestartet werden:
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 Server/Handler setzen (Standard ist thin)
1690
- -x # Mutex lock einschalten (Standard ist off)
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 Implementation, das von Sinatra Versionen vor
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 Einbussen in der Performance. Ebenso muss Sinatra mit Rack 1.1.x laufen,
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 sind mit 1.9. Version 1.9.0p0 sollte nicht
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.2) wird offiziell unter Ausnahme von Textile
1719
- Templates unterstützt.
1778
+ Rubinius (rbx >= 1.2.3) wird offiziell unter Einbezug aller Templates
1779
+ unterstützt.
1720
1780
 
1721
1781
  [ JRuby ]
1722
- Jruby wird offiziell unterstützt (JRuby >= 1.5.6). Probleme mit Template
1723
- Bibliotheken Dritter sind nicht bekannt. Falls JRuby zum Einsatz kommt, sollte
1724
- aber darauf geachtet werden, dass ein JRuby Rack Handler zum Einsatz kommen –
1725
- der Thin Web Server wird bisher noch nicht unterstütz.
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 Versionen ein Auge haben.
1789
+ Weiterhin werden wir auf kommende Ruby-Versionen ein Auge haben.
1728
1790
 
1729
- Die nachfolgend aufgeführten Ruby Implementationen werden offiziell nicht von
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
- dann gehen wir davon aus, dass es nicht an Sinatra, sondern an der jeweiligen
1799
+ wir davon ausgehen, dass es nicht an Sinatra sondern an der jeweiligen
1740
1800
  Implentierung liegt.
1741
1801
 
1742
- Sinatra sollte auf jedem Betriebssystem laufen, dass den gewählten Ruby
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, kannst Du den Master Branch verwenden. Er
1747
- sollte recht stabil sein. Ebenso gibt es von Zeit zu Zeit prerelease Gems, die
1748
- du so installierst:
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
- Soweit du Bundler noch nicht installiert hast, folgendes:
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
- Dann erstellst Du in deinem Projektverzeichnis eine sog. +Gemfile+ Datei mit
1762
- folgendem Inhalt:
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 haml verwendest...
1836
+ gem 'haml' # z.B. wenn du Haml verwendest...
1769
1837
  gem 'activerecord', '~> 3.0' # ...oder ActiveRecord 3.x
1770
1838
 
1771
- Beachte: Du solltest hier alle Abhängigkeiten eintragen. Sinatras eigenen,
1772
- direkten Abhängigkeiten (Tilt und Rack) werden von Bundler automatisch aus dem
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 App starten:
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 den neuesten Stand von Sinatras Code zu sein, kann eine lokale Kopie
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> Ordner zum <tt>LOAD_PATH</tt> in
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 Code von Zeit zu Zeit zu aktualisieren:
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 gem gebaut werden:
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 du normalerweise gems als root installierst, sollte die letzte Zeile
1814
- so lauten:
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
- Sinatra folgt dem sog. {Semantic Versioning}[http://semver.org/], d.h. SemVer
1821
- und SemVerTag.
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 Website}[http://sinatra.github.com/] - Ergänzende Dokumentation,
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 Tracker}[http://github.com/sinatra/sinatra/issues]
1901
+ * {Issue-Tracker}[http://github.com/sinatra/sinatra/issues]
1830
1902
  * {Twitter}[http://twitter.com/sinatra]
1831
- * {Mailingliste}[http://groups.google.com/group/sinatrarb]
1903
+ * {Mailing-Liste}[http://groups.google.com/group/sinatrarb]
1832
1904
  * {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] auf http://freenode.net
1833
1905