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.
- checksums.yaml +4 -4
- data/AUTHORS.md +5 -2
- data/{CHANGES → CHANGELOG.md} +126 -46
- data/CONTRIBUTING.md +100 -0
- data/Gemfile +12 -17
- data/LICENSE +5 -2
- data/MAINTENANCE.md +42 -0
- data/README.de.md +711 -466
- data/README.es.md +206 -171
- data/README.fr.md +370 -344
- data/README.hu.md +44 -10
- data/README.ja.md +300 -210
- data/README.ko.md +230 -191
- data/README.md +675 -528
- data/README.pt-br.md +149 -115
- data/README.pt-pt.md +65 -65
- data/README.ru.md +198 -97
- data/README.zh.md +1943 -1237
- data/Rakefile +72 -49
- data/SECURITY.md +35 -0
- data/lib/sinatra/base.rb +141 -207
- data/lib/sinatra/indifferent_hash.rb +150 -0
- data/lib/sinatra/main.rb +1 -0
- data/lib/sinatra/show_exceptions.rb +70 -56
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +19 -7
- metadata +32 -163
- data/test/asciidoctor_test.rb +0 -72
- data/test/base_test.rb +0 -167
- data/test/builder_test.rb +0 -91
- data/test/coffee_test.rb +0 -96
- data/test/compile_test.rb +0 -183
- data/test/contest.rb +0 -91
- data/test/creole_test.rb +0 -65
- data/test/delegator_test.rb +0 -160
- data/test/encoding_test.rb +0 -20
- data/test/erb_test.rb +0 -116
- data/test/extensions_test.rb +0 -98
- data/test/filter_test.rb +0 -487
- data/test/haml_test.rb +0 -109
- data/test/helper.rb +0 -132
- data/test/helpers_test.rb +0 -1917
- data/test/integration/app.rb +0 -79
- data/test/integration_helper.rb +0 -236
- data/test/integration_test.rb +0 -104
- data/test/less_test.rb +0 -69
- data/test/liquid_test.rb +0 -77
- data/test/mapped_error_test.rb +0 -285
- data/test/markaby_test.rb +0 -80
- data/test/markdown_test.rb +0 -85
- data/test/mediawiki_test.rb +0 -68
- data/test/middleware_test.rb +0 -68
- data/test/nokogiri_test.rb +0 -67
- data/test/public/favicon.ico +0 -0
- data/test/rabl_test.rb +0 -89
- data/test/rack_test.rb +0 -45
- data/test/radius_test.rb +0 -59
- data/test/rdoc_test.rb +0 -66
- data/test/readme_test.rb +0 -130
- data/test/request_test.rb +0 -100
- data/test/response_test.rb +0 -63
- data/test/result_test.rb +0 -76
- data/test/route_added_hook_test.rb +0 -59
- data/test/routing_test.rb +0 -1412
- data/test/sass_test.rb +0 -115
- data/test/scss_test.rb +0 -88
- data/test/server_test.rb +0 -56
- data/test/settings_test.rb +0 -582
- data/test/sinatra_test.rb +0 -12
- data/test/slim_test.rb +0 -102
- data/test/static_test.rb +0 -236
- data/test/streaming_test.rb +0 -149
- data/test/stylus_test.rb +0 -90
- data/test/templates_test.rb +0 -382
- data/test/textile_test.rb +0 -65
- data/test/views/a/in_a.str +0 -1
- data/test/views/ascii.erb +0 -2
- data/test/views/b/in_b.str +0 -1
- data/test/views/calc.html.erb +0 -1
- data/test/views/error.builder +0 -3
- data/test/views/error.erb +0 -3
- data/test/views/error.haml +0 -3
- data/test/views/error.sass +0 -2
- data/test/views/explicitly_nested.str +0 -1
- data/test/views/foo/hello.test +0 -1
- data/test/views/hello.asciidoc +0 -1
- data/test/views/hello.builder +0 -1
- data/test/views/hello.coffee +0 -1
- data/test/views/hello.creole +0 -1
- data/test/views/hello.erb +0 -1
- data/test/views/hello.haml +0 -1
- data/test/views/hello.less +0 -5
- data/test/views/hello.liquid +0 -1
- data/test/views/hello.mab +0 -1
- data/test/views/hello.md +0 -1
- data/test/views/hello.mediawiki +0 -1
- data/test/views/hello.nokogiri +0 -1
- data/test/views/hello.rabl +0 -2
- data/test/views/hello.radius +0 -1
- data/test/views/hello.rdoc +0 -1
- data/test/views/hello.sass +0 -2
- data/test/views/hello.scss +0 -3
- data/test/views/hello.slim +0 -1
- data/test/views/hello.str +0 -1
- data/test/views/hello.styl +0 -2
- data/test/views/hello.test +0 -1
- data/test/views/hello.textile +0 -1
- data/test/views/hello.wlang +0 -1
- data/test/views/hello.yajl +0 -1
- data/test/views/layout2.builder +0 -3
- data/test/views/layout2.erb +0 -2
- data/test/views/layout2.haml +0 -2
- data/test/views/layout2.liquid +0 -2
- data/test/views/layout2.mab +0 -2
- data/test/views/layout2.nokogiri +0 -3
- data/test/views/layout2.rabl +0 -3
- data/test/views/layout2.radius +0 -2
- data/test/views/layout2.slim +0 -3
- data/test/views/layout2.str +0 -2
- data/test/views/layout2.test +0 -1
- data/test/views/layout2.wlang +0 -2
- data/test/views/nested.str +0 -1
- data/test/views/utf8.erb +0 -2
- data/test/wlang_test.rb +0 -87
- 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
|
6
|
+
Umständen nicht auf dem aktuellen Stand (aktuell Sinatra 2.0
|
7
|
+
Vorabausgabe).*
|
5
8
|
|
6
9
|
Sinatra ist eine
|
7
|
-
[DSL](
|
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
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
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
|
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
|
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
|
223
|
-
# passt auf "GET /posts" sowie jegliche Erweiterung
|
224
|
-
# wie "GET /posts
|
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
|
-
```
|
249
|
+
```ruby
|
231
250
|
get '/posts' do
|
232
|
-
#
|
251
|
+
# passt zu "GET /posts?title=foo&author=bar"
|
233
252
|
title = params['title']
|
234
253
|
author = params['author']
|
235
|
-
#
|
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
|
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|
|
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
|
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{
|
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.
|
406
|
-
`./public/css/style.css` ist unter
|
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
|
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
|
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-
|
563
|
+
Wird einer Rendering-Methode ein String übergeben, wird dieser direkt
|
564
|
+
gerendert.
|
527
565
|
|
528
566
|
### Direkte Templates
|
529
567
|
|
530
|
-
```
|
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://
|
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://
|
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/
|
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.
|
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
|
947
|
-
Creole geschrieben werden. Es ist aber möglich, einen Renderer
|
948
|
-
zu verwenden und einen anderen für das Layout, indem
|
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
|
969
|
-
keine locals verwenden kann, wird man Mediawiki üblicherweise
|
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
|
-
```
|
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
|
-
```
|
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
|
985
|
-
in MediaWiki geschrieben werden. Es ist aber möglich,
|
986
|
-
Templates zu verwenden und einen anderen für das
|
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/
|
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
|
-
```
|
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
|
-
```
|
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
|
-
```
|
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
|
1134
|
-
Template kann entweder wie oben beschrieben über die `:template`
|
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
|
-
```
|
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
|
-
```
|
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
|
-
```
|
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
|
-
|
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
|
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
|
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
|
-
```
|
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
|
-
|
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
|
-
|
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
|
-
|
1356
|
-
|
1405
|
+
module BarUtils
|
1406
|
+
def bar(name) "#{name}bar" end
|
1357
1407
|
end
|
1408
|
+
|
1409
|
+
helpers FooUtils, BarUtils
|
1358
1410
|
```
|
1359
1411
|
|
1360
|
-
|
1361
|
-
|
1362
|
-
|
1363
|
-
|
1364
|
-
|
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
|
-
|
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
|
1379
|
-
|
1380
|
-
|
1381
|
-
|
1382
|
-
|
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
|
-
|
1499
|
+
require 'securerandom'
|
1500
|
+
# -or- require 'sysrandom/securerandom'
|
1501
|
+
set :session_secret, ENV.fetch('SESSION_SECRET') { SecureRandom.hex(64) }
|
1386
1502
|
```
|
1387
1503
|
|
1388
|
-
|
1389
|
-
|
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
|
1396
|
-
|
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
|
-
```
|
1399
|
-
set :sessions, :domain => '.foo
|
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
|
1487
|
-
Returnwert in der Route zu setzen. In manchen Situationen kann es
|
1488
|
-
dass der Body an anderer Stelle während der Ausführung gesetzt
|
1489
|
-
Dafür kann man die Helfer-Methode `body` einsetzen. Ist sie
|
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](
|
1543
|
-
[WebSockets](
|
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
|
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
|
1556
|
-
`close` nicht aufgerufen und es ist einem überlassen dies an einem
|
1557
|
-
späteren Zeitpunkt nachholen. Die Funktion ist jedoch nur bei
|
1558
|
-
Serven wie Thin oder Rainbows möglich, andere Server werden
|
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
|
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
|
1605
|
-
In den Routen und Filtern muss man sich also nicht weiter darum
|
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
|
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
|
1622
|
-
eigener Logger eingerichtet werden soll. Sinatra wird dann verwenden, was
|
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
|
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
|
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
|
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
|
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](
|
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
|
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
|
1787
|
-
ein If-
|
1788
|
-
Resource bereits existiert. Sinatra geht davon aus, dass Ressourcen bei
|
1789
|
-
Anfragen (z.B. bei get oder Idempotenten Anfragen wie put) bereits
|
1790
|
-
wobei anderen Ressourcen (besipielsweise bei post), als neue
|
1791
|
-
behandelt werden. Dieses Verhalten lässt sich mit der
|
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
|
-
|
1990
|
+
<dd>Dateiname als Response.
|
1991
|
+
Standardwert ist der eigentliche Dateiname.</dd>
|
1829
1992
|
|
1830
1993
|
<dt>last_modified</dt>
|
1831
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
1934
|
-
Time-Objekt generiert. Ebenso kann sie nach `DateTime`, `Date` und
|
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,
|
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
|
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
|
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
|
1979
|
-
nützlich werden, um eigene Nachschlage-Mechanismen einzubauen. Zum
|
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
|
2011
|
-
Es wird lediglich der angegebene Block aufgerufen und nach allen
|
2012
|
-
Pfaden gesucht. Das ergibt kein Performance-Problem, da `render`
|
2013
|
-
verwendet, sobald eine Datei gefunden wurde. Ebenso werden
|
2014
|
-
Inhalt gecached, solange nicht im Entwicklungsmodus
|
2015
|
-
im Hinterkopf behalten werden, wenn irgendwelche
|
2016
|
-
|
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 (
|
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/
|
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
|
-
|
2104
|
-
|
2105
|
-
|
2106
|
-
|
2107
|
-
|
2108
|
-
|
2109
|
-
|
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
|
-
|
2113
|
-
|
2114
|
-
|
2115
|
-
|
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
|
-
|
2119
|
-
|
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
|
-
|
2123
|
-
|
2124
|
-
|
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
|
-
|
2128
|
-
|
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
|
-
|
2321
|
+
<dd>Fehler im Log anzeigen.</dd>
|
2132
2322
|
|
2133
2323
|
<dt>environment</dt>
|
2134
|
-
|
2135
|
-
|
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
|
-
|
2330
|
+
<dd>Den Logger verwenden.</dd>
|
2139
2331
|
|
2140
2332
|
<dt>lock</dt>
|
2141
|
-
|
2142
|
-
|
2143
|
-
|
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
|
-
|
2147
|
-
|
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
|
-
|
2355
|
+
<dd>Port für die Applikation. Wird nur im internen Server verwendet.</dd>
|
2151
2356
|
|
2152
2357
|
<dt>prefixed_redirects</dt>
|
2153
|
-
|
2154
|
-
|
2155
|
-
|
2156
|
-
|
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
|
-
|
2160
|
-
|
2161
|
-
|
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
|
-
|
2165
|
-
|
2166
|
-
|
2167
|
-
|
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
|
-
|
2389
|
+
<dd>Alias für <tt>public_folder</tt>, s.o.</dd>
|
2171
2390
|
|
2172
2391
|
<dt>reload_templates</dt>
|
2173
|
-
|
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
|
-
|
2177
|
-
|
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
|
-
|
2181
|
-
|
2182
|
-
|
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
|
-
|
2186
|
-
|
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
|
-
|
2417
|
+
<dd>Läuft der eingebaute Server? Diese Einstellung nicht ändern!</dd>
|
2190
2418
|
|
2191
2419
|
<dt>server</dt>
|
2192
|
-
|
2193
|
-
|
2194
|
-
|
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
|
-
|
2198
|
-
|
2199
|
-
|
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
|
-
|
2203
|
-
|
2204
|
-
|
2205
|
-
|
2206
|
-
|
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
|
-
|
2210
|
-
|
2211
|
-
|
2212
|
-
|
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
|
-
|
2216
|
-
|
2217
|
-
|
2218
|
-
|
2219
|
-
|
2220
|
-
|
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
|
-
|
2224
|
-
|
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
|
-
|
2479
|
+
<dd>Legt fest, wie Sinatra mit System-Signalen umgehen soll.</dd>
|
2228
2480
|
|
2229
2481
|
<dt>views</dt>
|
2230
|
-
|
2231
|
-
|
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
|
-
|
2235
|
-
|
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 `
|
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
|
2248
|
-
|
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
|
2507
|
+
APP_ENV=production ruby my_app.rb
|
2252
2508
|
```
|
2253
2509
|
|
2254
|
-
In der Anwendung kann man die die Methoden
|
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
|
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
|
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
|
2385
|
-
werden.
|
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
|
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
|
2418
|
-
dem Namen der Applikations-Klasse
|
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
|
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://
|
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
|
-
```
|
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>
|
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/
|
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
|
-
|
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
|
-
*
|
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
|
-
-
|
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
|
2830
|
-
<dd>
|
2831
|
-
|
2832
|
-
|
2833
|
-
|
2834
|
-
|
2835
|
-
<
|
2836
|
-
|
2837
|
-
|
2838
|
-
|
2839
|
-
<
|
2840
|
-
|
2841
|
-
|
2842
|
-
|
2843
|
-
|
2844
|
-
|
2845
|
-
|
2846
|
-
|
2847
|
-
|
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
|
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,
|
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 <=
|
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://
|
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
|
-
*
|
2980
|
-
|
2981
|
-
*
|
2982
|
-
|
2983
|
-
*
|
2984
|
-
*
|
2985
|
-
*
|
2986
|
-
*
|
2987
|
-
|
2988
|
-
|
2989
|
-
*
|
2990
|
-
|
2991
|
-
*
|
2992
|
-
|
2993
|
-
|
2994
|
-
*
|
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)
|