sinatra 1.4.6 → 2.0.0

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.

Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/AUTHORS.md +5 -2
  3. data/{CHANGES → CHANGELOG.md} +126 -46
  4. data/CONTRIBUTING.md +100 -0
  5. data/Gemfile +12 -17
  6. data/LICENSE +5 -2
  7. data/MAINTENANCE.md +42 -0
  8. data/README.de.md +711 -466
  9. data/README.es.md +206 -171
  10. data/README.fr.md +370 -344
  11. data/README.hu.md +44 -10
  12. data/README.ja.md +300 -210
  13. data/README.ko.md +230 -191
  14. data/README.md +675 -528
  15. data/README.pt-br.md +149 -115
  16. data/README.pt-pt.md +65 -65
  17. data/README.ru.md +198 -97
  18. data/README.zh.md +1943 -1237
  19. data/Rakefile +72 -49
  20. data/SECURITY.md +35 -0
  21. data/lib/sinatra/base.rb +141 -207
  22. data/lib/sinatra/indifferent_hash.rb +150 -0
  23. data/lib/sinatra/main.rb +1 -0
  24. data/lib/sinatra/show_exceptions.rb +70 -56
  25. data/lib/sinatra/version.rb +1 -1
  26. data/sinatra.gemspec +19 -7
  27. metadata +32 -163
  28. data/test/asciidoctor_test.rb +0 -72
  29. data/test/base_test.rb +0 -167
  30. data/test/builder_test.rb +0 -91
  31. data/test/coffee_test.rb +0 -96
  32. data/test/compile_test.rb +0 -183
  33. data/test/contest.rb +0 -91
  34. data/test/creole_test.rb +0 -65
  35. data/test/delegator_test.rb +0 -160
  36. data/test/encoding_test.rb +0 -20
  37. data/test/erb_test.rb +0 -116
  38. data/test/extensions_test.rb +0 -98
  39. data/test/filter_test.rb +0 -487
  40. data/test/haml_test.rb +0 -109
  41. data/test/helper.rb +0 -132
  42. data/test/helpers_test.rb +0 -1917
  43. data/test/integration/app.rb +0 -79
  44. data/test/integration_helper.rb +0 -236
  45. data/test/integration_test.rb +0 -104
  46. data/test/less_test.rb +0 -69
  47. data/test/liquid_test.rb +0 -77
  48. data/test/mapped_error_test.rb +0 -285
  49. data/test/markaby_test.rb +0 -80
  50. data/test/markdown_test.rb +0 -85
  51. data/test/mediawiki_test.rb +0 -68
  52. data/test/middleware_test.rb +0 -68
  53. data/test/nokogiri_test.rb +0 -67
  54. data/test/public/favicon.ico +0 -0
  55. data/test/rabl_test.rb +0 -89
  56. data/test/rack_test.rb +0 -45
  57. data/test/radius_test.rb +0 -59
  58. data/test/rdoc_test.rb +0 -66
  59. data/test/readme_test.rb +0 -130
  60. data/test/request_test.rb +0 -100
  61. data/test/response_test.rb +0 -63
  62. data/test/result_test.rb +0 -76
  63. data/test/route_added_hook_test.rb +0 -59
  64. data/test/routing_test.rb +0 -1412
  65. data/test/sass_test.rb +0 -115
  66. data/test/scss_test.rb +0 -88
  67. data/test/server_test.rb +0 -56
  68. data/test/settings_test.rb +0 -582
  69. data/test/sinatra_test.rb +0 -12
  70. data/test/slim_test.rb +0 -102
  71. data/test/static_test.rb +0 -236
  72. data/test/streaming_test.rb +0 -149
  73. data/test/stylus_test.rb +0 -90
  74. data/test/templates_test.rb +0 -382
  75. data/test/textile_test.rb +0 -65
  76. data/test/views/a/in_a.str +0 -1
  77. data/test/views/ascii.erb +0 -2
  78. data/test/views/b/in_b.str +0 -1
  79. data/test/views/calc.html.erb +0 -1
  80. data/test/views/error.builder +0 -3
  81. data/test/views/error.erb +0 -3
  82. data/test/views/error.haml +0 -3
  83. data/test/views/error.sass +0 -2
  84. data/test/views/explicitly_nested.str +0 -1
  85. data/test/views/foo/hello.test +0 -1
  86. data/test/views/hello.asciidoc +0 -1
  87. data/test/views/hello.builder +0 -1
  88. data/test/views/hello.coffee +0 -1
  89. data/test/views/hello.creole +0 -1
  90. data/test/views/hello.erb +0 -1
  91. data/test/views/hello.haml +0 -1
  92. data/test/views/hello.less +0 -5
  93. data/test/views/hello.liquid +0 -1
  94. data/test/views/hello.mab +0 -1
  95. data/test/views/hello.md +0 -1
  96. data/test/views/hello.mediawiki +0 -1
  97. data/test/views/hello.nokogiri +0 -1
  98. data/test/views/hello.rabl +0 -2
  99. data/test/views/hello.radius +0 -1
  100. data/test/views/hello.rdoc +0 -1
  101. data/test/views/hello.sass +0 -2
  102. data/test/views/hello.scss +0 -3
  103. data/test/views/hello.slim +0 -1
  104. data/test/views/hello.str +0 -1
  105. data/test/views/hello.styl +0 -2
  106. data/test/views/hello.test +0 -1
  107. data/test/views/hello.textile +0 -1
  108. data/test/views/hello.wlang +0 -1
  109. data/test/views/hello.yajl +0 -1
  110. data/test/views/layout2.builder +0 -3
  111. data/test/views/layout2.erb +0 -2
  112. data/test/views/layout2.haml +0 -2
  113. data/test/views/layout2.liquid +0 -2
  114. data/test/views/layout2.mab +0 -2
  115. data/test/views/layout2.nokogiri +0 -3
  116. data/test/views/layout2.rabl +0 -3
  117. data/test/views/layout2.radius +0 -2
  118. data/test/views/layout2.slim +0 -3
  119. data/test/views/layout2.str +0 -2
  120. data/test/views/layout2.test +0 -1
  121. data/test/views/layout2.wlang +0 -2
  122. data/test/views/nested.str +0 -1
  123. data/test/views/utf8.erb +0 -2
  124. data/test/wlang_test.rb +0 -87
  125. data/test/yajl_test.rb +0 -86
data/README.de.md CHANGED
@@ -1,28 +1,31 @@
1
1
  # Sinatra
2
2
 
