README.de.md in sinatra-1.4.6 vs README.de.md in sinatra-1.4.7
- old
+ new
@@ -2,11 +2,11 @@
*Wichtig: Dieses Dokument ist eine Übersetzung aus dem Englischen und unter
Umständen nicht auf dem aktuellen Stand (aktuell Sinatra 1.4.5).*
Sinatra ist eine
-[DSL](http://de.wikipedia.org/wiki/Domänenspezifische_Sprache), die das
+[DSL](https://de.wikipedia.org/wiki/Domänenspezifische_Sprache), die das
schnelle Erstellen von Webanwendungen in Ruby mit minimalem Aufwand
ermöglicht:
Sinatra via `rubygems` installieren:
@@ -109,10 +109,11 @@
* [Geltungsbereich und Bindung](#geltungsbereich-und-bindung)
* [Anwendungs- oder Klassen-Scope](#anwendungs--oder-klassen-scope)
* [Anfrage- oder Instanz-Scope](#anfrage--oder-instanz-scope)
* [Delegation-Scope](#delegation-scope)
* [Kommandozeile](#kommandozeile)
+ * [Multi-Threading](#multi-threading)
* [Systemanforderungen](#systemanforderungen)
* [Der neuste Stand (The Bleeding Edge)](#der-neuste-stand-the-bleeding-edge)
* [Mit Bundler](#mit-bundler)
* [Eigenes Repository](#eigenes-repository)
* [Gem erstellen](#gem-erstellen)
@@ -217,19 +218,19 @@
```
Routen-Muster können auch mit optionalen Parametern ausgestattet werden:
```ruby
-get '/posts.?:format?' do
- # passt auf "GET /posts" sowie jegliche Erweiterung
- # wie "GET /posts.json", "GET /posts.xml" etc.
+get '/posts/:format?' do
+ # passt auf "GET /posts/" sowie jegliche Erweiterung
+ # wie "GET /posts/json", "GET /posts/xml" etc.
end
```
Routen können auch den query-Parameter verwenden:
-``` ruby
+```ruby
get '/posts' do
# matches "GET /posts?title=foo&author=bar"
title = params['title']
author = params['author']
# uses title and author variables; query is optional to the /posts route
@@ -525,11 +526,11 @@
Rendering-Methoden rendern jeden String direkt.
### Direkte Templates
-``` ruby
+```ruby
get '/' do
haml '%div.title Hallo Welt'
end
```
@@ -605,11 +606,11 @@
#### Nokogiri Templates
<table>
<tr>
<td>Abhängigkeit</td>
- <td><a href="http://nokogiri.org/">nokogiri</a></td>
+ <td><a href="http://www.nokogiri.org/">nokogiri</a></td>
</tr>
<tr>
<td>Dateierweiterung</td>
<td><tt>.nokogiri</tt></td>
</tr>
@@ -660,11 +661,11 @@
#### Less Templates
<table>
<tr>
<td>Abhängigkeit</td>
- <td><a href="http://www.lesscss.org/">less</a></td>
+ <td><a href="http://lesscss.org/">less</a></td>
</tr>
<tr>
<td>Dateierweiterung</td>
<td><tt>.less</tt></td>
</tr>
@@ -678,11 +679,11 @@
#### Liquid Templates
<table>
<tr>
<td>Abhängigkeit</td>
- <td><a href="http://www.liquidmarkup.org/">liquid</a></td>
+ <td><a href="http://liquidmarkup.org/">liquid</a></td>
</tr>
<tr>
<td>Dateierweiterung</td>
<td><tt>.liquid</tt></td>
</tr>
@@ -700,11 +701,11 @@
<table>
<tr>
<td>Abhängigkeit</td>
<td>Eine der folgenden Bibliotheken:
- <a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
+ <a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
<a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
<a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
<a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a> oder
<a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
</td>
@@ -860,11 +861,11 @@
#### Markaby Templates
<table>
<tr>
<td>Abhängigkeit</td>
- <td><a href="http://markaby.github.com/">markaby</a></td>
+ <td><a href="http://markaby.github.io/">markaby</a></td>
</tr>
<tr>
<td>Dateierweiterung</td>
<td><tt>.mab</tt></td>
</tr>
@@ -967,18 +968,18 @@
Da man aus dem Mediawiki-Template heraus keine Ruby-Methoden aufrufen und auch
keine locals verwenden kann, wird man Mediawiki üblicherweise in Kombination mit
anderen Renderern verwenden wollen:
-``` ruby
+```ruby
erb :overview, :locals => { :text => mediawiki(:introduction) }
```
Beachte: Man kann die `mediawiki`-Methode auch aus anderen Templates
heraus aufrufen:
-``` ruby
+```ruby
%h1 Grüße von Haml!
%p= mediawiki(:greetings)
```
Da man Ruby nicht von MediaWiki heraus aufrufen kann, können auch Layouts nicht
@@ -1008,11 +1009,11 @@
<table>
<tr>
<td>Abhängigkeit</td>
<td>
- <a href="https://github.com/lucasmazza/ruby-stylus" title="Ruby Stylus">
+ <a href="https://github.com/forgecrafted/ruby-stylus" title="Ruby Stylus">
Stylus
</a> und eine Möglichkeit
<a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
JavaScript auszuführen
</a>.
@@ -1029,11 +1030,11 @@
</table>
Um Stylus-Templates ausführen zu können, müssen `stylus` und `stylus/tilt`
zuerst geladen werden:
-``` ruby
+```ruby
require 'sinatra'
require 'stylus'
require 'stylus/tilt'
get '/' do
@@ -1066,19 +1067,19 @@
</table>
Die Template-Quelle wird als Ruby-String evaluiert. Die daraus resultierende
json Variable wird mit Hilfe von `#to_json` umgewandelt:
-``` ruby
+```ruby
json = { :foo => 'bar' }
json[:baz] = key
```
Die `:callback` und `:variable` Optionen können mit dem gerenderten Objekt
verwendet werden:
-``` javascript
+```javascript
var resource = {"foo":"bar","baz":"qux"};
present(resource);
```
#### WLang Templates
@@ -1132,32 +1133,32 @@
Ein Layout ist üblicherweise ein Template, das ein `yield` aufruft. Ein solches
Template kann entweder wie oben beschrieben über die `:template` Option
verwendet werden oder mit einem Block gerendert werden:
-``` ruby
+```ruby
erb :post, :layout => false do
erb :index
end
```
Dieser Code entspricht weitestgehend `erb :index, :layout => :post`.
Blöcke an Render-Methoden weiterzugeben ist besonders bei verschachtelten
Layouts hilfreich:
-``` ruby
+```ruby
erb :main_layout, :layout => false do
erb :admin_layout do
erb :user
end
end
```
Der gleiche Effekt kann auch mit weniger Code erreicht werden:
-``` ruby
+```ruby
erb :admin_layout, :layout => :main_layout do
erb :user
end
```
@@ -1255,11 +1256,11 @@
### Eigene Methoden zum Aufsuchen von Templates verwenden
Um einen eigenen Mechanismus zum Aufsuchen von Templates zu
implementieren, muss `#find_template` definiert werden:
-``` ruby
+```ruby
configure do
set :views [ './views/a', './views/b' ]
end
def find_template(views, name, engine, &block)
@@ -1393,11 +1394,11 @@
```
Um eine Session mit anderen Apps und zwischen verschiedenen Subdomains
von foo.com zu teilen, wird ein *.* der Domain vorangestellt:
-``` ruby
+```ruby
set :sessions, :domain => '.foo,com'
```
### Anhalten
@@ -1537,18 +1538,18 @@
end
end
```
Damit lassen sich Streaming-APIs realisieren, sog.
-[Server Sent Events](http://dev.w3.org/html5/eventsource/), die als Basis für
-[WebSockets](http://en.wikipedia.org/wiki/WebSocket) dienen. Ebenso können sie
+[Server Sent Events](https://w3c.github.io/eventsource/), die als Basis für
+[WebSockets](https://en.wikipedia.org/wiki/WebSocket) dienen. Ebenso können sie
verwendet werden, um den Durchsatz zu erhöhen, wenn ein Teil der Daten von
langsamen Ressourcen abhängig ist.
Es ist zu beachten, dass das Verhalten beim Streaming, insbesondere die Anzahl
nebenläufiger Anfragen, stark davon abhängt, welcher Webserver für die
-Applikation verwendet wird. Einige Server, z.B. WEBRick, unterstützen
+Applikation verwendet wird. Einige Server unterstützen
Streaming nicht oder nur teilweise. Sollte der Server Streaming nicht
unterstützen, wird ein vollständiger Response-Body zurückgeschickt, sobald der
an `stream` weitergegebene Block abgearbeitet ist. Mit Shotgun funktioniert
Streaming z.B. überhaupt nicht.
@@ -1669,11 +1670,11 @@
Weitere Parameter werden wie Argumente der `halt`-Methode behandelt:
```ruby
redirect to('/bar'), 303
-redirect 'http://google.com', 'Hier bist du falsch'
+redirect 'http://www.google.com/', 'Hier bist du falsch'
```
Ebenso leicht lässt sich ein Schritt zurück mit dem Alias `redirect back`
erreichen:
@@ -1754,11 +1755,11 @@
erb :article
end
```
ebenso ist es möglich einen
-[schwachen ETag](http://de.wikipedia.org/wiki/HTTP_ETag) zu verwenden:
+[schwachen ETag](https://de.wikipedia.org/wiki/HTTP_ETag) zu verwenden:
```ruby
etag @article.sha1, :weak
```
@@ -2070,11 +2071,11 @@
```
#### Einstellung des Angriffsschutzes
Sinatra verwendet
-[Rack::Protection](https://github.com/rkh/rack-protection#readme), um die
+[Rack::Protection](https://github.com/sinatra/rack-protection#readme), um die
Anwendung vor häufig vorkommenden Angriffen zu schützen. Diese Voreinstellung
lässt sich selbstverständlich deaktivieren, der damit verbundene
Geschwindigkeitszuwachs steht aber in keinem Verhätnis zu den möglichen
Risiken.
@@ -2357,11 +2358,11 @@
'Hallo Welt'
end
```
Die Semantik von `use` entspricht der gleichnamigen Methode der
-[Rack::Builder](http://rubydoc.info/github/rack/rack/master/Rack/Builder)-DSL
+[Rack::Builder](http://www.rubydoc.info/github/rack/rack/master/Rack/Builder)-DSL
(meist verwendet in Rackup-Dateien). Ein Beispiel dafür ist, dass die
`use`-Methode mehrere/verschiedene Argumente und auch Blöcke entgegennimmt:
```ruby
use Rack::Auth::Basic do |username, password|
@@ -2380,11 +2381,11 @@
oder im [Rack wiki](https://github.com/rack/rack/wiki/List-of-Middleware).
## Testen
Sinatra-Tests können mit jedem auf Rack aufbauendem Test-Framework geschrieben
-werden. [Rack::Test](http://rdoc.info/github/brynary/rack-test/master/frames)
+werden. [Rack::Test](http://www.rubydoc.info/github/brynary/rack-test/master/frames)
wird empfohlen:
```ruby
require 'my_sinatra_app'
require 'minitest/autorun'
@@ -2461,17 +2462,17 @@
* Alle Routen, Error-Handler, Filter und Optionen der Applikation müssen in
einer Subklasse von `Sinatra::Base` definiert werden.
`Sinatra::Base` ist ein unbeschriebenes Blatt. Die meisten Optionen sind per
Standard deaktiviert. Das betrifft auch den eingebauten Server. Siehe
-[Optionen und Konfiguration](http://sinatra.github.com/configuration.html) für
+[Optionen und Konfiguration](http://www.sinatrarb.com/configuration.html) für
Details über mögliche Optionen.
Damit eine App sich ähnlich wie eine klassische App verhält, kann man
auch eine Subclass von `Sinatra::Application` erstellen:
-``` ruby
+```ruby
require 'sinatra/base'
class MyApp < Sinatra::Application
get '/' do
'Hello world!'
@@ -2538,11 +2539,11 @@
</tr>
<tr>
<td>static</td>
<td>true</td>
- <td>false</td>
+ <td>File.exist?(public_folder)</td>
<td>true</td>
</tr>
</table>
### Eine modulare Applikation bereitstellen
@@ -2819,10 +2820,46 @@
-e # Umgebung setzen (Standard ist development)
-s # Rack-Server/Handler setzen (Standard ist thin)
-x # Mutex-Lock einschalten (Standard ist off)
```
+### Multi-threading
+
+_Paraphrasiert von [dieser Antwort auf StackOverflow][so-answer] von Konstantin_
+
+Sinatra erlegt kein Nebenläufigkeitsmodell auf, sondern überlässt dies dem
+selbst gewählten Rack-Proxy (Server), so wie Thin, Puma oder WEBrick.
+Sinatra selbst ist Thread-sicher, somit ist es kein Problem wenn der
+Rack-Proxy ein anderes Threading-Modell für Nebenläufigkeit benutzt.
+Das heißt, dass wenn der Server gestartet wird, dass man die korrekte
+Aufrufsmethode benutzen sollte für den jeweiligen Rack-Proxy.
+Das folgende Beispiel ist eine Veranschaulichung eines mehrprozessigen
+Thin Servers:
+
+``` ruby
+# app.rb
+
+require 'sinatra/base'
+
+class App < Sinatra::Base
+ get '/' do
+ "Hello, World"
+ end
+end
+
+App.run!
+
+```
+
+Um den Server zu starten, führt man das folgende Kommando aus:
+
+``` shell
+thin --threaded start
+```
+
+[so-answer]: http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999)
+
## Systemanforderungen
Die folgenden Versionen werden offiziell unterstützt:
<dl>
@@ -2887,11 +2924,11 @@
```
### Mit Bundler
Wenn die Applikation mit der neuesten Version von Sinatra und
-[Bundler](http://gembundler.com/) genutzt werden soll, empfehlen wir den
+[Bundler](http://bundler.io) genutzt werden soll, empfehlen wir den
nachfolgenden Weg.
Soweit Bundler noch nicht installiert ist:
```shell
@@ -2974,21 +3011,21 @@
Sinatra folgt dem sogenannten [Semantic Versioning](http://semver.org/), d.h.
SemVer und SemVerTag.
## Mehr
-* [Projekt-Website](http://sinatra.github.com/) - Ergänzende Dokumentation,
+* [Projekt-Website](http://www.sinatrarb.com/) - Ergänzende Dokumentation,
News und Links zu anderen Ressourcen.
-* [Mitmachen](http://sinatra.github.com/contributing.html) - Einen Fehler
+* [Mitmachen](http://www.sinatrarb.com/contributing.html) - Einen Fehler
gefunden? Brauchst du Hilfe? Hast du einen Patch?
-* [Issue-Tracker](http://github.com/sinatra/sinatra/issues)
-* [Twitter](http://twitter.com/sinatra)
+* [Issue-Tracker](https://github.com/sinatra/sinatra/issues)
+* [Twitter](https://twitter.com/sinatra)
* [Mailing-Liste](http://groups.google.com/group/sinatrarb)
* [#sinatra](irc://chat.freenode.net/#sinatra) auf http://freenode.net Es
gibt dort auch immer wieder deutschsprachige Entwickler, die gerne weiterhelfen.
* [Sinatra Book](https://github.com/sinatra/sinatra-book/) Kochbuch Tutorial
* [Sinatra Recipes](http://recipes.sinatrarb.com/) Sinatra-Rezepte aus der
Community
* API Dokumentation für die [aktuelle
- Version](http://rubydoc.info/gems/sinatra) oder für
- [HEAD](http://rubydoc.info/github/sinatra/sinatra) auf http://rubydoc.info
-* [CI Server](http://travis-ci.org/sinatra/sinatra)
+ Version](http://www.rubydoc.info//gems/sinatra) oder für
+ [HEAD](http://www.rubydoc.info/github/sinatra/sinatra) auf http://rubydoc.info
+* [CI Server](https://travis-ci.org/sinatra/sinatra)