Remove trailing whitespaces 👮 [ci skip]
This commit is contained in:
parent
9c9dde7888
commit
33b0da7ca5
2
CHANGES
2
CHANGES
|
@ -118,7 +118,7 @@
|
|||
* Add `x_cascade` option to disable `X-Cascade` header on missing route.
|
||||
(Konstantin Haase)
|
||||
|
||||
* Improve documentation. (Kashyap, Stanislav Chistenko, Zachary Scott,
|
||||
* Improve documentation. (Kashyap, Stanislav Chistenko, Zachary Scott,
|
||||
Anthony Accomazzo, Peter Suschlik, Rachel Mehl, ymmtmsys, Anurag Priyam,
|
||||
burningTyger, Tony Miller, akicho8, Vasily Polovnyov, Markus Prinz,
|
||||
Alexey Muranov, Erik Johnson, Vipul A M, Konstantin Haase)
|
||||
|
|
50
README.de.md
50
README.de.md
|
@ -456,38 +456,38 @@ Einstellungen:
|
|||
Praktisch für Partials:
|
||||
|
||||
<tt>erb "<%= foo %>", :locals => {:foo => "bar"}</tt></dd>
|
||||
|
||||
|
||||
<dt>default_encoding</dt>
|
||||
<dd>Gibt die Stringkodierung an, die verwendet werden soll. Voreingestellt
|
||||
auf <tt>settings.default_encoding</tt>.</dd>
|
||||
|
||||
|
||||
<dt>views</dt>
|
||||
<dd>Ordner, aus dem die Templates geladen werden. Voreingestellt auf
|
||||
<tt>settings.views</tt>.</dd>
|
||||
|
||||
|
||||
<dt>layout</dt>
|
||||
<dd>Legt fest, ob ein Layouttemplate verwendet werden soll oder nicht
|
||||
(<tt>true</tt> oder<tt>false</tt>). Ist es ein Symbol, dann legt es fest,
|
||||
welches Template als Layout verwendet wird:
|
||||
|
||||
<tt>erb :index, :layout => !request.xhr?</tt></dd>
|
||||
|
||||
|
||||
<dt>content_type</dt>
|
||||
<dd>Content-Typ den das Template ausgibt. Voreinstellung hängt von der
|
||||
Templatesprache ab.</dd>
|
||||
|
||||
|
||||
<dt>scope</dt>
|
||||
<dd>Scope, in dem das Template gerendert wird. Liegt standardmäßig innerhalb
|
||||
der App-Instanz. Wird Scope geändert, sind Instanzvariablen und
|
||||
Helfermethoden nicht verfügbar.</dd>
|
||||
|
||||
|
||||
<dt>layout_engine</dt>
|
||||
<dd>Legt fest, welcher Renderer für das Layout verantwortlich ist. Hilfreich
|
||||
für Sprachen, die sonst keine Templates unterstützen. Voreingestellt auf
|
||||
den Renderer, der für das Template verwendet wird:
|
||||
|
||||
<tt>set :rdoc, :layout_engine => :erb</tt></dd>
|
||||
|
||||
|
||||
<dt>layout_options</dt>
|
||||
<dd>Besondere Einstellungen, die nur für das Rendering verwendet werden:
|
||||
|
||||
|
@ -554,7 +554,7 @@ get('/') { markdown :index }
|
|||
<table>
|
||||
<tr>
|
||||
<td>Abhängigkeit</td>
|
||||
<td><a href="http://www.kuwata-lab.com/erubis/">erubis</a> oder erb
|
||||
<td><a href="http://www.kuwata-lab.com/erubis/">erubis</a> oder erb
|
||||
(Standardbibliothek von Ruby)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
@ -686,7 +686,7 @@ denen man Variablen weitergibt.
|
|||
<table>
|
||||
<tr>
|
||||
<td>Abhängigkeit</td>
|
||||
<td>Eine der folgenden Bibliotheken:
|
||||
<td>Eine der folgenden Bibliotheken:
|
||||
<a href="https://github.com/rtomayko/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>,
|
||||
|
@ -917,7 +917,7 @@ verwendet wird.
|
|||
<table>
|
||||
<tr>
|
||||
<td>Abhängigkeit</td>
|
||||
<td><a href="https://github.com/josh/ruby-coffee-script">coffee-script</a>
|
||||
<td><a href="https://github.com/josh/ruby-coffee-script">coffee-script</a>
|
||||
und eine <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme">Möglichkeit JavaScript auszuführen</a>.
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -938,7 +938,7 @@ verwendet wird.
|
|||
<td>
|
||||
<a href="https://github.com/lucasmazza/ruby-stylus" title="Ruby Stylus">
|
||||
Stylus
|
||||
</a> und eine Möglichkeit
|
||||
</a> und eine Möglichkeit
|
||||
<a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
|
||||
JavaScript auszuführen
|
||||
</a>.
|
||||
|
@ -1439,7 +1439,7 @@ get '/' do
|
|||
end
|
||||
```
|
||||
|
||||
Damit lassen sich Streaming-APIs realisieren, sog.
|
||||
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
|
||||
verwendet werden, um den Durchsatz zu erhöhen, wenn ein Teil der Daten von
|
||||
|
@ -1469,7 +1469,7 @@ get '/subscribe' do
|
|||
# Client-Registrierung beim Server, damit Events mitgeteilt werden können
|
||||
stream(:keep_open) { |out| connections << out }
|
||||
|
||||
# tote Verbindungen entfernen
|
||||
# tote Verbindungen entfernen
|
||||
connections.reject!(&:closed?)
|
||||
|
||||
# Rückmeldung
|
||||
|
@ -1503,7 +1503,7 @@ get '/' do
|
|||
end
|
||||
```
|
||||
|
||||
Der Logger übernimmt dabei automatisch alle im Rack-Handler eingestellten
|
||||
Der Logger übernimmt dabei automatisch alle im Rack-Handler eingestellten
|
||||
Log-Vorgaben. Ist Loggen ausgeschaltet, gibt die Methode ein Leerobjekt zurück.
|
||||
In den Routen und Filtern muss man sich also nicht weiter darum kümmern.
|
||||
|
||||
|
@ -1522,7 +1522,7 @@ end
|
|||
Damit auch keine Middleware das Logging aktivieren kann, muss die `logging`
|
||||
Einstellung auf `nil` gesetzt werden. Das heißt aber auch, dass `logger` in
|
||||
diesem Fall `nil` zurückgeben wird. Üblicherweise wird das eingesetzt, wenn ein
|
||||
eigener Logger eingerichtet werden soll. Sinatra wird dann verwenden, was in
|
||||
eigener Logger eingerichtet werden soll. Sinatra wird dann verwenden, was in
|
||||
`env['rack.logger']` eingetragen ist.
|
||||
|
||||
### Mime-Types
|
||||
|
@ -1658,7 +1658,7 @@ get '/article/:id' do
|
|||
end
|
||||
```
|
||||
|
||||
ebenso ist es möglich einen
|
||||
ebenso ist es möglich einen
|
||||
[schwachen ETag](http://de.wikipedia.org/wiki/HTTP_ETag) zu verwenden:
|
||||
|
||||
```ruby
|
||||
|
@ -1732,15 +1732,15 @@ send_file 'foo.png', :type => :jpg
|
|||
<dt>last_modified</dt>
|
||||
<dd>Wert für den Last-Modified-Header, Standardwert ist <tt>mtime</tt> der
|
||||
Datei.</dd>
|
||||
|
||||
|
||||
<dt>type</dt>
|
||||
<dd>Content-Type, der verwendet werden soll. Wird, wenn nicht angegeben, von
|
||||
der Dateiendung abgeleitet.</dd>
|
||||
|
||||
|
||||
<dt>disposition</dt>
|
||||
<dd>Verwendet für Content-Disposition. Mögliche Werte sind: <tt>nil</tt>
|
||||
(Standard), <tt>:attachment</tt> und <tt>:inline</tt>.</dd>
|
||||
|
||||
|
||||
<dt>length</dt>
|
||||
<dd>Content-Length-Header. Standardwert ist die Dateigröße.</dd>
|
||||
</dl>
|
||||
|
@ -1845,7 +1845,7 @@ end
|
|||
|
||||
Diese Methode wird intern für +expires, `last_modiefied` und ihresgleichen
|
||||
verwendet. Mit ein paar Handgriffen lässt sich diese Methode also in ihrem
|
||||
Verhalten erweitern, indem man `time_for` in der eigenen Applikation
|
||||
Verhalten erweitern, indem man `time_for` in der eigenen Applikation
|
||||
überschreibt:
|
||||
|
||||
```ruby
|
||||
|
@ -1911,7 +1911,7 @@ werden!
|
|||
|
||||
Beachte, dass `find_template` nicht prüft, ob eine Datei tatsächlich existiert.
|
||||
Es wird lediglich der angegebene Block aufgerufen und nach allen möglichen
|
||||
Pfaden gesucht. Das ergibt kein Performance-Problem, da `render` `block`
|
||||
Pfaden gesucht. Das ergibt kein Performance-Problem, da `render` `block`
|
||||
verwendet, sobald eine Datei gefunden wurde. Ebenso werden Template-Pfade samt
|
||||
Inhalt gecached, solange nicht im Entwicklungsmodus gearbeitet wird. Das sollte
|
||||
im Hinterkopf behalten werden, wenn irgendwelche verrückten Methoden
|
||||
|
@ -2092,7 +2092,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|||
|
||||
<dt>server</dt>
|
||||
<dd>Server oder Liste von Servern, die als eingebaute Server zur Verfügung
|
||||
stehen. Die Reihenfolge gibt die Priorität vor, die Voreinstellung hängt von
|
||||
stehen. Die Reihenfolge gibt die Priorität vor, die Voreinstellung hängt von
|
||||
der verwendenten Ruby Implementierung ab.</dd>
|
||||
|
||||
<dt>sessions</dt>
|
||||
|
@ -2124,7 +2124,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|||
<dt>threaded</dt>
|
||||
<dd>Wird es auf <tt>true</tt> gesetzt, wird Thin aufgefordert
|
||||
<tt>EventMachine.defer</tt> zur Verarbeitung des Requests einzusetzen.</dd>
|
||||
|
||||
|
||||
<dt>views</dt>
|
||||
<dd>Verzeichnis der Views. Leitet sich von der <tt>app_file</tt> Einstellung
|
||||
ab, wenn nicht gesetzt.</dd>
|
||||
|
@ -2722,7 +2722,7 @@ ungültig. Ruby 1.9.3 wird bis Sinatra 2.0 unterstützt werden.</dd>
|
|||
|
||||
<dt>JRuby</dt>
|
||||
<dd>Aktuelle JRuby Versionen werden offiziell unterstützt. Es wird empfohlen,
|
||||
keine C-Erweiterungen zu verwenden und als Server Trinidad zu verwenden
|
||||
keine C-Erweiterungen zu verwenden und als Server Trinidad zu verwenden
|
||||
(<tt>gem install trinidad</tt>).</dd>
|
||||
</dl>
|
||||
|
||||
|
@ -2854,7 +2854,7 @@ SemVer und SemVerTag.
|
|||
* [Issue-Tracker](http://github.com/sinatra/sinatra/issues)
|
||||
* [Twitter](http://twitter.com/sinatra)
|
||||
* [Mailing-Liste](http://groups.google.com/group/sinatrarb)
|
||||
* [#sinatra](irc://chat.freenode.net/#sinatra) auf http://freenode.net Es
|
||||
* [#sinatra](irc://chat.freenode.net/#sinatra) auf http://freenode.net Es
|
||||
gibt dort auch immer wieder deutschsprachige Entwickler, die gerne weiterhelfen.
|
||||
* [Sinatra Book](http://sinatra-book.gittr.com) Kochbuch Tutorial
|
||||
* [Sinatra Recipes](http://recipes.sinatrarb.com/) Sinatra-Rezepte aus der
|
||||
|
|
28
README.hu.md
28
README.hu.md
|
@ -70,7 +70,7 @@ is el tudod érni:
|
|||
end
|
||||
```
|
||||
|
||||
Az útvonalmintákban szerepelhetnek joker paraméterek is, melyeket a
|
||||
Az útvonalmintákban szerepelhetnek joker paraméterek is, melyeket a
|
||||
`params[:splat]` tömbön keresztül tudunk elérni.
|
||||
|
||||
```ruby
|
||||
|
@ -134,7 +134,7 @@ itt is lehetőség nyílik egyéb könyvtár használatára:
|
|||
set :views, File.dirname(__FILE__) + '/templates'
|
||||
|
||||
Nagyon fontos észben tartani, hogy a sablononkra mindig szimbólumokkal
|
||||
hivatkozunk, még akkor is, ha egyéb (ebben az esetben a
|
||||
hivatkozunk, még akkor is, ha egyéb (ebben az esetben a
|
||||
:'subdir/template') könyvtárban tároljuk őket. A renderelő
|
||||
metódusok minden, nekik közvetlenül átadott karakterláncot megjelenítenek.
|
||||
|
||||
|
@ -286,13 +286,13 @@ végére begépeljük őket:
|
|||
|
||||
Megjegyzés: azok a fájlon belüli sablonok, amelyek az alkalmazás fájl végére
|
||||
kerülnek és függnek a sinatra könyvtártól, automatikusan betöltődnek.
|
||||
Ha ugyanezt más alkalmazásfájlban is szeretnéd megtenni, hívd meg
|
||||
Ha ugyanezt más alkalmazásfájlban is szeretnéd megtenni, hívd meg
|
||||
a <tt>use_in_file_templates!</tt> metódust az adott fájlban.
|
||||
|
||||
### Kulcsszavas sablonok
|
||||
|
||||
Sablonokat végül a felsőszintű <tt>template</tt> metódussal is
|
||||
definiálhatunk:
|
||||
Sablonokat végül a felsőszintű <tt>template</tt> metódussal is
|
||||
definiálhatunk:
|
||||
|
||||
```ruby
|
||||
template :layout do
|
||||
|
@ -383,7 +383,7 @@ Vagy állítsd be a HTTP státuszt és a törzset is egyszerre ...
|
|||
|
||||
## Passzolás
|
||||
|
||||
Az útvonalak továbbadhatják a végrehajtást egy másik útvonalnak
|
||||
Az útvonalak továbbadhatják a végrehajtást egy másik útvonalnak
|
||||
a `pass` függvényhívással:
|
||||
|
||||
```ruby
|
||||
|
@ -432,7 +432,7 @@ Csak akkor fusson le, ha a környezet <tt>:production</tt> vagy <tt>:test</tt>:
|
|||
|
||||
A hibakezelők ugyanabban a kontextusban futnak le, mint az útvonalak és
|
||||
előszűrők, ezért számukra is elérhetőek mindazok a könyvtárak, amelyek
|
||||
az utóbbiak rendelkezésére is állnak; így például a `haml`,
|
||||
az utóbbiak rendelkezésére is állnak; így például a `haml`,
|
||||
az `erb`, a `halt` stb.
|
||||
|
||||
### Nem található
|
||||
|
@ -495,10 +495,10 @@ bevezetéséhez:
|
|||
## Rack Middleware
|
||||
|
||||
A Sinatra egy Ruby keretrendszerek számára kifejlesztett egyszerű és szabványos
|
||||
interfészre, a [Rack](http://rack.rubyforge.org/) -re épül. A Rack fejlesztői
|
||||
interfészre, a [Rack](http://rack.rubyforge.org/) -re épül. A Rack fejlesztői
|
||||
szempontból egyik legérdekesebb jellemzője, hogy támogatja az úgynevezett
|
||||
"middleware" elnevezésű komponenseket, amelyek beékelődnek a szerver és az
|
||||
alkalmazás közé, így képesek megfigyelni és/vagy módosítani a HTTP
|
||||
alkalmazás közé, így képesek megfigyelni és/vagy módosítani a HTTP
|
||||
kéréseket és válaszokat. Segítségükkel különféle, egységesen működő
|
||||
funkciókat építhetünk be rendszerünkbe.
|
||||
|
||||
|
@ -517,10 +517,10 @@ A Sinatra keretrendszerben gyerekjáték a Rack middleware-ek behúzása a
|
|||
end
|
||||
```
|
||||
|
||||
A `use` metódus szemantikája megegyezik a
|
||||
A `use` metódus szemantikája megegyezik a
|
||||
[Rack::Builder](http://rack.rubyforge.org/doc/classes/Rack/Builder.html) DSL-ben
|
||||
használt +use+ metóduséval (az említett DSL-t leginkább rackup állományokban
|
||||
használják). Hogy egy példát említsünk, a `use` metódus elfogad
|
||||
használják). Hogy egy példát említsünk, a `use` metódus elfogad
|
||||
változókat és blokkokat egyaránt, akár kombinálva is ezeket:
|
||||
|
||||
```ruby
|
||||
|
@ -530,7 +530,7 @@ változókat és blokkokat egyaránt, akár kombinálva is ezeket:
|
|||
```
|
||||
|
||||
A Rack terjesztéssel egy csomó alap middleware komponens is érkezik,
|
||||
amelyekkel a naplózás, URL útvonalak megadása, autentikáció és
|
||||
amelyekkel a naplózás, URL útvonalak megadása, autentikáció és
|
||||
munkamenet-kezelés könnyen megvalósítható. A Sinatra ezek közül elég
|
||||
sokat automatikusan felhasznál a beállításoktól függően, így ezek
|
||||
explicit betöltésével (+use+) nem kell bajlódnod.
|
||||
|
@ -619,7 +619,7 @@ alkalmazás átalakítható Sinatra::Base alapú komponensekké két lépésben:
|
|||
a Sinatra::Base osztály gyermekosztályaiban kell megadni.
|
||||
|
||||
A `Sinatra::Base` osztály igazából egy üres lap: a legtöbb funkció
|
||||
alapból ki van kapcsolva, beleértve a beépített szervert is. A
|
||||
alapból ki van kapcsolva, beleértve a beépített szervert is. A
|
||||
beállításokkal és az egyes kapcsolók hatásával az
|
||||
[Options and Configuration](http://sinatra.github.com/configuration.html) lap
|
||||
foglalkozik.
|
||||
|
@ -653,7 +653,7 @@ Az alábbi kapcsolókat ismeri fel a rendszer:
|
|||
|
||||
Ha a Sinatra legfrissebb, fejlesztői változatát szeretnéd használni,
|
||||
készíts egy helyi másolatot és indítsd az alkalmazásodat úgy,
|
||||
hogy a `sinatra/lib` könyvtár elérhető legyen a
|
||||
hogy a `sinatra/lib` könyvtár elérhető legyen a
|
||||
`LOAD_PATH`-on:
|
||||
|
||||
```
|
||||
|
|
120
README.ko.md
120
README.ko.md
|
@ -121,7 +121,7 @@ get '/posts.?:format?' do
|
|||
end
|
||||
```
|
||||
|
||||
한편, 경로 탐색 공격 방지(path traversal attack protection, 아래 참조)를 비활성화시키지 않았다면,
|
||||
한편, 경로 탐색 공격 방지(path traversal attack protection, 아래 참조)를 비활성화시키지 않았다면,
|
||||
요청 경로는 라우터와 매칭되기 이전에 수정될 수 있다.
|
||||
|
||||
### 조건(Conditions)
|
||||
|
@ -222,17 +222,17 @@ get('/') { Stream.new }
|
|||
```ruby
|
||||
class AllButPattern
|
||||
Match = Struct.new(:captures)
|
||||
|
||||
|
||||
def initialize(except)
|
||||
@except = except
|
||||
@captures = Match.new([])
|
||||
end
|
||||
|
||||
|
||||
def match(str)
|
||||
@captures unless @except === str
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def all_but(pattern)
|
||||
AllButPattern.new(pattern)
|
||||
end
|
||||
|
@ -341,7 +341,7 @@ render 메서드에서 전달된 옵션값들은 `set`을 통해 설정한 옵
|
|||
<dd>템플릿을 로드할 뷰 폴더. 기본값은 <tt>settings.views</tt>.</dd>
|
||||
|
||||
<dt>layout</dt>
|
||||
<dd>레이아웃을 사용할지 여부 (<tt>true</tt> 또는 <tt>false</tt>), 만약 이 값이 심볼일 경우,
|
||||
<dd>레이아웃을 사용할지 여부 (<tt>true</tt> 또는 <tt>false</tt>), 만약 이 값이 심볼일 경우,
|
||||
사용할 템플릿을 지정. 예제: <tt>erb :index, :layout => !request.xhr?</tt>
|
||||
</dd>
|
||||
|
||||
|
@ -367,7 +367,7 @@ set :views, settings.root + '/templates'
|
|||
```
|
||||
|
||||
꼭 알아야 할 중요한 점 한 가지는 템플릿은 언제나 심볼로 참조된다는 것이며,
|
||||
템플릿이 하위 디렉터리에 위치한 경우라도 마찬가지임(그럴 경우에는 `:'subdir/template'`을 사용).
|
||||
템플릿이 하위 디렉터리에 위치한 경우라도 마찬가지임(그럴 경우에는 `:'subdir/template'`을 사용).
|
||||
반드시 심볼이어야 하는 이유는, 만약 그렇게 하지 않으면 렌더링 메서드가 전달된 문자열을 직접 렌더하려 할 것이기 때문임.
|
||||
|
||||
### 가능한 템플릿 언어들(Available Template Languages)
|
||||
|
@ -545,7 +545,7 @@ Liquid 템플릿에서는 루비 메서드(`yield` 제외)를 호출할 수 없
|
|||
</tr>
|
||||
</table>
|
||||
|
||||
마크다운에서는 메서드 호출 뿐 아니라 locals 전달도 안됨.
|
||||
마크다운에서는 메서드 호출 뿐 아니라 locals 전달도 안됨.
|
||||
따라서 일반적으로는 다른 렌더링 엔진과 함께 사용하게 될 것임:
|
||||
|
||||
```ruby
|
||||
|
@ -801,7 +801,7 @@ end
|
|||
Templates are evaluated within the same context as route handlers. Instance
|
||||
variables set in route handlers are directly accessible by templates:
|
||||
템플릿은 라우터 핸들러와 같은 맥락(context)에서 평가된다.
|
||||
라우터 핸들러에서 설정한 인스턴스 변수들은 템플릿에서 접근 가능하다:
|
||||
라우터 핸들러에서 설정한 인스턴스 변수들은 템플릿에서 접근 가능하다:
|
||||
|
||||
```ruby
|
||||
get '/:id' do
|
||||
|
@ -810,7 +810,7 @@ get '/:id' do
|
|||
end
|
||||
```
|
||||
|
||||
또는, 명시적으로 로컬 변수의 해시를 지정:
|
||||
또는, 명시적으로 로컬 변수의 해시를 지정:
|
||||
|
||||
```ruby
|
||||
get '/:id' do
|
||||
|
@ -900,7 +900,7 @@ get '/' do
|
|||
end
|
||||
```
|
||||
|
||||
`./views/index.myat` 를 렌더함.
|
||||
`./views/index.myat` 를 렌더함.
|
||||
Tilt에 대한 더 자세한 내용은 https://github.com/rtomayko/tilt 참조.
|
||||
|
||||
## 필터(Filters)
|
||||
|
@ -989,7 +989,7 @@ helpers FooUtils, BarUtils
|
|||
|
||||
### 세션(Sessions) 사용하기
|
||||
|
||||
세션은 요청 동안에 상태를 유지하기 위해 사용한다.
|
||||
세션은 요청 동안에 상태를 유지하기 위해 사용한다.
|
||||
세션이 활성화되면, 사용자 세션 당 session 해시 하나씩을 갖게 된다:
|
||||
|
||||
```ruby
|
||||
|
@ -1007,7 +1007,7 @@ end
|
|||
`enable :sessions`은 실은 모든 데이터를 쿠키 속에 저장함에 유의하자.
|
||||
항상 이렇게 하고 싶지 않을 수도 있을 것이다(예를 들어, 많은 양의 데이터를 저장하게 되면 트래픽이 높아진다).
|
||||
이 때는 여러 가지 랙 세션 미들웨어(Rack session middleware)를 사용할 수 있을 것이다:
|
||||
이렇게 할 경우라면, `enable :sessions`을 호출하지 *말고*,
|
||||
이렇게 할 경우라면, `enable :sessions`을 호출하지 *말고*,
|
||||
대신 여러분이 선택한 미들웨어를 다른 모든 미들웨어들처럼 포함시키면 된다:
|
||||
|
||||
```ruby
|
||||
|
@ -1022,7 +1022,7 @@ get '/:value' do
|
|||
end
|
||||
```
|
||||
|
||||
보안을 위해서, 쿠키 속의 세션 데이터는 세션 시크릿(secret)으로 사인(sign)된다.
|
||||
보안을 위해서, 쿠키 속의 세션 데이터는 세션 시크릿(secret)으로 사인(sign)된다.
|
||||
Sinatra는 여러분을 위해 무작위 시크릿을 생성한다.
|
||||
그렇지만, 이 시크릿은 여러분 애플리케이션 시작 시마다 변경될 수 있기 때문에,
|
||||
여러분은 여러분 애플리케이션의 모든 인스턴스들이 공유할 시크릿을 직접 만들고 싶을 수도 있다:
|
||||
|
@ -1112,7 +1112,7 @@ end
|
|||
위 예제의 경우, `"bar"`를 헬퍼로 옮겨 `/foo`와 `/bar` 모두에서 사용하도록 함으로써
|
||||
테스팅을 쉽게 하고 성능을 높일 수 있을 것이다.
|
||||
|
||||
만약 그 요청이 사본이 아닌 바로 그 동일 인스턴스로 보내지도록 하고 싶다면,
|
||||
만약 그 요청이 사본이 아닌 바로 그 동일 인스턴스로 보내지도록 하고 싶다면,
|
||||
`call` 대신 `call!`을 사용하면 된다.
|
||||
|
||||
`call`에 대한 더 자세한 내용은 Rack 명세를 참고하면 된다.
|
||||
|
@ -1168,16 +1168,16 @@ out << "- dary!\n"
|
|||
end
|
||||
```
|
||||
|
||||
이렇게 하면 스트리밍 API나
|
||||
이렇게 하면 스트리밍 API나
|
||||
[서버 발송 이벤트Server Sent Events](http://dev.w3.org/html5/eventsource/)를 구현할 수 있게 해 주며,
|
||||
[WebSockets](http://en.wikipedia.org/wiki/WebSocket)을 위한 기반으로 사용될 수 있다.
|
||||
또한 이 방법은 일부 콘텐츠가 느린 자원에 의존하는 경우에
|
||||
또한 이 방법은 일부 콘텐츠가 느린 자원에 의존하는 경우에
|
||||
스로풋(throughtput)을 높이기 위해 사용될 수도 있다.
|
||||
|
||||
스트리밍 동작, 특히 동시 요청의 수는 애플리케이션을 서빙하는 웹서버에 크게 의존적이다.
|
||||
어떤 서버, 예컨대 WEBRick 같은 경우는 아예 스트리밍을 지원조차 하지 못할 것이다.
|
||||
만약 서버가 스트리밍을 지원하지 않는다면, 본문은 `stream` 으로 전달된 블록이 수행을 마친 후에 한꺼번에 반환될 것이다.
|
||||
스트리밍은 Shotgun에서는 작동하지 않는다.
|
||||
스트리밍은 Shotgun에서는 작동하지 않는다.
|
||||
|
||||
만약 선택적 매개변수 `keep_open`이 설정되어 있다면, 스트림 객체에서 `close`를 호출하지 않을 것이고,
|
||||
따라서 여러분은 나중에 실행 흐름 상의 어느 시점에서 스트림을 닫을 수 있다.
|
||||
|
@ -1203,7 +1203,7 @@ end
|
|||
### 로깅(Logging)
|
||||
|
||||
In the request scope, the `logger` helper exposes a `Logger` instance:
|
||||
요청 스코프(request scope) 내에서, `Logger`의 인스턴스인 `logger` 헬퍼를 사용할 수 있다:
|
||||
요청 스코프(request scope) 내에서, `Logger`의 인스턴스인 `logger` 헬퍼를 사용할 수 있다:
|
||||
|
||||
```ruby
|
||||
get '/' do
|
||||
|
@ -1318,7 +1318,7 @@ end
|
|||
|
||||
### 캐시 컨트롤(Cache Control)
|
||||
|
||||
헤더를 정확하게 설정하는 것은 적절한 HTTP 캐싱의 기본이다.
|
||||
헤더를 정확하게 설정하는 것은 적절한 HTTP 캐싱의 기본이다.
|
||||
|
||||
Cache-Control 헤더를 다음과 같이 간단하게 설정할 수 있다:
|
||||
|
||||
|
@ -1385,7 +1385,7 @@ end
|
|||
정적 파일에 `Cache-Control` 헤더 정보를 추가하려면 `:static_cache_control` 설정(아래 참조)을 사용하라:
|
||||
|
||||
RFC 2616에 따르면 If-Match 또는 If-None-Match 헤더가 `*`로 설정된 경우 요청한 리소스(resource)가 이미 존재하느냐 여부에 따라 다르게 취급해야 한다고 되어 있다.
|
||||
Sinatra는 (get 처럼) 안전하거나 (put 처럼) 멱등인 요청에 대한 리소스는 이미 존재한다고 가정하며,
|
||||
Sinatra는 (get 처럼) 안전하거나 (put 처럼) 멱등인 요청에 대한 리소스는 이미 존재한다고 가정하며,
|
||||
반면 다른 리소스(예를 들면 post 요청 같은)의 경우는 새 리소스로 취급한다.
|
||||
이런 설정은 `:new_resource` 옵션으로 전달하여 변경할 수 있다:
|
||||
|
||||
|
@ -1447,7 +1447,7 @@ Rack 핸들러가 지원할 경우, Ruby 프로세스로부터의 스트리밍
|
|||
|
||||
### 요청 객체에 접근하기(Accessing the Request Object)
|
||||
|
||||
인입되는 요청 객에는 요청 레벨(필터, 라우터, 오류 핸들러)에서 `request` 메서드를 통해 접근 가능하다:
|
||||
인입되는 요청 객에는 요청 레벨(필터, 라우터, 오류 핸들러)에서 `request` 메서드를 통해 접근 가능하다:
|
||||
|
||||
```ruby
|
||||
# http://example.com/example 상에서 실행 중인 앱
|
||||
|
@ -1504,7 +1504,7 @@ end
|
|||
|
||||
### 첨부(Attachments)
|
||||
|
||||
`attachment` 헬퍼를 사용하여 브라우저에게 응답이 브라우저에 표시되는 게 아니라
|
||||
`attachment` 헬퍼를 사용하여 브라우저에게 응답이 브라우저에 표시되는 게 아니라
|
||||
디스크에 저장되어야 함을 알릴 수 있다:
|
||||
|
||||
```ruby
|
||||
|
@ -1536,7 +1536,7 @@ end
|
|||
```
|
||||
|
||||
이 메서드는 내부적으로 `expires` 나 `last_modified` 같은 곳에서 사용된다.
|
||||
따라서 여러분은 애플리케이션에서 `time_for`를 오버라이딩하여
|
||||
따라서 여러분은 애플리케이션에서 `time_for`를 오버라이딩하여
|
||||
이들 메서드의 동작을 쉽게 확장할 수 있다:
|
||||
|
||||
```ruby
|
||||
|
@ -1613,16 +1613,16 @@ end
|
|||
configure do
|
||||
# 옵션 하나 설정
|
||||
set :option, 'value'
|
||||
|
||||
|
||||
# 여러 옵션 설정
|
||||
set :a => 1, :b => 2
|
||||
|
||||
|
||||
# `set :option, true`와 동일
|
||||
enable :option
|
||||
|
||||
|
||||
# `set :option, false`와 동일
|
||||
disable :option
|
||||
|
||||
|
||||
# 블록으로 동적인 설정을 할 수도 있음
|
||||
set(:css_dir) { File.join(views, 'css') }
|
||||
end
|
||||
|
@ -1660,8 +1660,8 @@ end
|
|||
|
||||
### 공격 방어 설정하기(Configuring attack protection)
|
||||
|
||||
Sinatra는 [Rack::Protection](https://github.com/rkh/rack-protection#readme)을 사용하여
|
||||
일반적인, 일어날 수 있는 공격에 대비한다.
|
||||
Sinatra는 [Rack::Protection](https://github.com/rkh/rack-protection#readme)을 사용하여
|
||||
일반적인, 일어날 수 있는 공격에 대비한다.
|
||||
이 부분은 간단하게 비활성시킬 수 있다(성능 향상 효과를 가져올 것이다):
|
||||
|
||||
```ruby
|
||||
|
@ -1762,7 +1762,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|||
개발 모드에서는 활성됨.</dd>
|
||||
|
||||
<dt>root</dt>
|
||||
<dd>프로젝트 루트 디렉터리 경로.
|
||||
<dd>프로젝트 루트 디렉터리 경로.
|
||||
설정이 없으면 <tt>app_file</tt> 설정으로부터 유추됨.</dd>
|
||||
|
||||
<dt>raise_errors</dt>
|
||||
|
@ -1832,7 +1832,7 @@ ruby my_app.rb -e [ENVIRONMENT]
|
|||
|
||||
## 예외 처리(Error Handling)
|
||||
|
||||
예외 핸들러는 라우터 및 사전 필터와 동일한 맥락에서 실행된다.
|
||||
예외 핸들러는 라우터 및 사전 필터와 동일한 맥락에서 실행된다.
|
||||
이 말인즉, 이들이 제공하는 모든 것들을 사용할 수 있다는 말이다. 예를 들면 `haml`,
|
||||
`erb`, `halt`, 등등.
|
||||
|
||||
|
@ -1900,7 +1900,7 @@ error 400..510 do
|
|||
end
|
||||
```
|
||||
|
||||
Sinatra는 개발 환경에서 동작할 경우에
|
||||
Sinatra는 개발 환경에서 동작할 경우에
|
||||
특별한 `not_found` 와 `error` 핸들러를 설치한다.
|
||||
|
||||
## Rack 미들웨어(Rack Middleware)
|
||||
|
@ -1940,7 +1940,7 @@ Rack은 로깅, 디버깅, URL 라우팅, 인증, 그리고 세센 핸들링을
|
|||
Sinatra는 설정에 기반하여 이들 컴포넌트들 중 많은 것들을 자동으로 사용하며,
|
||||
따라서 여러분은 일반적으로는 `use`를 명시적으로 사용할 필요가 없을 것이다.
|
||||
|
||||
유용한 미들웨어들은
|
||||
유용한 미들웨어들은
|
||||
[rack](https://github.com/rack/rack/tree/master/lib/rack),
|
||||
[rack-contrib](https://github.com/rack/rack-contrib#readme),
|
||||
[CodeRack](http://coderack.org/) 또는
|
||||
|
@ -1959,21 +1959,21 @@ require 'rack/test'
|
|||
|
||||
class MyAppTest < Test::Unit::TestCase
|
||||
include Rack::Test::Methods
|
||||
|
||||
|
||||
def app
|
||||
Sinatra::Application
|
||||
end
|
||||
|
||||
|
||||
def test_my_default
|
||||
get '/'
|
||||
assert_equal 'Hello World!', last_response.body
|
||||
end
|
||||
|
||||
|
||||
def test_with_params
|
||||
get '/meet', :name => 'Frank'
|
||||
assert_equal 'Hello Frank!', last_response.body
|
||||
end
|
||||
|
||||
|
||||
def test_with_rack_env
|
||||
get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
|
||||
assert_equal "You're using Songbird!", last_response.body
|
||||
|
@ -1986,7 +1986,7 @@ end
|
|||
톱레벨에서 앱을 정의하는 것은 마이크로 앱(micro-app) 수준에서는 잘 동작하지만,
|
||||
Rack 미들웨어나, Rails 메탈(metal) 또는 서버 컴포넌트를 갖는 간단한 라이브러리, 또는 더 나아가
|
||||
Sinatra 익스텐션(extension) 같은 재사용 가능한 컴포넌트들을 구축할 경우에는 심각한 약점을 가진다.
|
||||
톱레벨은 마이크로 앱 스타일의 설정을 가정한다(즉, 하나의 단일 애플리케이션 파일과
|
||||
톱레벨은 마이크로 앱 스타일의 설정을 가정한다(즉, 하나의 단일 애플리케이션 파일과
|
||||
`./public` 및 `./views` 디렉터리, 로깅, 예외 상세 페이지 등등).
|
||||
이게 바로 `Sinatra::Base`가 필요한 부분이다:
|
||||
|
||||
|
@ -1996,7 +1996,7 @@ require 'sinatra/base'
|
|||
class MyApp < Sinatra::Base
|
||||
set :sessions, true
|
||||
set :foo, 'bar'
|
||||
|
||||
|
||||
get '/' do
|
||||
'Hello world!'
|
||||
end
|
||||
|
@ -2068,7 +2068,7 @@ end
|
|||
|
||||
### 모듈 애플리케이션(Modular Application) 제공하기
|
||||
|
||||
모듈 앱을 시작하는 두 가지 일반적인 옵션이 있는데,
|
||||
모듈 앱을 시작하는 두 가지 일반적인 옵션이 있는데,
|
||||
공격적으로 `run!`으로 시작하거나:
|
||||
|
||||
```ruby
|
||||
|
@ -2139,7 +2139,7 @@ Good signs you probably want to use a `config.ru`:
|
|||
|
||||
Sinatra에서 다른 Rack 미들웨어를 사용할 수 있을 뿐 아니라,
|
||||
모든 Sinatra 애플리케이션은 순차로 어떠한 Rack 종착점 앞에 미들웨어로 추가될 수 있다.
|
||||
이 종착점은 다른 Sinatra 애플리케이션이 될 수도 있고,
|
||||
이 종착점은 다른 Sinatra 애플리케이션이 될 수도 있고,
|
||||
또는 Rack 기반의 어떠한 애플리케이션(Rails/Ramaze/Camping/...)이라도 가능하다:
|
||||
|
||||
```ruby
|
||||
|
@ -2147,9 +2147,9 @@ require 'sinatra/base'
|
|||
|
||||
class LoginScreen < Sinatra::Base
|
||||
enable :sessions
|
||||
|
||||
|
||||
get('/login') { haml :login }
|
||||
|
||||
|
||||
post('/login') do
|
||||
if params[:name] == 'admin' && params[:password] == 'admin'
|
||||
session['user_name'] = params[:name]
|
||||
|
@ -2162,13 +2162,13 @@ end
|
|||
class MyApp < Sinatra::Base
|
||||
# 미들웨어는 사전 필터보다 앞서 실행됨
|
||||
use LoginScreen
|
||||
|
||||
|
||||
before do
|
||||
unless session['user_name']
|
||||
halt "접근 거부됨, <a href='/login'>로그인</a> 하세요."
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
get('/') { "Hello #{session['user_name']}." }
|
||||
end
|
||||
```
|
||||
|
@ -2226,7 +2226,7 @@ run RailsProject::Application
|
|||
|
||||
모든 Sinatra 애플리케이션은 `Sinatra::Base`의 서브클래스에 대응된다.
|
||||
만약 톱레벨 DSL (`require 'sinatra'`)을 사용한다면,
|
||||
이 클래스는 `Sinatra::Application`이며, 그렇지 않을 경우라면 여러분이 명시적으로 생성한
|
||||
이 클래스는 `Sinatra::Application`이며, 그렇지 않을 경우라면 여러분이 명시적으로 생성한
|
||||
그 서브클래스가 된다. 클래스 레벨에서는 `get` 이나 `before` 같은 메서드들을 가지나,
|
||||
`request` 객체나 `session` 에는 접근할 수 없다. 왜냐면 모든 요청에 대해
|
||||
애플리케이션 클래스는 오직 하나이기 때문이다.
|
||||
|
@ -2261,7 +2261,7 @@ end
|
|||
### 요청/인스턴스 범위
|
||||
|
||||
매 요청마다, 애플리케이션 클래스의 새 인스턴스가 생성되고 모든 핸들러 블록은 그 범위 내에서 실행된다.
|
||||
이 범위 내에서 여러분은 `request` 와 `session` 객체에 접근하거나
|
||||
이 범위 내에서 여러분은 `request` 와 `session` 객체에 접근하거나
|
||||
`erb` 나 `haml` 같은 렌더링 메서드를 호출할 수 있다.
|
||||
요청 범위 내에서 애플리케이션 범위는 `settings` 헬퍼를 통해 접근 가능하다:
|
||||
|
||||
|
@ -2271,12 +2271,12 @@ class MyApp < Sinatra::Base
|
|||
get '/define_route/:name' do
|
||||
# '/define_route/:name'의 요청 범위
|
||||
@value = 42
|
||||
|
||||
|
||||
settings.get("/#{params[:name]}") do
|
||||
# "/#{params[:name]}"의 요청 범위
|
||||
@value # => nil (동일한 요청이 아님)
|
||||
end
|
||||
|
||||
|
||||
"라우터가 정의됨!"
|
||||
end
|
||||
end
|
||||
|
@ -2293,7 +2293,7 @@ end
|
|||
|
||||
위임 범위(delegation scope)는 메서드를 단순히 클래스 범위로 보낸다(forward).
|
||||
그렇지만, 100% 클래스 범위처럼 움직이진 않는데, 왜냐면 클래스 바인딩을 갖지 않기 때문이다.
|
||||
오직 명시적으로 위임(delegation) 표시된 메서드들만 사용 가능하며
|
||||
오직 명시적으로 위임(delegation) 표시된 메서드들만 사용 가능하며
|
||||
또한 클래스 범위와 변수/상태를 공유하지 않는다 (유의: `self`가 다르다).
|
||||
`Sinatra::Delegator.delegate :method_name`을 호출하여 메서드 위임을 명시적으로 추가할 수 있다.
|
||||
|
||||
|
@ -2302,7 +2302,7 @@ end
|
|||
* 톱레벨 바인딩, `require "sinatra"`를 한 경우
|
||||
* `Sinatra::Delegator` 믹스인으로 확장된 객체
|
||||
|
||||
직접 코드를 살펴보길 바란다:
|
||||
직접 코드를 살펴보길 바란다:
|
||||
[Sinatra::Delegator 믹스인](https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/base.rb#L1609-1633)
|
||||
코드는 [메인 객체를 확장한 것](https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/main.rb#L28-30)이다.
|
||||
|
||||
|
@ -2331,7 +2331,7 @@ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
|
|||
|
||||
<dl>
|
||||
<dt> Ruby 1.8.7 </dt>
|
||||
<dd>1.8.7은 완전하게 지원되지만, 꼭 그래야할 특별한 이유가 없다면,
|
||||
<dd>1.8.7은 완전하게 지원되지만, 꼭 그래야할 특별한 이유가 없다면,
|
||||
1.9.2로 업그레이드하거나 또는 JRuby나 Rubinius로 전환할 것을 권장한다.
|
||||
1.8.7에 대한 지원은 Sinatra 2.0과 Ruby 2.0 이전에는 중단되지 않을 것이다.
|
||||
또한 그때도, 우리는 계속 지원할 것이다.
|
||||
|
@ -2349,7 +2349,7 @@ Ruby 1.9.4/2.0 릴리스까지는 적어도 지원을 계속할 것이며,
|
|||
</dd>
|
||||
<dt> Ruby 1.9.3 </dt>
|
||||
<dd>1.9.3은 완전하게 지원된다. 그렇지만 프로덕션에서의 사용은
|
||||
보다 상위의 패치 레벨이 릴리스될 때까지 기다리길 권장한다(현재는 p0).
|
||||
보다 상위의 패치 레벨이 릴리스될 때까지 기다리길 권장한다(현재는 p0).
|
||||
이전 버전에서 1.9.3으로 전환할 경우 모든 세션이 무효화된다는 점을 유의하라.
|
||||
|
||||
</dd>
|
||||
|
@ -2369,7 +2369,7 @@ JRuby의 C 확장 지원은 아직 실험 단계이며, RDiscount, Redcarpet 및
|
|||
|
||||
또한 우리는 새로 나오는 루비 버전을 주시한다.
|
||||
|
||||
다음 루비 구현체들은 공식적으로 지원하지 않지만
|
||||
다음 루비 구현체들은 공식적으로 지원하지 않지만
|
||||
여전히 Sinatra를 실행할 수 있는 것으로 알려져 있다:
|
||||
|
||||
* JRuby와 Rubinius 예전 버전
|
||||
|
@ -2381,17 +2381,17 @@ JRuby의 C 확장 지원은 아직 실험 단계이며, RDiscount, Redcarpet 및
|
|||
지원되는 플랫폼에서는 그러지 않을 경우, 우리의 문제가 아니라 그쪽의 문제로 간주한다는 뜻이다.
|
||||
|
||||
또한 우리는 CI를 ruby-head (곧 나올 2.0.0) 과 1.9.4 브랜치에 맞춰 실행하지만,
|
||||
계속해서 변하고 있기 때문에 아무 것도 보장할 수는 없다.
|
||||
계속해서 변하고 있기 때문에 아무 것도 보장할 수는 없다.
|
||||
1.9.4p0와 2.0.0p0가 지원되길 기대한다.
|
||||
|
||||
Sinatra는 선택한 루비 구현체가 지원하는 어떠한 운영체제에서도 작동해야 한다.
|
||||
|
||||
현재 Cardinal, SmallRuby, BlueRuby 또는 1.8.7 이전의 루비 버전에서는
|
||||
현재 Cardinal, SmallRuby, BlueRuby 또는 1.8.7 이전의 루비 버전에서는
|
||||
Sinatra를 실행할 수 없을 것이다.
|
||||
|
||||
## 최신(The Bleeding Edge)
|
||||
|
||||
Sinatra의 가장 최근 코드를 사용하고자 한다면,
|
||||
Sinatra의 가장 최근 코드를 사용하고자 한다면,
|
||||
여러분 애플리케이션을 마스터 브랜치에 맞춰 실행하면 되지만, 덜 안정적일 것임에 분명하다.
|
||||
|
||||
또한 우리는 가끔 사전배포(prerelease) 젬을 푸시하기 때문에, 다음과 같이 할 수 있다
|
||||
|
@ -2404,7 +2404,7 @@ gem install sinatra --pre
|
|||
|
||||
### Bundler를 사용하여
|
||||
|
||||
여러분 애플리케이션을 최신 Sinatra로 실행하고자 한다면,
|
||||
여러분 애플리케이션을 최신 Sinatra로 실행하고자 한다면,
|
||||
[Bundler](http://gembundler.com/)를 사용할 것을 권장한다.
|
||||
|
||||
우선, 아직 설치하지 않았다면 bundler를 설치한다:
|
||||
|
@ -2425,7 +2425,7 @@ gem 'activerecord', '~> 3.0' # 아마도 ActiveRecord 3.x도 필요할 것
|
|||
```
|
||||
|
||||
이 속에 애플리케이션의 모든 의존관계를 나열해야 함에 유의하자.
|
||||
그렇지만, Sinatra가 직접적인 의존관계에 있는 것들 (Rack과 Tilt)은
|
||||
그렇지만, Sinatra가 직접적인 의존관계에 있는 것들 (Rack과 Tilt)은
|
||||
Bundler가 자동으로 추출하여 추가할 것이다.
|
||||
|
||||
이제 여러분은 다음과 같이 앱을 실행할 수 있다:
|
||||
|
@ -2481,7 +2481,7 @@ SemVer 및 SemVerTag 둘 다 해당된.
|
|||
* [이슈 트래커](http://github.com/sinatra/sinatra/issues)
|
||||
* [트위터](http://twitter.com/sinatra)
|
||||
* [Mailing List](http://groups.google.com/group/sinatrarb/topics)
|
||||
* [IRC: #sinatra](irc://chat.freenode.net/#sinatra) http://freenode.net
|
||||
* [IRC: #sinatra](irc://chat.freenode.net/#sinatra) http://freenode.net
|
||||
* [Sinatra Book](http://sinatra-book.gittr.com) Cookbook 튜토리얼
|
||||
* [Sinatra Recipes](http://recipes.sinatrarb.com/) 커뮤니티가 만드는 레시피
|
||||
* http://rubydoc.info에 있는 [최종 릴리스](http://rubydoc.info/gems/sinatra)
|
||||
|
|
|
@ -493,12 +493,12 @@ Available Options:
|
|||
<tt>set :rdoc, :layout_options => { :views => 'views/layouts' }</tt>
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
Templates are assumed to be located directly under the `./views` directory. To
|
||||
use a different views directory:
|
||||
|
||||
Templates are assumed to be located directly under the `./views` directory. To
|
||||
use a different views directory:
|
||||
`set :views, settings.root + '/templates'`
|
||||
|
||||
One important thing to remember is that you always have to reference templates
|
||||
One important thing to remember is that you always have to reference templates
|
||||
with symbols, even if they're in a subdirectory (in this case, use:
|
||||
`:'subdir/template'` or `'subdir/template'.to_sym`). You must use a symbol
|
||||
because otherwise rendering methods will render any strings passed to them
|
||||
|
|
|
@ -1187,7 +1187,7 @@ set :session_secret, 'super secret'
|
|||
set :sessions, :domain => 'foo.com'
|
||||
```
|
||||
|
||||
Чтобы сделать сессию доступной другим приложениям, размещенным на поддоменах
|
||||
Чтобы сделать сессию доступной другим приложениям, размещенным на поддоменах
|
||||
foo.com, добавьте *.* перед доменом:
|
||||
|
||||
``` ruby
|
||||
|
|
|
@ -45,10 +45,10 @@ class CompileTest < Test::Unit::TestCase
|
|||
|
||||
converts "/", %r{\A/\z}
|
||||
parses "/", "/", {}
|
||||
|
||||
|
||||
converts "/foo", %r{\A/foo\z}
|
||||
parses "/foo", "/foo", {}
|
||||
|
||||
|
||||
converts "/:foo", %r{\A/([^/?#]+)\z}
|
||||
parses "/:foo", "/foo", "foo" => "foo"
|
||||
parses "/:foo", "/foo.bar", "foo" => "foo.bar"
|
||||
|
@ -58,68 +58,68 @@ class CompileTest < Test::Unit::TestCase
|
|||
fails "/:foo", "/foo/bar"
|
||||
fails "/:foo", "/"
|
||||
fails "/:foo", "/foo/"
|
||||
|
||||
|
||||
converts "/föö", %r{\A/f%[Cc]3%[Bb]6%[Cc]3%[Bb]6\z}
|
||||
parses "/föö", "/f%C3%B6%C3%B6", {}
|
||||
|
||||
|
||||
converts "/:foo/:bar", %r{\A/([^/?#]+)/([^/?#]+)\z}
|
||||
parses "/:foo/:bar", "/foo/bar", "foo" => "foo", "bar" => "bar"
|
||||
|
||||
|
||||
converts "/hello/:person", %r{\A/hello/([^/?#]+)\z}
|
||||
parses "/hello/:person", "/hello/Frank", "person" => "Frank"
|
||||
|
||||
|
||||
converts "/?:foo?/?:bar?", %r{\A/?([^/?#]+)?/?([^/?#]+)?\z}
|
||||
parses "/?:foo?/?:bar?", "/hello/world", "foo" => "hello", "bar" => "world"
|
||||
parses "/?:foo?/?:bar?", "/hello", "foo" => "hello", "bar" => nil
|
||||
parses "/?:foo?/?:bar?", "/", "foo" => nil, "bar" => nil
|
||||
parses "/?:foo?/?:bar?", "", "foo" => nil, "bar" => nil
|
||||
|
||||
|
||||
converts "/*", %r{\A/(.*?)\z}
|
||||
parses "/*", "/", "splat" => ""
|
||||
parses "/*", "/foo", "splat" => "foo"
|
||||
parses "/*", "/foo/bar", "splat" => "foo/bar"
|
||||
|
||||
|
||||
converts "/:foo/*", %r{\A/([^/?#]+)/(.*?)\z}
|
||||
parses "/:foo/*", "/foo/bar/baz", "foo" => "foo", "splat" => "bar/baz"
|
||||
|
||||
|
||||
converts "/:foo/:bar", %r{\A/([^/?#]+)/([^/?#]+)\z}
|
||||
parses "/:foo/:bar", "/user@example.com/name", "foo" => "user@example.com", "bar" => "name"
|
||||
|
||||
|
||||
converts "/test$/", %r{\A/test(?:\$|%24)/\z}
|
||||
parses "/test$/", "/test$/", {}
|
||||
|
||||
|
||||
converts "/te+st/", %r{\A/te(?:\+|%2[Bb])st/\z}
|
||||
parses "/te+st/", "/te+st/", {}
|
||||
fails "/te+st/", "/test/"
|
||||
fails "/te+st/", "/teeest/"
|
||||
|
||||
|
||||
converts "/test(bar)/", %r{\A/test(?:\(|%28)bar(?:\)|%29)/\z}
|
||||
parses "/test(bar)/", "/test(bar)/", {}
|
||||
|
||||
|
||||
converts "/path with spaces", %r{\A/path(?:%20|(?:\+|%2[Bb]))with(?:%20|(?:\+|%2[Bb]))spaces\z}
|
||||
parses "/path with spaces", "/path%20with%20spaces", {}
|
||||
parses "/path with spaces", "/path%2Bwith%2Bspaces", {}
|
||||
parses "/path with spaces", "/path+with+spaces", {}
|
||||
|
||||
|
||||
converts "/foo&bar", %r{\A/foo(?:&|%26)bar\z}
|
||||
parses "/foo&bar", "/foo&bar", {}
|
||||
|
||||
|
||||
converts "/:foo/*", %r{\A/([^/?#]+)/(.*?)\z}
|
||||
parses "/:foo/*", "/hello%20world/how%20are%20you", "foo" => "hello%20world", "splat" => "how%20are%20you"
|
||||
|
||||
|
||||
converts "/*/foo/*/*", %r{\A/(.*?)/foo/(.*?)/(.*?)\z}
|
||||
parses "/*/foo/*/*", "/bar/foo/bling/baz/boom", "splat" => ["bar", "bling", "baz/boom"]
|
||||
fails "/*/foo/*/*", "/bar/foo/baz"
|
||||
|
||||
|
||||
converts "/test.bar", %r{\A/test(?:\.|%2[Ee])bar\z}
|
||||
parses "/test.bar", "/test.bar", {}
|
||||
fails "/test.bar", "/test0bar"
|
||||
|
||||
|
||||
converts "/:file.:ext", %r{\A/((?:[^\./?#%]|(?:%[^2].|%[2][^Ee]))+)(?:\.|%2[Ee])((?:[^/?#%]|(?:%[^2].|%[2][^Ee]))+)\z}
|
||||
parses "/:file.:ext", "/pony.jpg", "file" => "pony", "ext" => "jpg"
|
||||
parses "/:file.:ext", "/pony%2Ejpg", "file" => "pony", "ext" => "jpg"
|
||||
fails "/:file.:ext", "/.jpg"
|
||||
|
||||
|
||||
converts "/:name.?:format?", %r{\A/((?:[^\./?#%]|(?:%[^2].|%[2][^Ee]))+)(?:\.|%2[Ee])?((?:[^/?#%]|(?:%[^2].|%[2][^Ee]))+)?\z}
|
||||
parses "/:name.?:format?", "/foo", "name" => "foo", "format" => nil
|
||||
parses "/:name.?:format?", "/foo.bar", "name" => "foo", "format" => "bar"
|
||||
|
@ -129,41 +129,41 @@ class CompileTest < Test::Unit::TestCase
|
|||
parses "/:name?.:format?", "/.bar", "name" => nil, "format" => "bar"
|
||||
fails "/:name.:format", "/.bar"
|
||||
fails "/:name.?:format?", "/.bar"
|
||||
|
||||
|
||||
converts "/:user@?:host?", %r{\A/((?:[^@/?#%]|(?:%[^4].|%[4][^0]))+)(?:@|%40)?((?:[^@/?#%]|(?:%[^4].|%[4][^0]))+)?\z}
|
||||
parses "/:user@?:host?", "/foo@bar", "user" => "foo", "host" => "bar"
|
||||
parses "/:user@?:host?", "/foo.foo@bar", "user" => "foo.foo", "host" => "bar"
|
||||
parses "/:user@?:host?", "/foo@bar.bar", "user" => "foo", "host" => "bar.bar"
|
||||
|
||||
|
||||
# From https://gist.github.com/2154980#gistcomment-169469.
|
||||
#
|
||||
# converts "/:name(.:format)?", %r{\A/([^\.%2E/?#]+)(?:\(|%28)(?:\.|%2E)([^\.%2E/?#]+)(?:\)|%29)?\z}
|
||||
# parses "/:name(.:format)?", "/foo", "name" => "foo", "format" => nil
|
||||
# parses "/:name(.:format)?", "/foo.bar", "name" => "foo", "format" => "bar"
|
||||
fails "/:name(.:format)?", "/foo."
|
||||
|
||||
|
||||
parses "/:id/test.bar", "/3/test.bar", {"id" => "3"}
|
||||
parses "/:id/test.bar", "/2/test.bar", {"id" => "2"}
|
||||
parses "/:id/test.bar", "/2E/test.bar", {"id" => "2E"}
|
||||
parses "/:id/test.bar", "/2e/test.bar", {"id" => "2e"}
|
||||
parses "/:id/test.bar", "/%2E/test.bar", {"id" => "%2E"}
|
||||
|
||||
|
||||
parses '/10/:id', '/10/test', "id" => "test"
|
||||
parses '/10/:id', '/10/te.st', "id" => "te.st"
|
||||
|
||||
|
||||
parses '/10.1/:id', '/10.1/test', "id" => "test"
|
||||
parses '/10.1/:id', '/10.1/te.st', "id" => "te.st"
|
||||
parses '/:foo/:id', '/10.1/te.st', "foo" => "10.1", "id" => "te.st"
|
||||
parses '/:foo/:id', '/10.1.2/te.st', "foo" => "10.1.2", "id" => "te.st"
|
||||
parses '/:foo.:bar/:id', '/10.1/te.st', "foo" => "10", "bar" => "1", "id" => "te.st"
|
||||
fails '/:foo.:bar/:id', '/10.1.2/te.st' # We don't do crazy.
|
||||
|
||||
|
||||
parses '/:a/:b.?:c?', '/a/b', "a" => "a", "b" => "b", "c" => nil
|
||||
parses '/:a/:b.?:c?', '/a/b.c', "a" => "a", "b" => "b", "c" => "c"
|
||||
parses '/:a/:b.?:c?', '/a.b/c', "a" => "a.b", "b" => "c", "c" => nil
|
||||
parses '/:a/:b.?:c?', '/a.b/c.d', "a" => "a.b", "b" => "c", "c" => "d"
|
||||
fails '/:a/:b.?:c?', '/a.b/c.d/e'
|
||||
|
||||
|
||||
parses "/:file.:ext", "/pony%2ejpg", "file" => "pony", "ext" => "jpg"
|
||||
parses "/:file.:ext", "/pony%E6%AD%A3%2Ejpg", "file" => "pony%E6%AD%A3", "ext" => "jpg"
|
||||
parses "/:file.:ext", "/pony%e6%ad%a3%2ejpg", "file" => "pony%e6%ad%a3", "ext" => "jpg"
|
||||
|
@ -171,12 +171,12 @@ class CompileTest < Test::Unit::TestCase
|
|||
parses "/:file.:ext", "/pony正%2ejpg", "file" => "pony正", "ext" => "jpg"
|
||||
parses "/:file.:ext", "/pony正..jpg", "file" => "pony正", "ext" => ".jpg"
|
||||
fails "/:file.:ext", "/pony正.%2ejpg"
|
||||
|
||||
|
||||
converts "/:name.:format", %r{\A/((?:[^\./?#%]|(?:%[^2].|%[2][^Ee]))+)(?:\.|%2[Ee])((?:[^/?#%]|(?:%[^2].|%[2][^Ee]))+)\z}
|
||||
parses "/:name.:format", "/file.tar.gz", "name" => "file", "format" => "tar.gz"
|
||||
parses "/:name.:format1.:format2", "/file.tar.gz", "name" => "file", "format1" => "tar", "format2" => "gz"
|
||||
parses "/:name.:format1.:format2", "/file.temp.tar.gz", "name" => "file", "format1" => "temp", "format2" => "tar.gz"
|
||||
|
||||
|
||||
# From issue #688.
|
||||
#
|
||||
parses "/articles/10.1103/:doi", "/articles/10.1103/PhysRevLett.110.026401", "doi" => "PhysRevLett.110.026401"
|
||||
|
|
Loading…
Reference in New Issue