3
+ [![Build Status](https://secure.travis-ci.org/sinatra/sinatra.svg)](http://travis-ci.org/sinatra/sinatra)
4
+
3
5
  *Wichtig: Dieses Dokument ist eine Übersetzung aus dem Englischen und unter
4
- Umständen nicht auf dem aktuellen Stand (aktuell Sinatra 1.4.5).*
6
+ Umständen nicht auf dem aktuellen Stand (aktuell Sinatra 2.0
7
+ Vorabausgabe).*
5
8
 
6
9
  Sinatra ist eine
7
- [DSL](http://de.wikipedia.org/wiki/Domänenspezifische_Sprache), die das
10
+ [DSL](https://de.wikipedia.org/wiki/Domänenspezifische_Sprache), die das
8
11
  schnelle Erstellen von Webanwendungen in Ruby mit minimalem Aufwand
9
12
  ermöglicht:
10
13
 
11
- Sinatra via `rubygems` installieren:
12
-
13
- ```shell
14
- gem install sinatra
15
- ```
16
-
17
- Eine Datei mit dem Namen `myapp.rb` erstellen:
18
-
19
14
  ```ruby
15
+ # myapp.rb
20
16
  require 'sinatra'
17
+
21
18
  get '/' do
22
19
  'Hallo Welt!'
23
20
  end
24
21
  ```
25
22
 
23
+ Sinatra-Gem installieren:
24
+
25
+ ```shell
26
+ gem install sinatra
27
+ ```
28
+
26
29
  und im gleichen Verzeichnis ausführen:
27
30
 
28
31
  ```shell
@@ -32,97 +35,104 @@ ruby myapp.rb
32
35
  Die Seite kann nun unter [http://localhost:4567](http://localhost:4567)
33
36
  aufgerufen werden.
34
37
 
38
+ Es wird empfohlen `gem installl thin` auszuführen, Sinatra wird dann
39
+ diesen Server verwenden.
40
+
35
41
  ## Inhalt
36
42
 
37
- * [Sinatra](#sinatra)
38
- * [Routen](#routen)
39
- * [Bedingungen](#bedingungen)
40
- * [Rückgabewerte](#rckgabewerte)
41
- * [Eigene Routen-Muster](#eigene-routen-muster)
42
- * [Statische Dateien](#statische-dateien)
43
- * [Views/Templates](#viewstemplates)
44
- * [Direkte Templates](#direkte-templates)
45
- * [Verfügbare Templatesprachen](#verfgbare-templatesprachen)
46
- * [Haml Templates](#haml-templates)
47
- * [Erb Templates](#erb-templates)
48
- * [Builder Templates](#builder-templates)
49
- * [Nokogiri Templates](#nokogiri-templates)
50
- * [Sass Templates](#sass-templates)
51
- * [SCSS Templates](#scss-templates)
52
- * [Less Templates](#less-templates)
53
- * [Liquid Templates](#liquid-templates)
54
- * [Markdown Templates](#markdown-templates)
55
- * [Textile Templates](#textile-templates)
56
- * [RDoc Templates](#rdoc-templates)
57
- * [AsciiDoc Templates](#asciidoc-templates)
58
- * [Radius Templates](#radius-templates)
59
- * [Markaby Templates](#markaby-templates)
60
- * [RABL Templates](#rabl-templates)
61
- * [Slim Templates](#slim-templates)
62
- * [Creole Templates](#creole-templates)
63
- * [MediaWiki Templates](#mediawiki-templates)
64
- * [CoffeeScript Templates](#coffeescript-templates)
65
- * [Stylus Templates](#stylus-templates)
66
- * [Yajl Templates](#yajl-templates)
67
- * [WLang Templates](#wlang-templates)
68
- * [Auf Variablen in Templates zugreifen](#auf-variablen-in-templates-zugreifen)
69
- * [Templates mit `yield` und verschachtelte Layouts](#templates-mit-yield-und-verschachtelte-layouts)
70
- * [Inline-Templates](#inline-templates)
71
- * [Benannte Templates](#benannte-templates)
72
- * [Dateiendungen zuordnen](#dateiendungen-zuordnen)
73
- * [Eine eigene Template-Engine hinzufügen](#eine-eigene-template-engine-hinzufgen)
74
- * [Eigene Methoden zum Aufsuchen von Templates verwenden](#eigene-methoden-zum-aufsuchen-von-templates-verwenden)
75
- * [Filter](#filter)
76
- * [Helfer](#helfer)
77
- * [Sessions verwenden](#sessions-verwenden)
78
- * [Anhalten](#anhalten)
79
- * [Weiterspringen](#weiterspringen)
80
- * [Eine andere Route ansteuern](#eine-andere-route-ansteuern)
81
- * [Body, Status-Code und Header setzen](#body-status-code-und-header-setzen)
82
- * [Response-Streams](#response-streams)
83
- * [Logger](#logger)
84
- * [Mime-Types](#mime-types)
85
- * [URLs generieren](#urls-generieren)
86
- * [Browser-Umleitung](#browser-umleitung)
87
- * [Cache einsetzen](#cache-einsetzen)
88
- * [Dateien versenden](#dateien-versenden)
89
- * [Das Request-Objekt](#das-request-objekt)
90
- * [Anhänge](#anhnge)
91
- * [Umgang mit Datum und Zeit](#umgang-mit-datum-und-zeit)
92
- * [Nachschlagen von Template-Dateien](#nachschlagen-von-template-dateien)
93
- * [Konfiguration](#konfiguration)
94
- * [Einstellung des Angriffsschutzes](#einstellung-des-angriffsschutzes)
95
- * [Mögliche Einstellungen](#mgliche-einstellungen)
96
- * [Umgebungen](#umgebungen)
97
- * [Fehlerbehandlung](#fehlerbehandlung)
98
- * [Nicht gefunden](#nicht-gefunden)
99
- * [Fehler](#fehler)
100
- * [Rack-Middleware](#rack-middleware)
101
- * [Testen](#testen)
102
- * [Sinatra::Base - Middleware, Bibliotheken und modulare Anwendungen](#sinatrabase---middleware-bibliotheken-und-modulare-anwendungen)
103
- * [Modularer vs. klassischer Stil](#modularer-vs-klassischer-stil)
104
- * [Eine modulare Applikation bereitstellen](#eine-modulare-applikation-bereitstellen)
105
- * [Eine klassische Anwendung mit einer config.ru verwenden](#eine-klassische-anwendung-mit-einer-configru-verwenden)
106
- * [Wann sollte eine config.ru-Datei verwendet werden?](#wann-sollte-eine-configru-datei-verwendet-werden)
107
- * [Sinatra als Middleware nutzen](#sinatra-als-middleware-nutzen)
108
- * [Dynamische Applikationserstellung](#dynamische-applikationserstellung)
109
- * [Geltungsbereich und Bindung](#geltungsbereich-und-bindung)
110
- * [Anwendungs- oder Klassen-Scope](#anwendungs--oder-klassen-scope)
111
- * [Anfrage- oder Instanz-Scope](#anfrage--oder-instanz-scope)
112
- * [Delegation-Scope](#delegation-scope)
113
- * [Kommandozeile](#kommandozeile)
114
- * [Systemanforderungen](#systemanforderungen)
115
- * [Der neuste Stand (The Bleeding Edge)](#der-neuste-stand-the-bleeding-edge)
116
- * [Mit Bundler](#mit-bundler)
117
- * [Eigenes Repository](#eigenes-repository)
118
- * [Gem erstellen](#gem-erstellen)
119
- * [Versions-Verfahren](#versions-verfahren)
120
- * [Mehr](#mehr)
43
+ - [Sinatra](#sinatra)
44
+ * [Inhalt](#inhalt)
45
+ * [Routen](#routen)
46
+ + [Bedingungen](#bedingungen)
47
+ + [Rückgabewerte](#rückgabewerte)
48
+ + [Eigene Routen-Muster](#eigene-routen-muster)
49
+ * [Statische Dateien](#statische-dateien)
50
+ * [Views/Templates](#views-templates)
51
+ + [Direkte Templates](#direkte-templates)
52
+ + [Verfügbare Templatesprachen](#verfügbare-templatesprachen)
53
+ - [Haml Templates](#haml-templates)
54
+ - [Erb Templates](#erb-templates)
55
+ - [Builder Templates](#builder-templates)
56
+ - [Nokogiri Templates](#nokogiri-templates)
57
+ - [Sass Templates](#sass-templates)
58
+ - [SCSS Templates](#scss-templates)
59
+ - [Less Templates](#less-templates)
60
+ - [Liquid Templates](#liquid-templates)
61
+ - [Markdown Templates](#markdown-templates)
62
+ - [Textile Templates](#textile-templates)
63
+ - [RDoc Templates](#rdoc-templates)
64
+ - [AsciiDoc Templates](#asciidoc-templates)
65
+ - [Radius Templates](#radius-templates)
66
+ - [Markaby Templates](#markaby-templates)
67
+ - [RABL Templates](#rabl-templates)
68
+ - [Slim Templates](#slim-templates)
69
+ - [Creole Templates](#creole-templates)
70
+ - [MediaWiki Templates](#mediawiki-templates)
71
+ - [CoffeeScript Templates](#coffeescript-templates)
72
+ - [Stylus Templates](#stylus-templates)
73
+ - [Yajl Templates](#yajl-templates)
74
+ - [WLang Templates](#wlang-templates)
75
+ + [Auf Variablen in Templates zugreifen](#auf-variablen-in-templates-zugreifen)
76
+ + [Templates mit `yield` und verschachtelte Layouts](#templates-mit--yield--und-verschachtelte-layouts)
77
+ + [Inline-Templates](#inline-templates)
78
+ + [Benannte Templates](#benannte-templates)
79
+ + [Dateiendungen zuordnen](#dateiendungen-zuordnen)
80
+ + [Eine eigene Template-Engine hinzufügen](#eine-eigene-template-engine-hinzuf-gen)
81
+ + [Eigene Methoden zum Aufsuchen von Templates verwenden](#eigene-methoden-zum-aufsuchen-von-templates-verwenden)
82
+ * [Filter](#filter)
83
+ * [Helfer](#helfer)
84
+ + [Sessions verwenden](#sessions-verwenden)
85
+ - [Sitzungseinstellungen](#sitzungseinstellungen)
86
+ - [Eigene Sitzungs-Middleware auswählen](#eigene-sitzungs-middleware-ausw-hlen)
87
+ + [Anhalten](#anhalten)
88
+ + [Weiterspringen](#weiterspringen)
89
+ + [Eine andere Route ansteuern](#eine-andere-route-ansteuern)
90
+ + [Body, Status-Code und Header setzen](#body--status-code-und-header-setzen)
91
+ + [Response-Streams](#response-streams)
92
+ + [Logger](#logger)
93
+ + [Mime-Types](#mime-types)
94
+ + [URLs generieren](#urls-generieren)
95
+ + [Browser-Umleitung](#browser-umleitung)
96
+ + [Cache einsetzen](#cache-einsetzen)
97
+ + [Dateien versenden](#dateien-versenden)
98
+ + [Das Request-Objekt](#das-request-objekt)
99
+ + [Anhänge](#anhänge)
100
+ + [Umgang mit Datum und Zeit](#umgang-mit-datum-und-zeit)
101
+ + [Nachschlagen von Template-Dateien](#nachschlagen-von-template-dateien)
102
+ + [Konfiguration](#konfiguration)
103
+ - [Einstellung des Angriffsschutzes](#einstellung-des-angriffsschutzes)
104
+ - [Mögliche Einstellungen](#m-gliche-einstellungen)
105
+ * [Umgebungen](#umgebungen)
106
+ * [Fehlerbehandlung](#fehlerbehandlung)
107
+ + [Nicht gefunden](#nicht-gefunden)
108
+ + [Fehler](#fehler)
109
+ * [Rack-Middleware](#rack-middleware)
110
+ * [Testen](#testen)
111
+ * [Sinatra::Base - Middleware, Bibliotheken und modulare Anwendungen](#sinatra--base---middleware--bibliotheken-und-modulare-anwendungen)
112
+ + [Modularer vs. klassischer Stil](#modularer-vs-klassischer-stil)
113
+ + [Eine modulare Applikation bereitstellen](#eine-modulare-applikation-bereitstellen)
114
+ + [Eine klassische Anwendung mit einer config.ru verwenden](#eine-klassische-anwendung-mit-einer-configru-verwenden)
115
+ + [Wann sollte eine config.ru-Datei verwendet werden?](#wann-sollte-eine-configru-datei-verwendet-werden-)
116
+ + [Sinatra als Middleware nutzen](#sinatra-als-middleware-nutzen)
117
+ + [Dynamische Applikationserstellung](#dynamische-applikationserstellung)
118
+ * [Geltungsbereich und Bindung](#geltungsbereich-und-bindung)
119
+ + [Anwendungs- oder Klassen-Scope](#anwendungs--oder-klassen-scope)
120
+ + [Anfrage- oder Instanz-Scope](#anfrage--oder-instanz-scope)
121
+ + [Delegation-Scope](#delegation-scope)
122
+ * [Kommandozeile](#kommandozeile)
123
+ + [Multi-threading](#multi-threading)
124
+ * [Systemanforderungen](#systemanforderungen)
125
+ * [Der neuste Stand (The Bleeding Edge)](#der-neuste-stand--the-bleeding-edge-)
126
+ + [Mit Bundler](#mit-bundler)
127
+ + [Eigenes Repository](#eigenes-repository)
128
+ + [Gem erstellen](#gem-erstellen)
129
+ * [Versions-Verfahren](#versions-verfahren)
130
+ * [Mehr](#mehr)
121
131
 
122
132
  ## Routen
123
133
 
124
- In Sinatra wird eine Route durch eine HTTP-Methode und ein URL-Muster definiert.
125
- Jeder dieser Routen wird ein Ruby-Block zugeordnet:
134
+ In Sinatra wird eine Route durch eine HTTP-Methode und ein URL-Muster
135
+ definiert. Jeder dieser Routen wird ein Ruby-Block zugeordnet:
126
136
 
127
137
  ```ruby
128
138
  get '/' do
@@ -157,6 +167,14 @@ end
157
167
  Die Routen werden in der Reihenfolge durchlaufen, in der sie definiert wurden.
158
168
  Das erste Routen-Muster, das mit dem Request übereinstimmt, wird ausgeführt.
159
169
 
170
+ Routen mit angehängtem Schrägstrich unterscheiden sich von Routen ohne:
171
+
172
+ ```ruby
173
+ get '/foo' do
174
+ # wird nicht bei "GET /foo/" aufgerufen
175
+ end
176
+ ```
177
+
160
178
  Die Muster der Routen können benannte Parameter beinhalten, die über den
161
179
  `params`-Hash zugänglich gemacht werden:
162
180
 
@@ -203,7 +221,7 @@ end
203
221
  Routen mit regulären Ausdrücken sind auch möglich:
204
222
 
205
223
  ```ruby
206
- get /\A\/hallo\/([\w]+)\z/ do
224
+ get /\/hallo\/([\w]+)/ do
207
225
  "Hallo, #{params['captures'].first}!"
208
226
  end
209
227
  ```
@@ -212,6 +230,7 @@ Und auch hier können Block-Parameter genutzt werden:
212
230
 
213
231
  ```ruby
214
232
  get %r{/hallo/([\w]+)} do |c|
233
+ # erkennt "GET /hallo/frank" oder "GET /sag/hallo/frank" usw.
215
234
  "Hallo, #{c}!"
216
235
  end
217
236
  ```
@@ -219,20 +238,21 @@ end
219
238
  Routen-Muster können auch mit optionalen Parametern ausgestattet werden:
220
239
 
221
240
  ```ruby
222
- get '/posts.?:format?' do
223
- # passt auf "GET /posts" sowie jegliche Erweiterung
224
- # wie "GET /posts.json", "GET /posts.xml" etc.
241
+ get '/posts/:format?' do
242
+ # passt auf "GET /posts/" sowie jegliche Erweiterung
243
+ # wie "GET /posts/json", "GET /posts/xml" etc.
225
244
  end
226
245
  ```
227
246
 
228
247
  Routen können auch den query-Parameter verwenden:
229
248
 
230
- ``` ruby
249
+ ```ruby
231
250
  get '/posts' do
232
- # matches "GET /posts?title=foo&author=bar"
251
+ # passt zu "GET /posts?title=foo&author=bar"
233
252
  title = params['title']
234
253
  author = params['author']
235
- # uses title and author variables; query is optional to the /posts route
254
+ # verwendet title- und author-Variablen. Der query-Parameter ist für
255
+ # die /post-Route optional
236
256
  end
237
257
  ```
238
258
 
@@ -240,6 +260,20 @@ Anmerkung: Solange man den sog. Path Traversal Attack-Schutz nicht deaktiviert
240
260
  (siehe weiter unten), kann es sein, dass der Request-Pfad noch vor dem
241
261
  Abgleich mit den Routen modifiziert wird.
242
262
 
263
+ Die Mustermann-Optionen können für eine gegebene Route angepasst werden,
264
+ indem man der Route den `:mustermann_opts`-Hash mitgibt:
265
+
266
+ ```ruby
267
+ get '\A/posts\z', :mustermann_opts => { :type => :regexp, :check_anchors => false } do
268
+ # Passt genau auf /posts mit explizitem Anchoring
269
+ "Wenn Dein Anchor-Muster passt, darfst Du klatschen!"
270
+ end
271
+ ```
272
+
273
+ Das sieht zwar genauso aus wie eine Bedingung, ist es aber nicht. Diese
274
+ Option wird mit dem globalen `:mustermann_opts`-Hash zusammengeführt
275
+ (siehe weiter unten).
276
+
243
277
  ### Bedingungen
244
278
 
245
279
  An Routen können eine Vielzahl von Bedingungen geknüpft werden, die erfüllt
@@ -260,7 +294,7 @@ get '/foo' do
260
294
  end
261
295
  ```
262
296
 
263
- Andere mitgelieferte Bedingungen sind `:host_name` und `:provides`:
297
+ Andere verfügbare Bedingungen sind `:host_name` und `:provides`:
264
298
 
265
299
  ```ruby
266
300
  get '/', :host_name => /^admin\./ do
@@ -295,7 +329,7 @@ Bei Bedingungen, die mehrere Werte annehmen können, sollte ein Splat verwendet
295
329
  werden:
296
330
 
297
331
  ```ruby
298
- set(:auth) do |*roles| # <- hier kommt der Splat ins Spiel
332
+ set(:auth) do |*roles| # <- hier kommt der Splat ins Spiel
299
333
  condition do
300
334
  unless logged_in? && roles.any? {|role| current_user.in_role? role }
301
335
  redirect "/login/", 303
@@ -376,7 +410,8 @@ get all_but("/index") do
376
410
  end
377
411
  ```
378
412
 
379
- Beachte, dass das obige Beispiel etwas übertrieben wirkt. Es geht auch einfacher:
413
+ Beachte, dass das obige Beispiel etwas übertrieben wirkt. Es geht auch
414
+ einfacher:
380
415
 
381
416
  ```ruby
382
417
  get // do
@@ -388,7 +423,7 @@ end
388
423
  Oder unter Verwendung eines negativen look ahead:
389
424
 
390
425
  ```ruby
391
- get %r{^(?!/index$)} do
426
+ get %r{(?!/index)} do
392
427
  # ...
393
428
  end
394
429
  ```
@@ -402,8 +437,9 @@ einen anderen Ort zu definieren, indem man die `:public_folder`-Option setzt:
402
437
  set :public_folder, File.dirname(__FILE__) + '/static'
403
438
  ```
404
439
 
405
- Zu beachten ist, dass der Ordnername `public` nicht Teil der URL ist. Die Datei
406
- `./public/css/style.css` ist unter `http://example.com/css/style.css` zu finden.
440
+ Zu beachten ist, dass der Ordnername `public` nicht Teil der URL ist.
441
+ Die Datei `./public/css/style.css` ist unter
442
+ `http://example.com/css/style.css` zu finden.
407
443
 
408
444
  Um den `Cache-Control`-Header mit Informationen zu versorgen, verwendet man
409
445
  die `:static_cache_control`-Einstellung (s.u.).
@@ -421,7 +457,8 @@ end
421
457
 
422
458
  Dieses Beispiel rendert `views/index.erb`.
423
459
 
424
- Anstelle eines Templatenamens kann man auch direkt die Templatesprache verwenden:
460
+ Anstelle eines Templatenamens kann man auch direkt die Templatesprache
461
+ verwenden:
425
462
 
426
463
  ```ruby
427
464
  get '/' do
@@ -516,18 +553,19 @@ befinden. Es kann jedoch ein anderer Ordner festgelegt werden:
516
553
  set :views, settings.root + '/templates'
517
554
  ```
518
555
 
519
- Es ist zu beachten, dass immer mit Symbolen auf Templates verwiesen werden muss,
520
- auch dann, wenn sie sich in einem Unterordner befinden:
556
+ Es ist zu beachten, dass immer mit Symbolen auf Templates verwiesen
557
+ werden muss, auch dann, wenn sie sich in einem Unterordner befinden:
521
558
 
522
559
  ```ruby
523
560
  haml :'unterverzeichnis/template'
524
561
  ```
525
562
 
526
- Rendering-Methoden rendern jeden String direkt.
563
+ Wird einer Rendering-Methode ein String übergeben, wird dieser direkt
564
+ gerendert.
527
565
 
528
566
  ### Direkte Templates
529
567
 
530
- ``` ruby
568
+ ```ruby
531
569
  get '/' do
532
570
  haml '%div.title Hallo Welt'
533
571
  end
@@ -535,6 +573,16 @@ end
535
573
 
536
574
  Hier wird der String direkt gerendert.
537
575
 
576
+ Optional kann `:path` und `:line` für einen genaueren Backtrace
577
+ übergeben werden, wenn mit dem vorgegebenen String ein Pfad im
578
+ Dateisystem oder eine Zeilennummer verbunden ist:
579
+
580
+ ```ruby
581
+ get '/' do
582
+ haml '%div.title Hallo Welt', :path => 'examples/datei.haml', :line => 3
583
+ end
584
+ ```
585
+
538
586
  ### Verfügbare Templatesprachen
539
587
 
540
588
  Einige Sprachen haben mehrere Implementierungen. Um festzulegen, welche
@@ -607,7 +655,7 @@ Nimmt ebenso einen Block für Inline-Templates entgegen (siehe Beispiel).
607
655
  <table>
608
656
  <tr>
609
657
  <td>Abhängigkeit</td>
610
- <td><a href="http://nokogiri.org/">nokogiri</a></td>
658
+ <td><a href="http://www.nokogiri.org/">nokogiri</a></td>
611
659
  </tr>
612
660
  <tr>
613
661
  <td>Dateierweiterung</td>
@@ -662,7 +710,7 @@ Nimmt ebenso einen Block für Inline-Templates entgegen (siehe Beispiel).
662
710
  <table>
663
711
  <tr>
664
712
  <td>Abhängigkeit</td>
665
- <td><a href="http://www.lesscss.org/">less</a></td>
713
+ <td><a href="http://lesscss.org/">less</a></td>
666
714
  </tr>
667
715
  <tr>
668
716
  <td>Dateierweiterung</td>
@@ -680,7 +728,7 @@ Nimmt ebenso einen Block für Inline-Templates entgegen (siehe Beispiel).
680
728
  <table>
681
729
  <tr>
682
730
  <td>Abhängigkeit</td>
683
- <td><a href="http://www.liquidmarkup.org/">liquid</a></td>
731
+ <td><a href="http://liquidmarkup.org/">liquid</a></td>
684
732
  </tr>
685
733
  <tr>
686
734
  <td>Dateierweiterung</td>
@@ -702,7 +750,7 @@ denen man Variablen weitergibt.
702
750
  <tr>
703
751
  <td>Abhängigkeit</td>
704
752
  <td>Eine der folgenden Bibliotheken:
705
- <a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
753
+ <a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
706
754
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
707
755
  <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
708
756
  <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a> oder
@@ -862,7 +910,7 @@ man üblicherweise locals verwenden wollen, mit denen man Variablen weitergibt.
862
910
  <table>
863
911
  <tr>
864
912
  <td>Abhängigkeit</td>
865
- <td><a href="http://markaby.github.com/">markaby</a></td>
913
+ <td><a href="http://markaby.github.io/">markaby</a></td>
866
914
  </tr>
867
915
  <tr>
868
916
  <td>Dateierweiterung</td>
@@ -943,10 +991,10 @@ aufrufen kann:
943
991
  %p= creole(:Grüße)
944
992
  ```
945
993
 
946
- Da man Ruby nicht von Creole heraus aufrufen kann, können auch Layouts nicht in
947
- Creole geschrieben werden. Es ist aber möglich, einen Renderer für die Templates
948
- zu verwenden und einen anderen für das Layout, indem die `:layout_engine`-Option
949
- verwendet wird.
994
+ Da man Ruby nicht von Creole heraus aufrufen kann, können auch Layouts
995
+ nicht in Creole geschrieben werden. Es ist aber möglich, einen Renderer
996
+ für die Templates zu verwenden und einen anderen für das Layout, indem
997
+ die `:layout_engine`-Option verwendet wird.
950
998
 
951
999
  #### MediaWiki Templates
952
1000
 
@@ -965,26 +1013,26 @@ verwendet wird.
965
1013
  </tr>
966
1014
  </table>
967
1015
 
968
- Da man aus dem Mediawiki-Template heraus keine Ruby-Methoden aufrufen und auch
969
- keine locals verwenden kann, wird man Mediawiki üblicherweise in Kombination mit
970
- anderen Renderern verwenden wollen:
1016
+ Da man aus dem Mediawiki-Template heraus keine Ruby-Methoden aufrufen
1017
+ und auch keine locals verwenden kann, wird man Mediawiki üblicherweise
1018
+ in Kombination mit anderen Renderern verwenden wollen:
971
1019
 
972
- ``` ruby
1020
+ ```ruby
973
1021
  erb :overview, :locals => { :text => mediawiki(:introduction) }
974
1022
  ```
975
1023
 
976
1024
  Beachte: Man kann die `mediawiki`-Methode auch aus anderen Templates
977
1025
  heraus aufrufen:
978
1026
 
979
- ``` ruby
1027
+ ```ruby
980
1028
  %h1 Grüße von Haml!
981
1029
  %p= mediawiki(:greetings)
982
1030
  ```
983
1031
 
984
- Da man Ruby nicht von MediaWiki heraus aufrufen kann, können auch Layouts nicht
985
- in MediaWiki geschrieben werden. Es ist aber möglich, einen Renderer für die
986
- Templates zu verwenden und einen anderen für das Layout, indem die
987
- `:layout_engine`-Option verwendet wird.
1032
+ Da man Ruby nicht von MediaWiki heraus aufrufen kann, können auch
1033
+ Layouts nicht in MediaWiki geschrieben werden. Es ist aber möglich,
1034
+ einen Renderer für die Templates zu verwenden und einen anderen für das
1035
+ Layout, indem die `:layout_engine`-Option verwendet wird.
988
1036
 
989
1037
  #### CoffeeScript Templates
990
1038
 
@@ -1010,7 +1058,7 @@ Templates zu verwenden und einen anderen für das Layout, indem die
1010
1058
  <tr>
1011
1059
  <td>Abhängigkeit</td>
1012
1060
  <td>
1013
- <a href="https://github.com/lucasmazza/ruby-stylus" title="Ruby Stylus">
1061
+ <a href="https://github.com/forgecrafted/ruby-stylus" title="Ruby Stylus">
1014
1062
  Stylus
1015
1063
  </a> und eine Möglichkeit
1016
1064
  <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
@@ -1031,7 +1079,7 @@ Templates zu verwenden und einen anderen für das Layout, indem die
1031
1079
  Um Stylus-Templates ausführen zu können, müssen `stylus` und `stylus/tilt`
1032
1080
  zuerst geladen werden:
1033
1081
 
1034
- ``` ruby
1082
+ ```ruby
1035
1083
  require 'sinatra'
1036
1084
  require 'stylus'
1037
1085
  require 'stylus/tilt'
@@ -1068,7 +1116,7 @@ end
1068
1116
  Die Template-Quelle wird als Ruby-String evaluiert. Die daraus resultierende
1069
1117
  json Variable wird mit Hilfe von `#to_json` umgewandelt:
1070
1118
 
1071
- ``` ruby
1119
+ ```ruby
1072
1120
  json = { :foo => 'bar' }
1073
1121
  json[:baz] = key
1074
1122
  ```
@@ -1076,7 +1124,7 @@ json[:baz] = key
1076
1124
  Die `:callback` und `:variable` Optionen können mit dem gerenderten Objekt
1077
1125
  verwendet werden:
1078
1126
 
1079
- ``` javascript
1127
+ ```javascript
1080
1128
  var resource = {"foo":"bar","baz":"qux"};
1081
1129
  present(resource);
1082
1130
  ```
@@ -1130,11 +1178,11 @@ Templates eingesetzt.
1130
1178
 
1131
1179
  ### Templates mit `yield` und verschachtelte Layouts
1132
1180
 
1133
- Ein Layout ist üblicherweise ein Template, das ein `yield` aufruft. Ein solches
1134
- Template kann entweder wie oben beschrieben über die `:template` Option
1135
- verwendet werden oder mit einem Block gerendert werden:
1181
+ Ein Layout ist üblicherweise ein Template, das ein `yield` aufruft. Ein
1182
+ solches Template kann entweder wie oben beschrieben über die `:template`
1183
+ Option verwendet werden oder mit einem Block gerendert werden:
1136
1184
 
1137
- ``` ruby
1185
+ ```ruby
1138
1186
  erb :post, :layout => false do
1139
1187
  erb :index
1140
1188
  end
@@ -1145,7 +1193,7 @@ Dieser Code entspricht weitestgehend `erb :index, :layout => :post`.
1145
1193
  Blöcke an Render-Methoden weiterzugeben ist besonders bei verschachtelten
1146
1194
  Layouts hilfreich:
1147
1195
 
1148
- ``` ruby
1196
+ ```ruby
1149
1197
  erb :main_layout, :layout => false do
1150
1198
  erb :admin_layout do
1151
1199
  erb :user
@@ -1155,7 +1203,7 @@ end
1155
1203
 
1156
1204
  Der gleiche Effekt kann auch mit weniger Code erreicht werden:
1157
1205
 
1158
- ``` ruby
1206
+ ```ruby
1159
1207
  erb :admin_layout, :layout => :main_layout do
1160
1208
  erb :user
1161
1209
  end
@@ -1184,13 +1232,13 @@ __END__
1184
1232
  = yield
1185
1233
 
1186
1234
  @@ index
1187
- %div.title Hallo Welt!!!!!
1235
+ %div.title Hallo Welt
1188
1236
  ```
1189
1237
 
1190
1238
  Anmerkung: Inline-Templates, die in der Datei definiert sind, die `require
1191
1239
  'sinatra'` aufruft, werden automatisch geladen. Um andere Inline-Templates in
1192
- anderen Dateien aufzurufen, muss explizit `enable :inline_templates` verwendet
1193
- werden.
1240
+ weiteren Dateien aufzurufen, muss explizit `enable :inline_templates`
1241
+ verwendet werden.
1194
1242
 
1195
1243
  ### Benannte Templates
1196
1244
 
@@ -1198,7 +1246,7 @@ Templates können auch mit der Top-Level `template`-Methode definiert werden:
1198
1246
 
1199
1247
  ```ruby
1200
1248
  template :layout do
1201
- "%html\n =yield\n"
1249
+ "%html\n =yield\n"
1202
1250
  end
1203
1251
 
1204
1252
  template :index do
@@ -1211,7 +1259,9 @@ end
1211
1259
  ```
1212
1260
 
1213
1261
  Wenn ein Template mit dem Namen "layout" existiert, wird es bei jedem Aufruf
1214
- verwendet. Durch `:layout => false` kann das Ausführen verhindert werden:
1262
+ verwendet. Durch `:layout => false` kann das Ausführen individuell nach Route
1263
+ verhindert werden, oder generell für ein Template, z.B. Haml via:
1264
+ `set :haml, :layout => false`:
1215
1265
 
1216
1266
  ```ruby
1217
1267
  get '/' do
@@ -1257,7 +1307,7 @@ Tilt zu erfahren.
1257
1307
  Um einen eigenen Mechanismus zum Aufsuchen von Templates zu
1258
1308
  implementieren, muss `#find_template` definiert werden:
1259
1309
 
1260
- ``` ruby
1310
+ ```ruby
1261
1311
  configure do
1262
1312
  set :views [ './views/a', './views/b' ]
1263
1313
  end
@@ -1298,6 +1348,10 @@ after do
1298
1348
  end
1299
1349
  ```
1300
1350
 
1351
+ Achtung: Wenn statt der body-Methode ein einfacher String verwendet
1352
+ wird, ist der Response-body im after-Filter noch nicht verfügbar, da
1353
+ er erst nach dem Durchlaufen des after-Filters erzeugt wird.
1354
+
1301
1355
  Filter können optional auch mit einem Muster ausgestattet werden, das auf den
1302
1356
  Request-Pfad passen muss, damit der Filter ausgeführt wird:
1303
1357
 
@@ -1341,30 +1395,30 @@ get '/:name' do
1341
1395
  end
1342
1396
  ```
1343
1397
 
1344
- ### Sessions verwenden
1345
- Sessions werden verwendet, um Zustände zwischen den Requests zu speichern. Sind
1346
- sie aktiviert, kann ein Session-Hash je Benutzer-Session verwendet werden:
1398
+ Ebenso können Helfer auch in einem eigenen Modul definiert werden:
1347
1399
 
1348
1400
  ```ruby
1349
- enable :sessions
1350
-
1351
- get '/' do
1352
- "value = " << session[:value].inspect
1401
+ module FooUtils
1402
+ def foo(name) "#{name}foo" end
1353
1403
  end
1354
1404
 
1355
- get '/:value' do
1356
- session[:value] = params['value']
1405
+ module BarUtils
1406
+ def bar(name) "#{name}bar" end
1357
1407
  end
1408
+
1409
+ helpers FooUtils, BarUtils
1358
1410
  ```
1359
1411
 
1360
- Beachte, dass `enable :sessions` alle Daten in einem Cookie speichert. Unter
1361
- Umständen kann dies negative Effekte haben, z.B. verursachen viele Daten
1362
- höheren, teilweise überflüssigen Traffic. Um das zu vermeiden, kann eine Rack-
1363
- Session-Middleware verwendet werden. Dabei wird auf `enable :sessions`
1364
- verzichtet und die Middleware wie üblich im Programm eingebunden:
1412
+ Das Ergebnis ist das gleiche, wie beim Einbinden in die
1413
+ Anwendungs-Klasse.
1414
+
1415
+ ### Sessions verwenden
1416
+ Sessions werden verwendet, um Zustände zwischen den Requests zu speichern.
1417
+ Sind sie aktiviert, kann ein Session-Hash je Benutzer-Session verwendet
1418
+ werden:
1365
1419
 
1366
1420
  ```ruby
1367
- use Rack::Session::Pool, :expire_after => 2592000
1421
+ enable :sessions
1368
1422
 
1369
1423
  get '/' do
1370
1424
  "value = " << session[:value].inspect
@@ -1375,30 +1429,130 @@ get '/:value' do
1375
1429
  end
1376
1430
  ```
1377
1431
 
1378
- Um die Sicherheit zu erhöhen, werden Cookies, die Session-Daten führen, mit
1379
- einem sogenannten Session-Secret signiert. Da sich dieses Geheimwort bei jedem
1380
- Neustart der Applikation automatisch ändert, ist es sinnvoll, ein eigenes zu
1381
- wählen, damit sich alle Instanzen der Applikation dasselbe Session-Secret
1382
- teilen:
1432
+ Um die Sicherheit zu erhöhen, werden Daten mit einem geheimen
1433
+ Sitzungsschlüssel unter Verwendung von `HMAC-SHA1` in einem Cookie signiert.
1434
+ Der Sitzungsschlüssel sollte optimalerweise ein kryptografisch zufällig
1435
+ erzeugter Wert mit angemessener Länge sein, für den `HMAC-SHA1` größer
1436
+ oder gleich 65 Bytes ist (256 Bits, 64 Hex-Zeichen). Es wird empfohlen,
1437
+ keinen Schlüssel zu verwenden, dessen Zufälligkeit weniger als 32 Bytes
1438
+ entspricht (also 256 Bits, 64 Hex-Zeichen). Es ist deshalb **wirklich
1439
+ wichtig**, dass nicht einfach irgendetwas als Schlüssel verwendet wird,
1440
+ sondern ein sicherer Zufallsgenerator die Zeichenkette erstellt. Menschen sind
1441
+ nicht besonders gut, zufällige Zeichenfolgen zu erstellen.
1442
+
1443
+ Sinatra generiert automatisch einen zufälligen 32 Byte langen zufälligen
1444
+ Schlüssel. Da jedoch bei jedem Neustart der Schlüssel ebenfalls neu generiert
1445
+ wird, ist es sinnvoll einen eigenen Schlüssel festzulegen, damit er über alle
1446
+ Anwendungsinstanzen hinweg geteilt werden kann.
1447
+
1448
+ Aus praktikablen und Sicherheitsgründen wird
1449
+ [empfohlen](https://12factor.net/config), dass ein sicherer Zufallswert
1450
+ erzeugt und in einer Umgebungsvariable abgelgegt wird, damit alle
1451
+ Anwendungsinstanzen darauf zugreifen können. Dieser Sitzungsschlüssel
1452
+ sollte in regelmäßigen Abständen erneuert werden. Zum Erzeugen von 64
1453
+ Byte starken Schlüsseln sind hier ein paar Beispiele vorgestellt:
1454
+
1455
+ **Sitzungsschlüssel erzeugen**
1456
+
1457
+ ```text
1458
+ $ ruby -e "require 'securerandom'; puts SecureRandom.hex(64)"
1459
+ 99ae8afi...usw...ec0f262ac
1460
+ ```
1461
+
1462
+ **Sitzungsschlüssel erzeugen (Bonuspunkte)**
1463
+
1464
+ Um den systemweiten Zufallszahlengenerator zu verwenden, kann das
1465
+ [sysrandom gem](https://github.com/cryptosphere/sysrandom) installiert
1466
+ werden, anstelle von Zufallszahlen aus dem Userspace, auf die MRI zur
1467
+ Zeit standardmäßig zugreift:
1468
+
1469
+ ```text
1470
+ $ gem install sysrandom
1471
+ Building native extensions. This could take a while...
1472
+ Successfully installed sysrandom-1.x
1473
+ 1 gem installed
1474
+
1475
+ $ ruby -e "require 'sysrandom/securerandom'; puts SecureRandom.hex(64)"
1476
+ 99ae8af...snip...ec0f262ac
1477
+ ```
1478
+
1479
+ **Sitzungsschlüssel-Umgebungsvariable**
1480
+
1481
+ Wird eine `SESSION_SECRET`-Umgebungsvariable persistent gesetzt, kann
1482
+ Sinatra darauf zugreifen. Da die folgende Methode von System zu System
1483
+ variieren kann, ist dies als Beispiel zu verstehen:
1484
+
1485
+ ```bash
1486
+ $ echo "export SESSION_SECRET=99ae8af...etc...ec0f262ac" >> ~/.bashrc
1487
+ ```
1488
+
1489
+ **Anwendungseinstellung für Sitzungsschlüssel**
1490
+
1491
+ Die Anwendung sollte unabhängig von der `SESSION_SECRET`-Umgebungsvariable
1492
+ auf einen sicheren zufälligen Schlüssel zurückgreifen.
1493
+
1494
+ Auch hier sollte das
1495
+ [sysrandom gem](https://github.com/cryptosphere/sysrandom) verwendet
1496
+ werden:
1383
1497
 
1384
1498
  ```ruby
1385
- set :session_secret, 'super_geheimes_Gegeimnis'
1499
+ require 'securerandom'
1500
+ # -or- require 'sysrandom/securerandom'
1501
+ set :session_secret, ENV.fetch('SESSION_SECRET') { SecureRandom.hex(64) }
1386
1502
  ```
1387
1503
 
1388
- Zur weiteren Konfiguration kann man einen Hash mit Optionen in den `sessions`
1389
- Einstellungen ablegen.
1504
+ #### Sitzungseinstellungen
1505
+
1506
+ Im Options-Hash können weitere Einstellungen abgelegt werden:
1390
1507
 
1391
1508
  ```ruby
1392
1509
  set :sessions, :domain => 'foo.com'
1393
1510
  ```
1394
1511
 
1395
- Um eine Session mit anderen Apps und zwischen verschiedenen Subdomains
1396
- von foo.com zu teilen, wird ein *.* der Domain vorangestellt:
1512
+ Um Sitzungsdaten über mehrere Anwendungen und Subdomains hinweg zu
1513
+ teilen, muss die Domain mit einem `*.*` vor der Domain ausgestattet
1514
+ werden:
1397
1515
 
1398
- ``` ruby
1399
- set :sessions, :domain => '.foo,com'
1516
+ ```ruby
1517
+ set :sessions, :domain => '.foo.com'
1518
+ ```
1519
+
1520
+ #### Eigene Sitzungs-Middleware auswählen
1521
+
1522
+ Beachte, dass `enable :sessions` alle Daten in einem Cookie speichert. Unter
1523
+ Umständen kann dies negative Effekte haben, z.B. verursachen viele Daten
1524
+ höheren, teilweise überflüssigen Traffic. Es kann daher eine beliebige
1525
+ Rack-Session Middleware verwendet werden. Folgende Methoden stehen zur
1526
+ Verfügung:
1527
+
1528
+ ```ruby
1529
+ enable :sessions
1530
+ set :session_store, Rack::Session::Pool
1400
1531
  ```
1401
1532
 
1533
+ Oder Sitzungen werden mit einem Options-Hash ausgestattet:
1534
+
1535
+ ```ruby
1536
+ set :sessions, :expire_after => 2592000
1537
+ set :session_store, Rack::Session::Pool
1538
+ ```
1539
+
1540
+ Eine weitere Methode ist der Verzicht auf `enable :session` und
1541
+ stattdessen die Verwendung einer beliebigen anderen Middleware.
1542
+
1543
+ Dabei ist jedoch zu beachten, dass der reguläre sitzungsbasierte
1544
+ Sicherungsmechanismus **nicht automatisch aktiviert wird**.
1545
+
1546
+ Die dazu benötigte Rack-Middleware muss explizit eingebunden werden:
1547
+
1548
+ ```ruby
1549
+ use Rack::Session::Pool, :expire_after => 2592000
1550
+ use Rack::Protection::RemoteToken
1551
+ use Rack::Protection::SessionHijacking
1552
+ ```
1553
+
1554
+ Mehr dazu unter [Einstellung des Angiffsschutzes](https://github.com/sinatra/sinatra/blob/master/README.de.md#einstellung-des-angriffsschutzes).
1555
+
1402
1556
  ### Anhalten
1403
1557
 
1404
1558
  Zum sofortigen Stoppen eines Request in einem Filter oder einer Route:
@@ -1481,13 +1635,15 @@ Wenn der Request innerhalb derselben Applikations-Instanz aufgerufen und keine
1481
1635
  Kopie der Instanz erzeugt werden soll, kann `call!` anstelle von `call`
1482
1636
  verwendet werden.
1483
1637
 
1638
+ Weitere Informationen zu `call` finden sich in den Rack-Spezifikationen.
1639
+
1484
1640
  ### Body, Status-Code und Header setzen
1485
1641
 
1486
- Es ist möglich und empfohlen, den Status-Code sowie den Response-Body mit einem
1487
- Returnwert in der Route zu setzen. In manchen Situationen kann es jedoch sein,
1488
- dass der Body an anderer Stelle während der Ausführung gesetzt werden soll.
1489
- Dafür kann man die Helfer-Methode `body` einsetzen. Ist sie gesetzt, kann sie zu
1490
- einem späteren Zeitpunkt aufgerufen werden:
1642
+ Es ist möglich und empfohlen, den Status-Code sowie den Response-Body mit
1643
+ einem Returnwert in der Route zu setzen. In manchen Situationen kann es
1644
+ jedoch sein, dass der Body an anderer Stelle während der Ausführung gesetzt
1645
+ werden soll. Dafür kann man die Helfer-Methode `body` einsetzen. Ist sie
1646
+ gesetzt, kann sie zu einem späteren Zeitpunkt aufgerufen werden:
1491
1647
 
1492
1648
  ```ruby
1493
1649
  get '/foo' do
@@ -1524,14 +1680,14 @@ In manchen Situationen sollen Daten bereits an den Client zurückgeschickt
1524
1680
  werden, bevor ein vollständiger Response bereit steht. Manchmal will man die
1525
1681
  Verbindung auch erst dann beenden und Daten so lange an den Client
1526
1682
  zurückschicken, bis er die Verbindung abbricht. Für diese Fälle gibt es die
1527
- `stream`-Helfer-Methode, die es einem erspart eigene Lösungen zu schreiben:
1683
+ `stream`-Helfer-Methode, die es einem erspart, eigene Lösungen zu schreiben:
1528
1684
 
1529
1685
  ```ruby
1530
1686
  get '/' do
1531
1687
  stream do |out|
1532
1688
  out << "Das ist ja mal wieder fanta -\n"
1533
1689
  sleep 0.5
1534
- out << " (bitte warten…) \n"
1690
+ out << " (bitte warten …) \n"
1535
1691
  sleep 1
1536
1692
  out << "- stisch!\n"
1537
1693
  end
@@ -1539,24 +1695,24 @@ end
1539
1695
  ```
1540
1696
 
1541
1697
  Damit lassen sich Streaming-APIs realisieren, sog.
1542
- [Server Sent Events](http://dev.w3.org/html5/eventsource/), die als Basis für
1543
- [WebSockets](http://en.wikipedia.org/wiki/WebSocket) dienen. Ebenso können sie
1544
- verwendet werden, um den Durchsatz zu erhöhen, wenn ein Teil der Daten von
1698
+ [Server Sent Events](https://w3c.github.io/eventsource/), die als Basis für
1699
+ [WebSockets](https://en.wikipedia.org/wiki/WebSocket) dienen. Ebenso können
1700
+ sie verwendet werden, um den Durchsatz zu erhöhen, wenn ein Teil der Daten von
1545
1701
  langsamen Ressourcen abhängig ist.
1546
1702
 
1547
1703
  Es ist zu beachten, dass das Verhalten beim Streaming, insbesondere die Anzahl
1548
1704
  nebenläufiger Anfragen, stark davon abhängt, welcher Webserver für die
1549
- Applikation verwendet wird. Einige Server, z.B. WEBRick, unterstützen
1705
+ Applikation verwendet wird. Einige Server unterstützen
1550
1706
  Streaming nicht oder nur teilweise. Sollte der Server Streaming nicht
1551
1707
  unterstützen, wird ein vollständiger Response-Body zurückgeschickt, sobald der
1552
1708
  an `stream` weitergegebene Block abgearbeitet ist. Mit Shotgun funktioniert
1553
1709
  Streaming z.B. überhaupt nicht.
1554
1710
 
1555
- Ist der optionale Parameter `keep_open` aktiviert, wird beim gestreamten Objekt
1556
- `close` nicht aufgerufen und es ist einem überlassen dies an einem beliebigen
1557
- späteren Zeitpunkt nachholen. Die Funktion ist jedoch nur bei Event-gesteuerten
1558
- Serven wie Thin oder Rainbows möglich, andere Server werden trotzdem den Stream
1559
- beenden:
1711
+ Ist der optionale Parameter `keep_open` aktiviert, wird beim gestreamten
1712
+ Objekt `close` nicht aufgerufen und es ist einem überlassen dies an einem
1713
+ beliebigen späteren Zeitpunkt nachholen. Die Funktion ist jedoch nur bei
1714
+ Event-gesteuerten Serven wie Thin oder Rainbows möglich, andere Server werden
1715
+ trotzdem den Stream beenden:
1560
1716
 
1561
1717
  ```ruby
1562
1718
  # Durchgehende Anfrage (long polling)
@@ -1588,10 +1744,14 @@ post '/:message' do
1588
1744
  end
1589
1745
  ```
1590
1746
 
1747
+ Es ist ebenfalls möglich, dass der Client die Verbindung schließt, während in
1748
+ den Socket geschrieben wird. Deshalb ist es sinnvoll, vor einem
1749
+ Schreibvorgang `out.closed?` zu prüfen.
1750
+
1591
1751
  ### Logger
1592
1752
 
1593
- Im Geltungsbereich eines Request stellt die `logger` Helfer-Methode eine `Logger`
1594
- Instanz zur Verfügung:
1753
+ Im Geltungsbereich eines Request stellt die `logger` Helfer-Methode eine
1754
+ `Logger` Instanz zur Verfügung:
1595
1755
 
1596
1756
  ```ruby
1597
1757
  get '/' do
@@ -1601,8 +1761,9 @@ end
1601
1761
  ```
1602
1762
 
1603
1763
  Der Logger übernimmt dabei automatisch alle im Rack-Handler eingestellten
1604
- Log-Vorgaben. Ist Loggen ausgeschaltet, gibt die Methode ein Leerobjekt zurück.
1605
- In den Routen und Filtern muss man sich also nicht weiter darum kümmern.
1764
+ Log-Vorgaben. Ist Loggen ausgeschaltet, gibt die Methode ein Leerobjekt
1765
+ zurück. In den Routen und Filtern muss man sich also nicht weiter darum
1766
+ kümmern.
1606
1767
 
1607
1768
  Beachte, dass das Loggen standardmäßig nur für `Sinatra::Application`
1608
1769
  voreingestellt ist. Wird über `Sinatra::Base` vererbt, muss es erst aktiviert
@@ -1610,7 +1771,7 @@ werden:
1610
1771
 
1611
1772
  ```ruby
1612
1773
  class MyApp < Sinatra::Base
1613
- configure :production, :development do
1774
+ configure :production, :development do
1614
1775
  enable :logging
1615
1776
  end
1616
1777
  end
@@ -1618,9 +1779,9 @@ end
1618
1779
 
1619
1780
  Damit auch keine Middleware das Logging aktivieren kann, muss die `logging`
1620
1781
  Einstellung auf `nil` gesetzt werden. Das heißt aber auch, dass `logger` in
1621
- diesem Fall `nil` zurückgeben wird. Üblicherweise wird das eingesetzt, wenn ein
1622
- eigener Logger eingerichtet werden soll. Sinatra wird dann verwenden, was in
1623
- `env['rack.logger']` eingetragen ist.
1782
+ diesem Fall `nil` zurückgeben wird. Üblicherweise wird das eingesetzt, wenn
1783
+ ein eigener Logger eingerichtet werden soll. Sinatra wird dann verwenden, was
1784
+ in `env['rack.logger']` eingetragen ist.
1624
1785
 
1625
1786
  ### Mime-Types
1626
1787
 
@@ -1645,8 +1806,8 @@ end
1645
1806
 
1646
1807
  ### URLs generieren
1647
1808
 
1648
- Zum Generieren von URLs sollte die `url`-Helfer-Methode genutzen werden, so z.B.
1649
- beim Einsatz von Haml:
1809
+ Zum Generieren von URLs sollte die `url`-Helfer-Methode genutzen werden, so
1810
+ z.B. beim Einsatz von Haml:
1650
1811
 
1651
1812
  ```ruby
1652
1813
  %a{:href => url('/foo')} foo
@@ -1654,7 +1815,8 @@ beim Einsatz von Haml:
1654
1815
 
1655
1816
  Soweit vorhanden, wird Rücksicht auf Proxys und Rack-Router genommen.
1656
1817
 
1657
- Diese Methode ist ebenso über das Alias `to` zu erreichen (siehe Beispiel unten).
1818
+ Diese Methode ist ebenso über das Alias `to` zu erreichen (siehe Beispiel
1819
+ unten).
1658
1820
 
1659
1821
  ### Browser-Umleitung
1660
1822
 
@@ -1671,7 +1833,7 @@ Weitere Parameter werden wie Argumente der `halt`-Methode behandelt:
1671
1833
 
1672
1834
  ```ruby
1673
1835
  redirect to('/bar'), 303
1674
- redirect 'http://google.com', 'Hier bist du falsch'
1836
+ redirect 'http://www.google.com/', 'Hier bist du falsch'
1675
1837
  ```
1676
1838
 
1677
1839
  Ebenso leicht lässt sich ein Schritt zurück mit dem Alias `redirect back`
@@ -1732,8 +1894,8 @@ before do
1732
1894
  end
1733
1895
  ```
1734
1896
 
1735
- Bei Verwendung der `expires`-Helfermethode zum Setzen des gleichnamigen Headers,
1736
- wird `Cache-Control` automatisch eigestellt:
1897
+ Bei Verwendung der `expires`-Helfermethode zum Setzen des gleichnamigen
1898
+ Headers, wird `Cache-Control` automatisch eigestellt:
1737
1899
 
1738
1900
  ```ruby
1739
1901
  before do
@@ -1742,7 +1904,7 @@ end
1742
1904
  ```
1743
1905
 
1744
1906
  Um alles richtig zu machen, sollten auch `etag` oder `last_modified` verwendet
1745
- werden. Es wird empfohlen, dass diese Helfer aufgerufen werden **bevor** die
1907
+ werden. Es wird empfohlen, dass diese Helfer aufgerufen werden *bevor* die
1746
1908
  eigentliche Arbeit anfängt, da sie sofort eine Antwort senden, wenn der Client
1747
1909
  eine aktuelle Version im Cache vorhält:
1748
1910
 
@@ -1756,7 +1918,7 @@ end
1756
1918
  ```
1757
1919
 
1758
1920
  ebenso ist es möglich einen
1759
- [schwachen ETag](http://de.wikipedia.org/wiki/HTTP_ETag) zu verwenden:
1921
+ [schwachen ETag](https://de.wikipedia.org/wiki/HTTP_ETag) zu verwenden:
1760
1922
 
1761
1923
  ```ruby
1762
1924
  etag @article.sha1, :weak
@@ -1780,16 +1942,16 @@ get '/' do
1780
1942
  end
1781
1943
  ```
1782
1944
 
1783
- Um den `Cache-Control`-Header mit Informationen zu versorgen, verwendet man die
1784
- `:static_cache_control`-Einstellung (s.u.).
1945
+ Um den `Cache-Control`-Header mit Informationen zu versorgen, verwendet man
1946
+ die `:static_cache_control`-Einstellung (s.u.).
1785
1947
 
1786
- Nach RFC 2616 sollte sich die Anwendung anders verhalten, wenn ein If-Match oder
1787
- ein If-None_match Header auf `*` gesetzt wird in Abhängigkeit davon, ob die
1788
- Resource bereits existiert. Sinatra geht davon aus, dass Ressourcen bei sicheren
1789
- Anfragen (z.B. bei get oder Idempotenten Anfragen wie put) bereits existieren,
1790
- wobei anderen Ressourcen (besipielsweise bei post), als neue Ressourcen
1791
- behandelt werden. Dieses Verhalten lässt sich mit der `:new_resource` Option
1792
- ändern:
1948
+ Nach RFC 2616 sollte sich die Anwendung anders verhalten, wenn ein If-Match
1949
+ oder ein If-None-Match Header auf `*` gesetzt wird in Abhängigkeit davon, ob
1950
+ die Resource bereits existiert. Sinatra geht davon aus, dass Ressourcen bei
1951
+ sicheren Anfragen (z.B. bei get oder Idempotenten Anfragen wie put) bereits
1952
+ existieren, wobei anderen Ressourcen (besipielsweise bei post), als neue
1953
+ Ressourcen behandelt werden. Dieses Verhalten lässt sich mit der
1954
+ `:new_resource` Option ändern:
1793
1955
 
1794
1956
  ```ruby
1795
1957
  get '/create' do
@@ -1825,33 +1987,35 @@ send_file 'foo.png', :type => :jpg
1825
1987
 
1826
1988
  <dl>
1827
1989
  <dt>filename</dt>
1828
- <dd>Dateiname als Response. Standardwert ist der eigentliche Dateiname.</dd>
1990
+ <dd>Dateiname als Response.
1991
+ Standardwert ist der eigentliche Dateiname.</dd>
1829
1992
 
1830
1993
  <dt>last_modified</dt>
1831
- <dd>Wert für den Last-Modified-Header, Standardwert ist <tt>mtime</tt> der
1994
+ <dd>Wert für den Last-Modified-Header, Standardwert ist <tt>mtime</tt> der
1832
1995
  Datei.</dd>
1833
1996
 
1834
1997
  <dt>type</dt>
1835
- <dd>Content-Type, der verwendet werden soll. Wird, wenn nicht angegeben, von
1836
- der Dateiendung abgeleitet.</dd>
1998
+ <dd>Content-Type, der verwendet werden soll. Wird, wenn nicht angegeben,
1999
+ von der Dateiendung abgeleitet.</dd>
1837
2000
 
1838
2001
  <dt>disposition</dt>
1839
- <dd>Verwendet für Content-Disposition. Mögliche Werte sind: <tt>nil</tt>
2002
+ <dd>Verwendet für Content-Disposition. Mögliche Werte sind: <tt>nil</tt>
1840
2003
  (Standard), <tt>:attachment</tt> und <tt>:inline</tt>.</dd>
1841
2004
 
1842
2005
  <dt>length</dt>
1843
- <dd>Content-Length-Header. Standardwert ist die Dateigröße.</dd>
2006
+ <dd>Content-Length-Header. Standardwert ist die Dateigröße.</dd>
2007
+ <dt>Status</dt>
2008
+ <dd>Zu versendender Status-Code. Nützlich, wenn eine statische Datei
2009
+ als Fehlerseite zurückgegeben werden soll. Wenn der Rack-Handler es
2010
+ unterstützt, dann können auch andere Methoden außer Streaming vom
2011
+ Ruby-Prozess verwendet werden. Wird diese Helfermethode verwendet,
2012
+ dann wird Sinatra sich automatisch um die Range-Anfrage kümmern.</dd>
1844
2013
  </dl>
1845
2014
 
1846
- Soweit vom Rack-Handler unterstützt, werden neben der Übertragung über den
1847
- Ruby-Prozess auch andere Möglichkeiten genutzt. Bei Verwendung der
1848
- `send_file`-Helfer-Methode kümmert sich Sinatra selbstständig um die
1849
- Range-Requests.
1850
-
1851
2015
  ### Das Request-Objekt
1852
2016
 
1853
2017
  Auf das `request`-Objekt der eigehenden Anfrage kann vom Anfrage-Scope aus
1854
- zugegriffen werden:
2018
+ zugegriffen werden (d.h. Filter, Routen, Fehlerbehandlung):
1855
2019
 
1856
2020
  ```ruby
1857
2021
  # App läuft unter http://example.com/example
@@ -1930,18 +2094,18 @@ end
1930
2094
 
1931
2095
  ### Umgang mit Datum und Zeit
1932
2096
 
1933
- Sinatra bietet eine `time_for`-Helfer-Methode, die aus einem gegebenen Wert ein
1934
- Time-Objekt generiert. Ebenso kann sie nach `DateTime`, `Date` und ähnliche
1935
- Klassen konvertieren:
2097
+ Sinatra bietet eine `time_for`-Helfer-Methode, die aus einem gegebenen Wert
2098
+ ein Time-Objekt generiert. Ebenso kann sie nach `DateTime`, `Date` und
2099
+ ähnliche Klassen konvertieren:
1936
2100
 
1937
2101
  ```ruby
1938
2102
  get '/' do
1939
- pass if Time.now > time_for('Dec 23, 2012')
2103
+ pass if Time.now > time_for('Dec 23, 2016')
1940
2104
  "noch Zeit"
1941
2105
  end
1942
2106
  ```
1943
2107
 
1944
- Diese Methode wird intern für +expires, `last_modiefied` und ihresgleichen
2108
+ Diese Methode wird intern für `expires`, `last_modiefied` und ihresgleichen
1945
2109
  verwendet. Mit ein paar Handgriffen lässt sich diese Methode also in ihrem
1946
2110
  Verhalten erweitern, indem man `time_for` in der eigenen Applikation
1947
2111
  überschreibt:
@@ -1966,8 +2130,8 @@ end
1966
2130
 
1967
2131
  ### Nachschlagen von Template-Dateien
1968
2132
 
1969
- Die `find_template`-Helfer-Methode wird genutzt, um Template-Dateien zum Rendern
1970
- aufzufinden:
2133
+ Die `find_template`-Helfer-Methode wird genutzt, um Template-Dateien zum
2134
+ Rendern aufzufinden:
1971
2135
 
1972
2136
  ```ruby
1973
2137
  find_template settings.views, 'foo', Tilt[:haml] do |file|
@@ -1975,9 +2139,9 @@ find_template settings.views, 'foo', Tilt[:haml] do |file|
1975
2139
  end
1976
2140
  ```
1977
2141
 
1978
- Das ist zwar nicht wirklich brauchbar, aber wenn man sie überschreibt, kann sie
1979
- nützlich werden, um eigene Nachschlage-Mechanismen einzubauen. Zum Beispiel
1980
- dann, wenn mehr als nur ein view-Verzeichnis verwendet werden soll:
2142
+ Das ist zwar nicht wirklich brauchbar, aber wenn man sie überschreibt, kann
2143
+ sie nützlich werden, um eigene Nachschlage-Mechanismen einzubauen. Zum
2144
+ Beispiel dann, wenn mehr als nur ein view-Verzeichnis verwendet werden soll:
1981
2145
 
1982
2146
  ```ruby
1983
2147
  set :views, ['views', 'templates']
@@ -2007,13 +2171,13 @@ end
2007
2171
  Ebensogut könnte eine Extension aber auch geschrieben und mit anderen geteilt
2008
2172
  werden!
2009
2173
 
2010
- Beachte, dass `find_template` nicht prüft, ob eine Datei tatsächlich existiert.
2011
- Es wird lediglich der angegebene Block aufgerufen und nach allen möglichen
2012
- Pfaden gesucht. Das ergibt kein Performance-Problem, da `render` `block`
2013
- verwendet, sobald eine Datei gefunden wurde. Ebenso werden Template-Pfade samt
2014
- Inhalt gecached, solange nicht im Entwicklungsmodus gearbeitet wird. Das sollte
2015
- im Hinterkopf behalten werden, wenn irgendwelche verrückten Methoden
2016
- zusammenbastelt werden.
2174
+ Beachte, dass `find_template` nicht prüft, ob eine Datei tatsächlich
2175
+ existiert. Es wird lediglich der angegebene Block aufgerufen und nach allen
2176
+ möglichen Pfaden gesucht. Das ergibt kein Performance-Problem, da `render`
2177
+ `block` verwendet, sobald eine Datei gefunden wurde. Ebenso werden
2178
+ Template-Pfade samt Inhalt gecached, solange nicht im Entwicklungsmodus
2179
+ gearbeitet wird. Das sollte im Hinterkopf behalten werden, wenn irgendwelche
2180
+ verrückten Methoden zusammengebastelt werden.
2017
2181
 
2018
2182
  ### Konfiguration
2019
2183
 
@@ -2038,7 +2202,7 @@ configure do
2038
2202
  end
2039
2203
  ```
2040
2204
 
2041
- Läuft nur, wenn die Umgebung (RACK_ENV-Umgebungsvariable) auf `:production`
2205
+ Läuft nur, wenn die Umgebung (`APP_ENV`-Umgebungsvariable) auf `:production`
2042
2206
  gesetzt ist:
2043
2207
 
2044
2208
  ```ruby
@@ -2072,7 +2236,7 @@ end
2072
2236
  #### Einstellung des Angriffsschutzes
2073
2237
 
2074
2238
  Sinatra verwendet
2075
- [Rack::Protection](https://github.com/rkh/rack-protection#readme), um die
2239
+ [Rack::Protection](https://github.com/sinatra/rack-protection#readme), um die
2076
2240
  Anwendung vor häufig vorkommenden Angriffen zu schützen. Diese Voreinstellung
2077
2241
  lässt sich selbstverständlich deaktivieren, der damit verbundene
2078
2242
  Geschwindigkeitszuwachs steht aber in keinem Verhätnis zu den möglichen
@@ -2096,163 +2260,266 @@ Schutzmechanismen zu deaktivieren:
2096
2260
  set :protection, :except => [:path_traversal, :session_hijacking]
2097
2261
  ```
2098
2262
 
2263
+ Standardmäßig setzt Sinatra einen sitzungbasierten Schutz nur dann ein,
2264
+ wenn `:sessions` aktiviert wurde (siehe oben). Manchmal kann es aber
2265
+ auch sein, dass Sitzungen außerhalb von Sinatra eingerichtet werden,
2266
+ z.B. über eine config.ru oder einer zusätzlichen
2267
+ `Rack::Builder`-Instance. In diesen Situationen kann eine
2268
+ sitzungbasierte Sicherung eingesetzt werden mit Hilfe der
2269
+ `:session`-Option:
2270
+
2271
+ ```ruby
2272
+ set :protection, session => true
2273
+ ```
2274
+
2099
2275
  #### Mögliche Einstellungen
2100
2276
 
2101
2277
  <dl>
2102
2278
  <dt>absolute_redirects</dt>
2103
- <dd>Wenn ausgeschaltet, wird Sinatra relative Redirects zulassen. Jedoch ist
2104
- Sinatra dann nicht mehr mit RFC 2616 (HTTP 1.1) konform, das nur absolute
2105
- Redirects zulässt. Sollte eingeschaltet werden, wenn die Applikation hinter
2106
- einem Reverse-Proxy liegt, der nicht ordentlich eingerichtet ist. Beachte,
2107
- dass die <tt>url</tt>-Helfer-Methode nach wie vor absolute URLs erstellen
2108
- wird, es sei denn, es wird als zweiter Parameter <tt>false</tt> angegeben.
2109
- Standardmäßig nicht aktiviert.</dd>
2279
+ <dd>
2280
+ Wenn ausgeschaltet, wird Sinatra relative Redirects zulassen.
2281
+ Jedoch ist Sinatra dann nicht mehr mit RFC 2616 (HTTP 1.1)
2282
+ konform, das nur absolute Redirects zulässt.
2283
+ </dd>
2284
+ <dd>
2285
+ Sollte eingeschaltet werden, wenn die Applikation hinter einem
2286
+ Reverse-Proxy liegt, der nicht ordentlich eingerichtet ist.
2287
+ Beachte, dass die <tt>url</tt>-Helfer-Methode nach wie vor
2288
+ absolute URLs erstellen wird, es sei denn, es wird als zweiter
2289
+ Parameter <tt>false</tt> angegeben.
2290
+ </dd>
2291
+ <dd>Standardmäßig nicht aktiviert.</dd>
2110
2292
 
2111
2293
  <dt>add_charset</dt>
2112
- <dd>Mime-Types werden hier automatisch der Helfer-Methode
2113
- <tt>content_type</tt> zugeordnet. Es empfielt sich, Werte hinzuzufügen statt
2114
- sie zu überschreiben: <tt>settings.add_charset << "application/foobar"</tt>
2115
- </dd>
2294
+ <dd>
2295
+ Mime-Types werden hier automatisch der Helfer-Methode
2296
+ <tt>content_type</tt> zugeordnet. Es empfielt sich, Werte
2297
+ hinzuzufügen statt sie zu überschreiben: <tt>settings.add_charset
2298
+ << "application/foobar"</tt>
2299
+ </dd>
2116
2300
 
2117
2301
  <dt>app_file</dt>
2118
- <dd>Pfad zur Hauptdatei der Applikation. Wird verwendet, um das Wurzel-,
2119
- Inline-, View- und öffentliche Verzeichnis des Projekts festzustellen.</dd>
2302
+ <dd>
2303
+ Pfad zur Hauptdatei der Applikation. Wird verwendet, um das Wurzel-,
2304
+ Inline-, View- und öffentliche Verzeichnis des Projekts festzustellen.
2305
+ </dd>
2120
2306
 
2121
2307
  <dt>bind</dt>
2122
- <dd>IP-Address, an die gebunden wird (Standardwert: <tt>0.0.0.0</tt>
2123
- <em>oder</em> <tt>localhost</tt>). Wird nur für den eingebauten Server
2124
- verwendet.</dd>
2308
+ <dd>
2309
+ IP-Address, an die gebunden wird (Standardwert: <tt>0.0.0.0</tt>
2310
+ <em>oder</em> <tt>localhost</tt>). Wird nur für den eingebauten Server
2311
+ verwendet.
2312
+ </dd>
2125
2313
 
2126
2314
  <dt>default_encoding</dt>
2127
- <dd>Das Encoding, falls keines angegeben wurde. Standardwert ist
2128
- <tt>"utf-8"</tt>.</dd>
2315
+ <dd>
2316
+ Das Encoding, falls keines angegeben wurde. Standardwert ist
2317
+ <tt>"utf-8"</tt>.
2318
+ </dd>
2129
2319
 
2130
2320
  <dt>dump_errors</dt>
2131
- <dd>Fehler im Log anzeigen.</dd>
2321
+ <dd>Fehler im Log anzeigen.</dd>
2132
2322
 
2133
2323
  <dt>environment</dt>
2134
- <dd>Momentane Umgebung. Standardmäßig auf <tt>content_type</tt> oder
2135
- <tt>"development"</tt> eingestellt, soweit ersteres nicht vorhanden.</dd>
2324
+ <dd>
2325
+ Momentane Umgebung. Standardmäßig auf <tt>ENV['APP_ENV']</tt> oder
2326
+ <tt>"development"</tt> eingestellt, soweit ersteres nicht vorhanden.
2327
+ </dd>
2136
2328
 
2137
2329
  <dt>logging</dt>
2138
- <dd>Den Logger verwenden.</dd>
2330
+ <dd>Den Logger verwenden.</dd>
2139
2331
 
2140
2332
  <dt>lock</dt>
2141
- <dd>Jeder Request wird gelocked. Es kann nur ein Request pro Ruby-Prozess
2142
- gleichzeitig verarbeitet werden. Eingeschaltet, wenn die Applikation
2143
- threadsicher ist. Standardmäßig nicht aktiviert.</dd>
2333
+ <dd>
2334
+ Jeder Request wird gelocked. Es kann nur ein Request pro Ruby-Prozess
2335
+ gleichzeitig verarbeitet werden.
2336
+ </dd>
2337
+ <dd>
2338
+ Eingeschaltet, wenn die Applikation threadsicher ist. Standardmäßig
2339
+ nicht aktiviert.
2340
+ </dd>
2144
2341
 
2145
2342
  <dt>method_override</dt>
2146
- <dd>Verwende <tt>_method</tt>, um put/delete-Formulardaten in Browsern zu
2147
- verwenden, die dies normalerweise nicht unterstützen.</dd>
2343
+ <dd>
2344
+ Verwende <tt>_method</tt>, um put/delete-Formulardaten in Browsern zu
2345
+ verwenden, die dies normalerweise nicht unterstützen.
2346
+ </dd>
2347
+
2348
+ <dt>mustermann_opts</dt>
2349
+ <dd>
2350
+ Ein Hash mit Standardeinstellungen, der an Mustermann.new beim
2351
+ Kompilieren der Routen übergeben wird.
2352
+ </dd>
2148
2353
 
2149
2354
  <dt>port</dt>
2150
- <dd>Port für die Applikation. Wird nur im internen Server verwendet.</dd>
2355
+ <dd>Port für die Applikation. Wird nur im internen Server verwendet.</dd>
2151
2356
 
2152
2357
  <dt>prefixed_redirects</dt>
2153
- <dd>Entscheidet, ob <tt>request.script_name</tt> in Redirects eingefügt wird
2154
- oder nicht, wenn kein absoluter Pfad angegeben ist. Auf diese Weise verhält
2155
- sich <tt>redirect '/foo'</tt> so, als wäre es ein <tt>redirect
2156
- to('/foo')</tt>. Standardmäßig nicht aktiviert.</dd>
2358
+ <dd>
2359
+ Entscheidet, ob <tt>request.script_name</tt> in Redirects
2360
+ eingefügt wird oder nicht, wenn kein absoluter Pfad angegeben ist.
2361
+ Auf diese Weise verhält sich <tt>redirect '/foo'</tt> so, als wäre
2362
+ es ein <tt>redirect to('/foo')</tt>. Standardmäßig nicht
2363
+ aktiviert.
2364
+ </dd>
2157
2365
 
2158
2366
  <dt>protection</dt>
2159
- <dd>Legt fest, ob der Schutzmechanismus für häufig Vorkommende Webangriffe
2160
- auf Webapplikationen aktiviert wird oder nicht. Weitere Informationen im
2161
- vorhergehenden Abschnitt.</dd>
2367
+ <dd>
2368
+ Legt fest, ob der Schutzmechanismus für häufig Vorkommende Webangriffe
2369
+ auf Webapplikationen aktiviert wird oder nicht. Weitere Informationen im
2370
+ vorhergehenden Abschnitt.
2371
+ </dd>
2162
2372
 
2163
2373
  <dt>public_folder</dt>
2164
- <dd>Das öffentliche Verzeichnis, aus dem Daten zur Verfügung gestellt werden
2165
- können. Wird nur dann verwendet, wenn statische Daten zur Verfügung gestellt
2166
- werden können (s.u. <tt>static</tt> Option). Leitet sich von der
2167
- <tt>app_file</tt> Einstellung ab, wenn nicht gesetzt.</dd>
2374
+ <dd>
2375
+ Das öffentliche Verzeichnis, aus dem Daten zur Verfügung gestellt
2376
+ werden können. Wird nur dann verwendet, wenn statische Daten zur
2377
+ Verfügung gestellt werden können (s.u. <tt>static</tt> Option).
2378
+ Leitet sich von der <tt>app_file</tt> Einstellung ab, wenn nicht
2379
+ gesetzt.
2380
+ </dd>
2381
+
2382
+ <dt>quiet</dt>
2383
+ <dd>
2384
+ Deaktiviert Logs, die beim Starten und Beenden von Sinatra
2385
+ ausgegeben werden. <tt>false</tt> ist die Standardeinstellung.
2386
+ </dd>
2168
2387
 
2169
2388
  <dt>public_dir</dt>
2170
- <dd>Alias für <tt>public_folder</tt>, s.o.</dd>
2389
+ <dd>Alias für <tt>public_folder</tt>, s.o.</dd>
2171
2390
 
2172
2391
  <dt>reload_templates</dt>
2173
- <dd>Im development-Modus aktiviert.</dd>
2392
+ <dd>
2393
+ Legt fest, ob Templates für jede Anfrage neu generiert werden. Im
2394
+ development-Modus aktiviert.
2395
+ </dd>
2174
2396
 
2175
2397
  <dt>root</dt>
2176
- <dd>Wurzelverzeichnis des Projekts. Leitet sich von der <tt>app_file</tt>
2177
- Einstellung ab, wenn nicht gesetzt.</dd>
2398
+ <dd>
2399
+ Wurzelverzeichnis des Projekts. Leitet sich von der <tt>app_file</tt>
2400
+ Einstellung ab, wenn nicht gesetzt.
2401
+ </dd>
2178
2402
 
2179
2403
  <dt>raise_errors</dt>
2180
- <dd>Einen Ausnahmezustand aufrufen. Beendet die Applikation. Ist automatisch
2181
- aktiviert, wenn die Umgebung auf <tt>"test"</tt> eingestellt ist. Ansonsten
2182
- ist diese Option deaktiviert.</dd>
2404
+ <dd>
2405
+ Einen Ausnahmezustand aufrufen. Beendet die Applikation. Ist
2406
+ automatisch aktiviert, wenn die Umgebung auf <tt>"test"</tt>
2407
+ eingestellt ist. Ansonsten ist diese Option deaktiviert.
2408
+ </dd>
2183
2409
 
2184
2410
  <dt>run</dt>
2185
- <dd>Wenn aktiviert, wird Sinatra versuchen, den Webserver zu starten. Nicht
2186
- verwenden, wenn Rackup oder anderes verwendet werden soll.</dd>
2411
+ <dd>
2412
+ Wenn aktiviert, wird Sinatra versuchen, den Webserver zu starten. Nicht
2413
+ verwenden, wenn Rackup oder anderes verwendet werden soll.
2414
+ </dd>
2187
2415
 
2188
2416
  <dt>running</dt>
2189
- <dd>Läuft der eingebaute Server? Diese Einstellung nicht ändern!</dd>
2417
+ <dd>Läuft der eingebaute Server? Diese Einstellung nicht ändern!</dd>
2190
2418
 
2191
2419
  <dt>server</dt>
2192
- <dd>Server oder Liste von Servern, die als eingebaute Server zur Verfügung
2193
- stehen. Die Reihenfolge gibt die Priorität vor, die Voreinstellung hängt von
2194
- der verwendenten Ruby Implementierung ab.</dd>
2420
+ <dd>
2421
+ Server oder Liste von Servern, die als eingebaute Server zur
2422
+ Verfügung stehen. Die Reihenfolge gibt die Priorität vor, die
2423
+ Voreinstellung hängt von der verwendenten Ruby Implementierung ab.
2424
+ </dd>
2195
2425
 
2196
2426
  <dt>sessions</dt>
2197
- <dd>Sessions auf Cookiebasis mittels
2198
- <tt>Rack::Session::Cookie</tt>aktivieren. Für weitere Infos bitte in der
2199
- Sektion ‘Sessions verwenden’ nachschauen.</dd>
2427
+ <dd>
2428
+ Sessions auf Cookiebasis mittels
2429
+ <tt>Rack::Session::Cookie</tt> aktivieren. Für weitere Infos bitte
2430
+ in der Sektion ‘Sessions verwenden’ nachschauen.
2431
+ </dd>
2432
+
2433
+ <dt>session_store</dt>
2434
+ <dd>
2435
+ Die verwendete Rack Sitzungs-Middleware. Verweist standardmäßig
2436
+ auf <tt>Rack::Session::Cookie</tt>. Für weitere Infos bitte
2437
+ in der Sektion ‘Sessions verwenden’ nachschauen.
2438
+ </dd>
2200
2439
 
2201
2440
  <dt>show_exceptions</dt>
2202
- <dd>Bei Fehlern einen Stacktrace im Browseranzeigen. Ist automatisch
2203
- aktiviert, wenn die Umgebung auf <tt>"development"</tt> eingestellt ist.
2204
- Ansonsten ist diese Option deaktiviert. Kann auch auf <tt>:after_handler</tt>
2205
- gestellt werden, um eine anwendungsspezifische Fehlerbehandlung auszulösen,
2206
- bevor der Fehlerverlauf im Browser angezeigt wird.</dd>
2441
+ <dd>
2442
+ Bei Fehlern einen Stacktrace im Browseranzeigen. Ist automatisch
2443
+ aktiviert, wenn die Umgebung auf <tt>"development"</tt>
2444
+ eingestellt ist. Ansonsten ist diese Option deaktiviert.
2445
+ </dd>
2446
+ <dd>
2447
+ Kann auch auf <tt>:after_handler</tt> gestellt werden, um eine
2448
+ anwendungsspezifische Fehlerbehandlung auszulösen, bevor der
2449
+ Fehlerverlauf im Browser angezeigt wird.
2450
+ </dd>
2207
2451
 
2208
2452
  <dt>static</dt>
2209
- <dd>Entscheidet, ob Sinatra statische Dateien zur Verfügung stellen soll oder
2210
- nicht. Sollte nicht aktiviert werden, wenn ein Server verwendet wird, der
2211
- dies auch selbstständig erledigen kann. Deaktivieren wird die Performance
2212
- erhöhen. Standardmäßig aktiviert.</dd>
2453
+ <dd>
2454
+ Entscheidet, ob Sinatra statische Dateien zur Verfügung stellen
2455
+ soll oder nicht. Sollte nicht aktiviert werden, wenn ein Server
2456
+ verwendet wird, der dies auch selbstständig erledigen kann.
2457
+ Deaktivieren wird die Performance erhöhen. Standardmäßig
2458
+ aktiviert.
2459
+ </dd>
2213
2460
 
2214
2461
  <dt>static_cache_control</dt>
2215
- <dd>Wenn Sinatra statische Daten zur Verfügung stellt, können mit dieser
2216
- Einstellung die <tt>Cache-Control</tt> Header zu den Responses hinzugefügt
2217
- werden. Die Einstellung verwendet dazu die <tt>cache_control</tt>
2218
- Helfer-Methode. Standardmäßig deaktiviert. Ein Array wird verwendet, um
2219
- mehrere Werte gleichzeitig zu übergeben: <tt>set :static_cache_control,
2220
- [:public, :max_age => 300]</tt></dd>
2462
+ <dd>
2463
+ Wenn Sinatra statische Daten zur Verfügung stellt, können mit
2464
+ dieser Einstellung die <tt>Cache-Control</tt> Header zu den
2465
+ Responses hinzugefügt werden. Die Einstellung verwendet dazu die
2466
+ <tt>cache_control</tt> Helfer-Methode. Standardmäßig deaktiviert.
2467
+ Ein Array wird verwendet, um mehrere Werte gleichzeitig zu
2468
+ übergeben: <tt>set :static_cache_control, [:public, :max_age =>
2469
+ 300]</tt>
2470
+ </dd>
2221
2471
 
2222
2472
  <dt>threaded</dt>
2223
- <dd>Wird es auf <tt>true</tt> gesetzt, wird Thin aufgefordert
2224
- <tt>EventMachine.defer</tt> zur Verarbeitung des Requests einzusetzen.</dd>
2473
+ <dd>
2474
+ Wird es auf <tt>true</tt> gesetzt, wird Thin aufgefordert
2475
+ <tt>EventMachine.defer</tt> zur Verarbeitung des Requests einzusetzen.
2476
+ </dd>
2225
2477
 
2226
2478
  <dt>traps</dt>
2227
- <dd>Einstellung, Sinatra System signalen umgehen soll.</dd>
2479
+ <dd>Legt fest, wie Sinatra mit System-Signalen umgehen soll.</dd>
2228
2480
 
2229
2481
  <dt>views</dt>
2230
- <dd>Verzeichnis der Views. Leitet sich von der <tt>app_file</tt> Einstellung
2231
- ab, wenn nicht gesetzt.</dd>
2482
+ <dd>
2483
+ Verzeichnis der Views. Leitet sich von der <tt>app_file</tt> Einstellung
2484
+ ab, wenn nicht gesetzt.
2485
+ </dd>
2232
2486
 
2233
2487
  <dt>x_cascade</dt>
2234
- <dd>Einstellung, ob der X-Cascade Header bei fehlender Route gesetzt wird oder
2235
- nicht. Standardeinstellung ist <tt>true</tt>.</dd>
2488
+ <dd>
2489
+ Einstellung, ob der X-Cascade Header bei fehlender Route gesetzt
2490
+ wird oder nicht. Standardeinstellung ist <tt>true</tt>.
2491
+ </dd>
2236
2492
  </dl>
2237
2493
 
2238
2494
  ## Umgebungen
2239
2495
 
2240
2496
  Es gibt drei voreingestellte Umgebungen in Sinatra: `"development"`,
2241
- `"production"` und `"test"`. Umgebungen können über die `RACK_ENV`
2497
+ `"production"` und `"test"`. Umgebungen können über die `APP_ENV`
2242
2498
  Umgebungsvariable gesetzt werden. Die Standardeinstellung ist `"development"`.
2243
2499
  In diesem Modus werden alle Templates zwischen Requests neu geladen. Dazu gibt
2244
2500
  es besondere Fehlerseiten für 404 Stati und Fehlermeldungen. In `"production"`
2245
2501
  und `"test"` werden Templates automatisch gecached.
2246
2502
 
2247
- Um die Anwendung in einer anderen Umgebung auszuführen kann man die `-e`
2248
- Option verwenden:
2503
+ Um die Anwendung in einer anderen Umgebung auszuführen, kann man die
2504
+ `APP_ENV`-Umgebungsvariable setzen:
2249
2505
 
2250
2506
  ```shell
2251
- ruby my_app.rb -e [ENVIRONMENT]
2507
+ APP_ENV=production ruby my_app.rb
2252
2508
  ```
2253
2509
 
2254
- In der Anwendung kann man die die Methoden `development?`, `test?` und
2255
- `production?` verwenden, um die aktuelle Umgebung zu erfahren.
2510
+ In der Anwendung kann man die die Methoden `development?`, `test?` und
2511
+ `production?` verwenden, um die aktuelle Umgebung zu erfahren:
2512
+
2513
+
2514
+ ```ruby
2515
+ get '/' do
2516
+ if settings.development?
2517
+ "development!"
2518
+ else
2519
+ "nicht development!"
2520
+ end
2521
+ end
2522
+ ```
2256
2523
 
2257
2524
  ## Fehlerbehandlung
2258
2525
 
@@ -2332,12 +2599,12 @@ end
2332
2599
  ```
2333
2600
 
2334
2601
  Sinatra setzt verschiedene `not_found`- und `error`-Handler in der
2335
- Development-Umgebung ein, um hilfreiche Debugging Informationen und Stack Traces
2336
- anzuzeigen.
2602
+ Development-Umgebung ein, um hilfreiche Debugging-Informationen und
2603
+ Stack-Traces anzuzeigen.
2337
2604
 
2338
2605
  ## Rack-Middleware
2339
2606
 
2340
- Sinatra baut auf [Rack](http://rack.github.io/), einem minimalistischen
2607
+ Sinatra baut auf [Rack](http://rack.github.io/) auf, einem minimalistischen
2341
2608
  Standard-Interface für Ruby-Webframeworks. Eines der interessantesten Features
2342
2609
  für Entwickler ist der Support von Middlewares, die zwischen den Server und
2343
2610
  die Anwendung geschaltet werden und so HTTP-Request und/oder Antwort
@@ -2359,9 +2626,10 @@ end
2359
2626
  ```
2360
2627
 
2361
2628
  Die Semantik von `use` entspricht der gleichnamigen Methode der
2362
- [Rack::Builder](http://rubydoc.info/github/rack/rack/master/Rack/Builder)-DSL
2629
+ [Rack::Builder](http://www.rubydoc.info/github/rack/rack/master/Rack/Builder)-DSL
2363
2630
  (meist verwendet in Rackup-Dateien). Ein Beispiel dafür ist, dass die
2364
- `use`-Methode mehrere/verschiedene Argumente und auch Blöcke entgegennimmt:
2631
+ `use`-Methode mehrere/verschiedene Argumente und auch Blöcke
2632
+ entgegennimmt:
2365
2633
 
2366
2634
  ```ruby
2367
2635
  use Rack::Auth::Basic do |username, password|
@@ -2381,8 +2649,9 @@ oder im [Rack wiki](https://github.com/rack/rack/wiki/List-of-Middleware).
2381
2649
 
2382
2650
  ## Testen
2383
2651
 
2384
- Sinatra-Tests können mit jedem auf Rack aufbauendem Test-Framework geschrieben
2385
- werden. [Rack::Test](http://rdoc.info/github/brynary/rack-test/master/frames)
2652
+ Sinatra-Tests können mit jedem auf Rack aufbauendem Test-Framework
2653
+ geschrieben werden.
2654
+ [Rack::Test](http://www.rubydoc.info/github/brynary/rack-test/master/frames)
2386
2655
  wird empfohlen:
2387
2656
 
2388
2657
  ```ruby
@@ -2407,15 +2676,16 @@ class MyAppTest < Minitest::Test
2407
2676
  assert_equal 'Hallo Frank!', last_response.body
2408
2677
  end
2409
2678
 
2410
- def test_with_rack_env
2679
+ def test_with_user_agent
2411
2680
  get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
2412
2681
  assert_equal "Du verwendest Songbird!", last_response.body
2413
2682
  end
2414
2683
  end
2415
2684
  ```
2416
2685
 
2417
- Hinweis: Wird Sinatra modular verwendet, muss <tt>Sinatra::Application</tt> mit
2418
- dem Namen der Applikations-Klasse ersetzt werden.
2686
+ Hinweis: Wird Sinatra modular verwendet, muss
2687
+ `Sinatra::Application` mit dem Namen der Applikations-Klasse
2688
+ ersetzt werden.
2419
2689
 
2420
2690
  ## Sinatra::Base - Middleware, Bibliotheken und modulare Anwendungen
2421
2691
 
@@ -2442,34 +2712,25 @@ class MyApp < Sinatra::Base
2442
2712
  end
2443
2713
  ```
2444
2714
 
2445
- Die MyApp-Klasse ist eine unabhängige Rack-Komponente, die als Middleware,
2446
- Endpunkt oder via Rails Metal verwendet werden kann. Verwendet wird sie durch
2447
- `use` oder `run` von einer Rackup-`config.ru`-Datei oder als Server-Komponente
2448
- einer Bibliothek:
2449
-
2450
- ```ruby
2451
- MyApp.run! :host => 'localhost', :port => 9090
2452
- ```
2453
-
2454
2715
  Die Methoden der `Sinatra::Base`-Subklasse sind genau dieselben wie die der
2455
2716
  Top-Level-DSL. Die meisten Top-Level-Anwendungen können mit nur zwei
2456
2717
  Veränderungen zu `Sinatra::Base` konvertiert werden:
2457
2718
 
2458
2719
  * Die Datei sollte `require 'sinatra/base'` anstelle von `require
2459
- 'sinatra/base'` aufrufen, ansonsten werden alle von Sinatras DSL-Methoden
2720
+ 'sinatra'` aufrufen, ansonsten werden alle von Sinatras DSL-Methoden
2460
2721
  in den Top-Level-Namespace importiert.
2461
2722
  * Alle Routen, Error-Handler, Filter und Optionen der Applikation müssen in
2462
2723
  einer Subklasse von `Sinatra::Base` definiert werden.
2463
2724
 
2464
2725
  `Sinatra::Base` ist ein unbeschriebenes Blatt. Die meisten Optionen sind per
2465
2726
  Standard deaktiviert. Das betrifft auch den eingebauten Server. Siehe
2466
- [Optionen und Konfiguration](http://sinatra.github.com/configuration.html) für
2727
+ [Optionen und Konfiguration](http://www.sinatrarb.com/configuration.html) für
2467
2728
  Details über mögliche Optionen.
2468
2729
 
2469
2730
  Damit eine App sich ähnlich wie eine klassische App verhält, kann man
2470
2731
  auch eine Subclass von `Sinatra::Application` erstellen:
2471
2732
 
2472
- ``` ruby
2733
+ ```ruby
2473
2734
  require 'sinatra/base'
2474
2735
 
2475
2736
  class MyApp < Sinatra::Application
@@ -2540,7 +2801,7 @@ werden:
2540
2801
  <tr>
2541
2802
  <td>static</td>
2542
2803
  <td>true</td>
2543
- <td>false</td>
2804
+ <td>File.exist?(public_folder)</td>
2544
2805
  <td>true</td>
2545
2806
  </tr>
2546
2807
  </table>
@@ -2612,7 +2873,6 @@ Anzeichen dafür, dass eine `config.ru`-Datei gebraucht wird:
2612
2873
  * Es gibt mehr als nur eine Subklasse von `Sinatra::Base`.
2613
2874
  * Sinatra soll als Middleware verwendet werden, nicht als Endpunkt.
2614
2875
 
2615
-
2616
2876
  **Es gibt keinen Grund, eine `config.ru`-Datei zu verwenden, nur weil eine
2617
2877
  Anwendung im modularen Stil betrieben werden soll. Ebenso wird keine Anwendung
2618
2878
  mit modularem Stil benötigt, um eine `config.ru`-Datei zu verwenden.**
@@ -2623,7 +2883,7 @@ Es ist nicht nur möglich, andere Rack-Middleware mit Sinatra zu nutzen, es
2623
2883
  kann außerdem jede Sinatra-Anwendung selbst als Middleware vor jeden
2624
2884
  beliebigen Rack-Endpunkt gehangen werden. Bei diesem Endpunkt muss es sich
2625
2885
  nicht um eine andere Sinatra-Anwendung handeln, es kann jede andere
2626
- Rack-Anwendung sein (Rails/Ramaze/Camping/...):
2886
+ Rack-Anwendung sein (Rails/Hanami/Roda/...):
2627
2887
 
2628
2888
  ```ruby
2629
2889
  require 'sinatra/base'
@@ -2723,7 +2983,7 @@ Optionen, die via `set` gesetzt werden, sind Methoden auf Klassenebene:
2723
2983
  ```ruby
2724
2984
  class MyApp < Sinatra::Base
2725
2985
  # Hey, ich bin im Anwendungsscope!
2726
- set :foo, 42
2986
+ set :foo, 42
2727
2987
  foo # => 42
2728
2988
 
2729
2989
  get '/foo' do
@@ -2734,20 +2994,18 @@ end
2734
2994
 
2735
2995
  Im Anwendungs-Scope befindet man sich:
2736
2996
 
2737
- * In der Anwendungs-Klasse.
2738
- * In Methoden, die von Erweiterungen definiert werden.
2739
- * Im Block, der an `helpers` übergeben wird.
2740
- * In Procs und Blöcken, die an `set` übergeben werden.
2997
+ * Innerhalb der Anwendungs-Klasse
2998
+ * In Methoden, die von Erweiterungen definiert werden
2999
+ * Im Block, der an `helpers` übergeben wird
3000
+ * In Procs und Blöcken, die an `set` übergeben werden
2741
3001
  * Der an `Sinatra.new` übergebene Block
2742
3002
 
2743
-
2744
3003
  Auf das Scope-Objekt (die Klasse) kann wie folgt zugegriffen werden:
2745
3004
 
2746
3005
  * Über das Objekt, das an den `configure`-Block übergeben wird (`configure {
2747
3006
  |c| ... }`).
2748
3007
  * `settings` aus den anderen Scopes heraus.
2749
3008
 
2750
-
2751
3009
  ### Anfrage- oder Instanz-Scope
2752
3010
 
2753
3011
  Für jede eingehende Anfrage wird eine neue Instanz der Anwendungs-Klasse
@@ -2778,8 +3036,7 @@ Im Anfrage-Scope befindet man sich:
2778
3036
  * In get, head, post, put, delete, options, patch, link und unlink Blöcken
2779
3037
  * In before und after Filtern
2780
3038
  * In Helfer-Methoden
2781
- * In Templates
2782
-
3039
+ * In Templates/Views
2783
3040
 
2784
3041
  ### Delegation-Scope
2785
3042
 
@@ -2796,18 +3053,17 @@ Im Delegation-Scop befindet man sich:
2796
3053
  * Im Top-Level, wenn `require 'sinatra'` aufgerufen wurde.
2797
3054
  * In einem Objekt, das mit dem `Sinatra::Delegator`-Mixin erweitert wurde.
2798
3055
 
2799
-
2800
3056
  Schau am besten im Code nach: Hier ist [Sinatra::Delegator
2801
3057
  mixin](http://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1064
2802
3058
  ) definiert und wird in den [globalen Namespace
2803
- eingebunden](http://github.com/sinatra/sinatra/blob/master/lib/sinatra/main.rb
3059
+ eingebunden](http://github.com/sinatra/sinatra/blob/master/lib/sinatra/main.rb).
2804
3060
 
2805
3061
  ## Kommandozeile
2806
3062
 
2807
3063
  Sinatra-Anwendungen können direkt von der Kommandozeile aus gestartet werden:
2808
3064
 
2809
3065
  ```shell
2810
- ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-h HOST] [-s HANDLER]
3066
+ ruby myapp.rb [-h] [-x] [-q] [-e ENVIRONMENT] [-p PORT] [-h HOST] [-s HANDLER]
2811
3067
  ```
2812
3068
 
2813
3069
  Die Optionen sind:
@@ -2818,50 +3074,84 @@ Die Optionen sind:
2818
3074
  -h # Host setzen (Standard ist 0.0.0.0)
2819
3075
  -e # Umgebung setzen (Standard ist development)
2820
3076
  -s # Rack-Server/Handler setzen (Standard ist thin)
2821
- -x # Mutex-Lock einschalten (Standard ist off)
3077
+ -q # den lautlosen Server-Modus einschalten (Standard ist aus)
3078
+ -x # Mutex-Lock einschalten (Standard ist aus)
2822
3079
  ```
2823
3080
 
3081
+ ### Multi-threading
3082
+
3083
+ _Paraphrasiert von [dieser Antwort auf StackOverflow][so-answer] von
3084
+ Konstantin_
3085
+
3086
+ Sinatra erlegt kein Nebenläufigkeitsmodell auf, sondern überlässt dies dem
3087
+ selbst gewählten Rack-Proxy (Server), so wie Thin, Puma oder WEBrick.
3088
+ Sinatra selbst ist Thread-sicher, somit ist es kein Problem wenn der
3089
+ Rack-Proxy ein anderes Threading-Modell für Nebenläufigkeit benutzt.
3090
+ Das heißt, dass wenn der Server gestartet wird, dass man die korrekte
3091
+ Aufrufsmethode benutzen sollte für den jeweiligen Rack-Proxy.
3092
+ Das folgende Beispiel ist eine Veranschaulichung eines mehrprozessigen
3093
+ Thin Servers:
3094
+
3095
+ ``` ruby
3096
+ # app.rb
3097
+
3098
+ require 'sinatra/base'
3099
+
3100
+ class App < Sinatra::Base
3101
+ get '/' do
3102
+ "Hello, World"
3103
+ end
3104
+ end
3105
+
3106
+ App.run!
3107
+
3108
+ ```
3109
+
3110
+ Um den Server zu starten, führt man das folgende Kommando aus:
3111
+
3112
+ ``` shell
3113
+ thin --threaded start
3114
+ ```
3115
+
3116
+ [so-answer]: http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999)
3117
+
2824
3118
  ## Systemanforderungen
2825
3119
 
2826
3120
  Die folgenden Versionen werden offiziell unterstützt:
2827
3121
 
2828
3122
  <dl>
2829
- <dt>Ruby 1.8.7</dt>
2830
- <dd>1.8.7 wird vollständig unterstützt, ein Wechsel zu JRuby oder Rubinius wird
2831
- aber empfohlen. Ruby 1.8.7 wird noch bis Sinatra 2.0 unterstützt werden. Frühere
2832
- Versionen von Ruby sind nicht kompatibel mit Sinatra.</dd>
2833
-
2834
- <dt>Ruby 1.9.2</dt>
2835
- <dd>1.9.2 wird mindestens bis Sinatra 1.5 voll unterstützt. Version 1.9.2p0
2836
- sollte nicht verwendet werden, da unter Sinatra immer wieder Segfaults
2837
- auftreten.</dd>
2838
-
2839
- <dt>Ruby 1.9.3</dt>
2840
- <dd>1.9.3 wird vollständig unterstützt und empfohlen. Achtung, bei einem
2841
- Upgrade von einer früheren Version von Ruby zu Ruby 1.9.3 werden alle Sessions
2842
- ungültig. Ruby 1.9.3 wird bis Sinatra 2.0 unterstützt werden.</dd>
2843
-
2844
- <dt>Ruby 2.x</dt>
2845
- <dd>2.x wird vollständig unterstützt.</dd>
2846
-
2847
- <dt>Rubinius</dt>
2848
- <dd>Rubinius (Version >= 2.x) wird offiziell unterstützt. Es wird empfohlen, den
2849
- <a href="http://puma.io">Puma Server</a> zu installieren (<tt>gem install puma
2850
- </tt>)</dd>
2851
-
2852
- <dt>JRuby</dt>
2853
- <dd>Aktuelle JRuby Versionen werden offiziell unterstützt. Es wird empfohlen,
2854
- keine C-Erweiterungen zu verwenden und als Server Trinidad zu verwenden
2855
- (<tt>gem install trinidad</tt>).</dd>
3123
+ <dt>Ruby 2.2</dt>
3124
+ <dd>
3125
+ 2.2 wird vollständig unterstützt. Es gibt derzeit keine Pläne die
3126
+ offizielle Unterstützung zu beenden
3127
+ </dd>
3128
+
3129
+ <dt>Rubinius</dt>
3130
+ <dd>
3131
+ Rubinius (Version >= 2.x) wird offiziell unterstützt. Es wird
3132
+ empfohlen, den <a href="http://puma.io">Puma Server</a> zu
3133
+ installieren (<tt>gem install puma</tt>)
3134
+ </dd>
3135
+
3136
+ <dt>JRuby</dt>
3137
+ <dd>
3138
+ Aktuelle JRuby Versionen werden offiziell unterstützt. Es wird empfohlen,
3139
+ keine C-Erweiterungen zu verwenden und als Server Trinidad zu verwenden
3140
+ (<tt>gem install trinidad</tt>).
3141
+ </dd>
2856
3142
  </dl>
2857
3143
 
3144
+ Versionen vor Ruby 2.2.2 werden ab Sinatra 2.0 nicht länger unterstützt.
3145
+
3146
+ Nachfolgende Ruby-Versionen werden regelmäßig auf Unterstützung geprüft.
3147
+
2858
3148
  Die nachfolgend aufgeführten Ruby-Implementierungen werden offiziell nicht von
2859
3149
  Sinatra unterstützt, funktionieren aber normalerweise:
2860
3150
 
2861
3151
  * Ruby Enterprise Edition
2862
3152
  * Ältere Versionen von JRuby und Rubinius
2863
- * MacRuby (<tt>gem install control_tower</tt> wird empfohlen), Maglev, IronRuby
2864
- * Ruby 1.9.0 und 1.9.1
3153
+ * MacRuby, Maglev, IronRuby
3154
+ * Ruby 1.9.0 und 1.9.1 (wird aber nicht empfohlen)
2865
3155
 
2866
3156
  Nicht offiziell unterstützt bedeutet, dass wenn Sachen nicht funktionieren,
2867
3157
  wir davon ausgehen, dass es nicht an Sinatra sondern an der jeweiligen
@@ -2871,10 +3161,11 @@ Im Rahmen unserer CI (Kontinuierlichen Integration) wird bereits ruby-head
2871
3161
  (zukünftige Versionen von MRI) mit eingebunden. Es kann davon ausgegangen
2872
3162
  werden, dass Sinatra MRI auch weiterhin vollständig unterstützen wird.
2873
3163
 
2874
- Sinatra sollte auf jedem Betriebssystem laufen, dass einen funktionierenden
3164
+ Sinatra sollte auf jedem Betriebssystem laufen, das einen funktionierenden
2875
3165
  Ruby-Interpreter aufweist.
2876
3166
 
2877
- Sinatra läuft aktuell nicht unter Cardinal, SmallRuby, BlueRuby oder Ruby <= 1.8.7.
3167
+ Sinatra läuft aktuell nicht unter Cardinal, SmallRuby, BlueRuby oder Ruby <=
3168
+ 2.2.
2878
3169
 
2879
3170
  ## Der neuste Stand (The Bleeding Edge)
2880
3171
 
@@ -2889,7 +3180,7 @@ gem install sinatra --pre
2889
3180
  ### Mit Bundler
2890
3181
 
2891
3182
  Wenn die Applikation mit der neuesten Version von Sinatra und
2892
- [Bundler](http://gembundler.com/) genutzt werden soll, empfehlen wir den
3183
+ [Bundler](http://bundler.io) genutzt werden soll, empfehlen wir den
2893
3184
  nachfolgenden Weg.
2894
3185
 
2895
3186
  Soweit Bundler noch nicht installiert ist:
@@ -2907,7 +3198,6 @@ gem 'sinatra', :git => "git://github.com/sinatra/sinatra.git"
2907
3198
 
2908
3199
  # evtl. andere Abhängigkeiten
2909
3200
  gem 'haml' # z.B. wenn du Haml verwendest...
2910
- gem 'activerecord', '~> 3.0' # ...oder ActiveRecord 3.x
2911
3201
  ```
2912
3202
 
2913
3203
  Beachte: Hier sollten alle Abhängigkeiten eingetragen werden. Sinatras eigene,
@@ -2920,55 +3210,6 @@ Jetzt kannst du deine Applikation starten:
2920
3210
  bundle exec ruby myapp.rb
2921
3211
  ```
2922
3212
 
2923
- ### Eigenes Repository
2924
- Um auf dem neuesten Stand von Sinatras Code zu sein, kann eine lokale Kopie
2925
- angelegt werden. Gestartet wird in der Anwendung mit dem `sinatra/lib`-Ordner
2926
- im `LOAD_PATH`:
2927
-
2928
- ```shell
2929
- cd myapp
2930
- git clone git://github.com/sinatra/sinatra.git
2931
- ruby -Isinatra/lib myapp.rb
2932
- ```
2933
-
2934
- Alternativ kann der `sinatra/lib`-Ordner zum `LOAD_PATH` in der Anwendung
2935
- hinzugefügt werden:
2936
-
2937
- ```ruby
2938
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
2939
- require 'rubygems'
2940
- require 'sinatra'
2941
-
2942
- get '/ueber' do
2943
- "Ich laufe auf Version " + Sinatra::VERSION
2944
- end
2945
- ```
2946
-
2947
- Um Sinatra-Code von Zeit zu Zeit zu aktualisieren:
2948
-
2949
- ```shell
2950
- cd myproject/sinatra
2951
- git pull
2952
- ```
2953
-
2954
- ### Gem erstellen
2955
-
2956
- Aus der eigenen lokalen Kopie kann nun auch ein globales Gem gebaut werden:
2957
-
2958
- ```shell
2959
- git clone git://github.com/sinatra/sinatra.git
2960
- cd sinatra
2961
- rake sinatra.gemspec
2962
- rake install
2963
- ```
2964
-
2965
- Falls Gems als Root installiert werden sollen, sollte die letzte Zeile
2966
- folgendermaßen lauten:
2967
-
2968
- ```shell
2969
- sudo rake install
2970
- ```
2971
-
2972
3213
  ## Versions-Verfahren
2973
3214
 
2974
3215
  Sinatra folgt dem sogenannten [Semantic Versioning](http://semver.org/), d.h.
@@ -2976,19 +3217,23 @@ SemVer und SemVerTag.
2976
3217
 
2977
3218
  ## Mehr
2978
3219
 
2979
- * [Projekt-Website](http://sinatra.github.com/) - Ergänzende Dokumentation,
2980
- News und Links zu anderen Ressourcen.
2981
- * [Mitmachen](http://sinatra.github.com/contributing.html) - Einen Fehler
2982
- gefunden? Brauchst du Hilfe? Hast du einen Patch?
2983
- * [Issue-Tracker](http://github.com/sinatra/sinatra/issues)
2984
- * [Twitter](http://twitter.com/sinatra)
2985
- * [Mailing-Liste](http://groups.google.com/group/sinatrarb)
2986
- * [#sinatra](irc://chat.freenode.net/#sinatra) auf http://freenode.net Es
2987
- gibt dort auch immer wieder deutschsprachige Entwickler, die gerne weiterhelfen.
2988
- * [Sinatra Book](https://github.com/sinatra/sinatra-book/) Kochbuch Tutorial
2989
- * [Sinatra Recipes](http://recipes.sinatrarb.com/) Sinatra-Rezepte aus der
2990
- Community
2991
- * API Dokumentation für die [aktuelle
2992
- Version](http://rubydoc.info/gems/sinatra) oder für
2993
- [HEAD](http://rubydoc.info/github/sinatra/sinatra) auf http://rubydoc.info
2994
- * [CI Server](http://travis-ci.org/sinatra/sinatra)
3220
+ * [Projekt-Website](http://www.sinatrarb.com/) - Ergänzende Dokumentation,
3221
+ News und Links zu anderen Ressourcen.
3222
+ * [Mitmachen](http://www.sinatrarb.com/contributing.html) - Einen Fehler
3223
+ gefunden? Brauchst du Hilfe? Hast du einen Patch?
3224
+ * [Issue-Tracker](https://github.com/sinatra/sinatra/issues)
3225
+ * [Twitter](https://twitter.com/sinatra)
3226
+ * [Mailing-Liste](http://groups.google.com/group/sinatrarb)
3227
+ * IRC [#sinatra](irc://chat.freenode.net/#sinatra) auf
3228
+ http://freenode.net Es gibt dort auch immer wieder deutschsprachige
3229
+ Entwickler, die gerne weiterhelfen.
3230
+ * [Sinatra & Friends](https://sinatrarb.slack.com) on Slack and see
3231
+ [here](https://sinatra-slack.herokuapp.com/) for an invite.
3232
+ * [Sinatra Book](https://github.com/sinatra/sinatra-book/) Kochbuch Tutorial
3233
+ * [Sinatra Recipes](http://recipes.sinatrarb.com/) Sinatra-Rezepte aus der
3234
+ Community
3235
+ * API Dokumentation für die
3236
+ [aktuelle Version](http://www.rubydoc.info//gems/sinatra) oder für
3237
+ [HEAD](http://www.rubydoc.info/github/sinatra/sinatra) auf
3238
+ http://rubydoc.info
3239
+ * [CI Server](https://travis-ci.org/sinatra/sinatra)