sinatra 1.4.3 → 1.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of sinatra might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.yardopts +3 -2
- data/CHANGES +36 -1
- data/Gemfile +7 -4
- data/README.de.md +25 -25
- data/README.es.md +2 -2
- data/README.fr.md +682 -387
- data/README.hu.md +14 -14
- data/README.jp.md +82 -38
- data/README.ko.md +60 -60
- data/README.md +24 -13
- data/README.pt-br.md +18 -7
- data/README.ru.md +7 -0
- data/Rakefile +2 -0
- data/lib/sinatra/base.rb +104 -49
- data/lib/sinatra/images/404.png +0 -0
- data/lib/sinatra/images/500.png +0 -0
- data/lib/sinatra/{showexceptions.rb → show_exceptions.rb} +0 -0
- data/lib/sinatra/version.rb +1 -1
- data/test/base_test.rb +0 -1
- data/test/compile_test.rb +28 -28
- data/test/filter_test.rb +1 -1
- data/test/helpers_test.rb +11 -0
- data/test/integration/app.rb +17 -0
- data/test/integration_helper.rb +10 -1
- data/test/integration_test.rb +11 -1
- data/test/rdoc_test.rb +2 -2
- data/test/request_test.rb +19 -0
- data/test/response_test.rb +1 -1
- data/test/routing_test.rb +18 -0
- data/test/slim_test.rb +4 -4
- data/test/templates_test.rb +15 -0
- metadata +4 -4
data/README.hu.md
CHANGED
@@ -70,7 +70,7 @@ is el tudod érni:
|
|
70
70
|
end
|
71
71
|
```
|
72
72
|
|
73
|
-
Az útvonalmintákban szerepelhetnek joker paraméterek is, melyeket a
|
73
|
+
Az útvonalmintákban szerepelhetnek joker paraméterek is, melyeket a
|
74
74
|
`params[:splat]` tömbön keresztül tudunk elérni.
|
75
75
|
|
76
76
|
```ruby
|
@@ -134,7 +134,7 @@ itt is lehetőség nyílik egyéb könyvtár használatára:
|
|
134
134
|
set :views, File.dirname(__FILE__) + '/templates'
|
135
135
|
|
136
136
|
Nagyon fontos észben tartani, hogy a sablononkra mindig szimbólumokkal
|
137
|
-
hivatkozunk, még akkor is, ha egyéb (ebben az esetben a
|
137
|
+
hivatkozunk, még akkor is, ha egyéb (ebben az esetben a
|
138
138
|
:'subdir/template') könyvtárban tároljuk őket. A renderelő
|
139
139
|
metódusok minden, nekik közvetlenül átadott karakterláncot megjelenítenek.
|
140
140
|
|
@@ -286,13 +286,13 @@ végére begépeljük őket:
|
|
286
286
|
|
287
287
|
Megjegyzés: azok a fájlon belüli sablonok, amelyek az alkalmazás fájl végére
|
288
288
|
kerülnek és függnek a sinatra könyvtártól, automatikusan betöltődnek.
|
289
|
-
Ha ugyanezt más alkalmazásfájlban is szeretnéd megtenni, hívd meg
|
289
|
+
Ha ugyanezt más alkalmazásfájlban is szeretnéd megtenni, hívd meg
|
290
290
|
a <tt>use_in_file_templates!</tt> metódust az adott fájlban.
|
291
291
|
|
292
292
|
### Kulcsszavas sablonok
|
293
293
|
|
294
|
-
Sablonokat végül a felsőszintű <tt>template</tt> metódussal is
|
295
|
-
definiálhatunk:
|
294
|
+
Sablonokat végül a felsőszintű <tt>template</tt> metódussal is
|
295
|
+
definiálhatunk:
|
296
296
|
|
297
297
|
```ruby
|
298
298
|
template :layout do
|
@@ -383,7 +383,7 @@ Vagy állítsd be a HTTP státuszt és a törzset is egyszerre ...
|
|
383
383
|
|
384
384
|
## Passzolás
|
385
385
|
|
386
|
-
Az útvonalak továbbadhatják a végrehajtást egy másik útvonalnak
|
386
|
+
Az útvonalak továbbadhatják a végrehajtást egy másik útvonalnak
|
387
387
|
a `pass` függvényhívással:
|
388
388
|
|
389
389
|
```ruby
|
@@ -432,7 +432,7 @@ Csak akkor fusson le, ha a környezet <tt>:production</tt> vagy <tt>:test</tt>:
|
|
432
432
|
|
433
433
|
A hibakezelők ugyanabban a kontextusban futnak le, mint az útvonalak és
|
434
434
|
előszűrők, ezért számukra is elérhetőek mindazok a könyvtárak, amelyek
|
435
|
-
az utóbbiak rendelkezésére is állnak; így például a `haml`,
|
435
|
+
az utóbbiak rendelkezésére is állnak; így például a `haml`,
|
436
436
|
az `erb`, a `halt` stb.
|
437
437
|
|
438
438
|
### Nem található
|
@@ -495,10 +495,10 @@ bevezetéséhez:
|
|
495
495
|
## Rack Middleware
|
496
496
|
|
497
497
|
A Sinatra egy Ruby keretrendszerek számára kifejlesztett egyszerű és szabványos
|
498
|
-
interfészre, a [Rack](http://rack.rubyforge.org/) -re épül. A Rack fejlesztői
|
498
|
+
interfészre, a [Rack](http://rack.rubyforge.org/) -re épül. A Rack fejlesztői
|
499
499
|
szempontból egyik legérdekesebb jellemzője, hogy támogatja az úgynevezett
|
500
500
|
"middleware" elnevezésű komponenseket, amelyek beékelődnek a szerver és az
|
501
|
-
alkalmazás közé, így képesek megfigyelni és/vagy módosítani a HTTP
|
501
|
+
alkalmazás közé, így képesek megfigyelni és/vagy módosítani a HTTP
|
502
502
|
kéréseket és válaszokat. Segítségükkel különféle, egységesen működő
|
503
503
|
funkciókat építhetünk be rendszerünkbe.
|
504
504
|
|
@@ -517,10 +517,10 @@ A Sinatra keretrendszerben gyerekjáték a Rack middleware-ek behúzása a
|
|
517
517
|
end
|
518
518
|
```
|
519
519
|
|
520
|
-
A `use` metódus szemantikája megegyezik a
|
520
|
+
A `use` metódus szemantikája megegyezik a
|
521
521
|
[Rack::Builder](http://rack.rubyforge.org/doc/classes/Rack/Builder.html) DSL-ben
|
522
522
|
használt +use+ metóduséval (az említett DSL-t leginkább rackup állományokban
|
523
|
-
használják). Hogy egy példát említsünk, a `use` metódus elfogad
|
523
|
+
használják). Hogy egy példát említsünk, a `use` metódus elfogad
|
524
524
|
változókat és blokkokat egyaránt, akár kombinálva is ezeket:
|
525
525
|
|
526
526
|
```ruby
|
@@ -530,7 +530,7 @@ változókat és blokkokat egyaránt, akár kombinálva is ezeket:
|
|
530
530
|
```
|
531
531
|
|
532
532
|
A Rack terjesztéssel egy csomó alap middleware komponens is érkezik,
|
533
|
-
amelyekkel a naplózás, URL útvonalak megadása, autentikáció és
|
533
|
+
amelyekkel a naplózás, URL útvonalak megadása, autentikáció és
|
534
534
|
munkamenet-kezelés könnyen megvalósítható. A Sinatra ezek közül elég
|
535
535
|
sokat automatikusan felhasznál a beállításoktól függően, így ezek
|
536
536
|
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:
|
|
619
619
|
a Sinatra::Base osztály gyermekosztályaiban kell megadni.
|
620
620
|
|
621
621
|
A `Sinatra::Base` osztály igazából egy üres lap: a legtöbb funkció
|
622
|
-
alapból ki van kapcsolva, beleértve a beépített szervert is. A
|
622
|
+
alapból ki van kapcsolva, beleértve a beépített szervert is. A
|
623
623
|
beállításokkal és az egyes kapcsolók hatásával az
|
624
624
|
[Options and Configuration](http://sinatra.github.com/configuration.html) lap
|
625
625
|
foglalkozik.
|
@@ -653,7 +653,7 @@ Az alábbi kapcsolókat ismeri fel a rendszer:
|
|
653
653
|
|
654
654
|
Ha a Sinatra legfrissebb, fejlesztői változatát szeretnéd használni,
|
655
655
|
készíts egy helyi másolatot és indítsd az alkalmazásodat úgy,
|
656
|
-
hogy a `sinatra/lib` könyvtár elérhető legyen a
|
656
|
+
hogy a `sinatra/lib` könyvtár elérhető legyen a
|
657
657
|
`LOAD_PATH`-on:
|
658
658
|
|
659
659
|
```
|
data/README.jp.md
CHANGED
@@ -23,21 +23,39 @@ gemをインストールして動かしてみる。
|
|
23
23
|
Sinatraでは、ルートはHTTPメソッドとURLマッチングパターンがペアになっています。
|
24
24
|
ルートはブロックに結び付けられています。
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
``` ruby
|
27
|
+
get '/' do
|
28
|
+
.. 何か見せる ..
|
29
|
+
end
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
post '/' do
|
32
|
+
.. 何か生成する ..
|
33
|
+
end
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
|
35
|
+
put '/' do
|
36
|
+
.. 何か更新する ..
|
37
|
+
end
|
37
38
|
|
38
|
-
|
39
|
-
|
40
|
-
|
39
|
+
patch '/' do
|
40
|
+
.. 何か修正する ..
|
41
|
+
end
|
42
|
+
|
43
|
+
delete '/' do
|
44
|
+
.. 何か削除する ..
|
45
|
+
end
|
46
|
+
|
47
|
+
options '/' do
|
48
|
+
.. 何か満たす ..
|
49
|
+
end
|
50
|
+
|
51
|
+
link '/' do
|
52
|
+
.. 何かリンクを張る ..
|
53
|
+
end
|
54
|
+
|
55
|
+
unlink '/' do
|
56
|
+
.. 何かアンリンクする ..
|
57
|
+
end
|
58
|
+
```
|
41
59
|
|
42
60
|
ルートは定義された順番にマッチします。
|
43
61
|
リクエストに最初にマッチしたルートが呼び出されます。
|
@@ -45,48 +63,74 @@ Sinatraでは、ルートはHTTPメソッドとURLマッチングパターンが
|
|
45
63
|
ルートのパターンは名前付きパラメータを含むことができ、
|
46
64
|
`params`ハッシュで取得できます。
|
47
65
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
66
|
+
``` ruby
|
67
|
+
get '/hello/:name' do
|
68
|
+
# "GET /hello/foo" と "GET /hello/bar" にマッチ
|
69
|
+
# params[:name] は 'foo' か 'bar'
|
70
|
+
"Hello #{params[:name]}!"
|
71
|
+
end
|
72
|
+
```
|
53
73
|
|
54
74
|
また、ブロックパラメータで名前付きパラメータにアクセスすることもできます。
|
55
75
|
|
56
|
-
|
57
|
-
|
58
|
-
|
76
|
+
``` ruby
|
77
|
+
get '/hello/:name' do |n|
|
78
|
+
# "GET /hello/foo" と "GET /hello/bar" にマッチ
|
79
|
+
# params[:name] は 'foo' か 'bar'
|
80
|
+
# n が params[:name] を保持
|
81
|
+
"Hello #{n}!"
|
82
|
+
end
|
83
|
+
```
|
59
84
|
|
60
85
|
ルートパターンはsplat(またはワイルドカード)を含むこともでき、
|
61
86
|
`params[:splat]` で取得できます。
|
62
87
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
88
|
+
``` ruby
|
89
|
+
get '/say/*/to/*' do
|
90
|
+
# /say/hello/to/world にマッチ
|
91
|
+
params[:splat] # => ["hello", "world"]
|
92
|
+
end
|
67
93
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
94
|
+
get '/download/*.*' do
|
95
|
+
# /download/path/to/file.xml にマッチ
|
96
|
+
params[:splat] # => ["path/to/file", "xml"]
|
97
|
+
end
|
98
|
+
```
|
72
99
|
|
73
100
|
ブロックパラーメータを使用した場合:
|
74
101
|
|
75
|
-
|
76
|
-
|
77
|
-
|
102
|
+
``` ruby
|
103
|
+
get '/download/*.*' do |path, ext|
|
104
|
+
[path, ext] # => ["path/to/file", "xml"]
|
105
|
+
end
|
106
|
+
```
|
78
107
|
|
79
|
-
|
108
|
+
正規表現を使用した場合:
|
80
109
|
|
81
|
-
|
82
|
-
|
83
|
-
|
110
|
+
``` ruby
|
111
|
+
get %r{/hello/([\w]+)} do
|
112
|
+
"Hello, #{params[:captures].first}!"
|
113
|
+
end
|
114
|
+
```
|
84
115
|
|
85
116
|
ブロックパラーメータを使用した場合:
|
86
117
|
|
87
|
-
|
88
|
-
|
89
|
-
|
118
|
+
``` ruby
|
119
|
+
get %r{/hello/([\w]+)} do |c|
|
120
|
+
"Hello, #{c}!"
|
121
|
+
end
|
122
|
+
```
|
123
|
+
|
124
|
+
オプショナルパラメーターを使用した場合:
|
125
|
+
|
126
|
+
``` ruby
|
127
|
+
get '/posts.?:format?' do
|
128
|
+
# "GET /posts" と "GET /posts.json", "GET /posts.xml" の拡張子などにマッチ
|
129
|
+
end
|
130
|
+
```
|
131
|
+
|
132
|
+
ところで、ディレクトリトラバーサル保護機能を無効にしないと(下記参照)、
|
133
|
+
ルートにマッチする前にリクエストパスが修正される可能性があります。
|
90
134
|
|
91
135
|
### 条件
|
92
136
|
|
data/README.ko.md
CHANGED
@@ -121,7 +121,7 @@ get '/posts.?:format?' do
|
|
121
121
|
end
|
122
122
|
```
|
123
123
|
|
124
|
-
한편, 경로 탐색 공격 방지(path traversal attack protection, 아래 참조)를 비활성화시키지 않았다면,
|
124
|
+
한편, 경로 탐색 공격 방지(path traversal attack protection, 아래 참조)를 비활성화시키지 않았다면,
|
125
125
|
요청 경로는 라우터와 매칭되기 이전에 수정될 수 있다.
|
126
126
|
|
127
127
|
### 조건(Conditions)
|
@@ -222,17 +222,17 @@ get('/') { Stream.new }
|
|
222
222
|
```ruby
|
223
223
|
class AllButPattern
|
224
224
|
Match = Struct.new(:captures)
|
225
|
-
|
225
|
+
|
226
226
|
def initialize(except)
|
227
227
|
@except = except
|
228
228
|
@captures = Match.new([])
|
229
229
|
end
|
230
|
-
|
230
|
+
|
231
231
|
def match(str)
|
232
232
|
@captures unless @except === str
|
233
233
|
end
|
234
234
|
end
|
235
|
-
|
235
|
+
|
236
236
|
def all_but(pattern)
|
237
237
|
AllButPattern.new(pattern)
|
238
238
|
end
|
@@ -341,7 +341,7 @@ render 메서드에서 전달된 옵션값들은 `set`을 통해 설정한 옵
|
|
341
341
|
<dd>템플릿을 로드할 뷰 폴더. 기본값은 <tt>settings.views</tt>.</dd>
|
342
342
|
|
343
343
|
<dt>layout</dt>
|
344
|
-
<dd>레이아웃을 사용할지 여부 (<tt>true</tt> 또는 <tt>false</tt>), 만약 이 값이 심볼일 경우,
|
344
|
+
<dd>레이아웃을 사용할지 여부 (<tt>true</tt> 또는 <tt>false</tt>), 만약 이 값이 심볼일 경우,
|
345
345
|
사용할 템플릿을 지정. 예제: <tt>erb :index, :layout => !request.xhr?</tt>
|
346
346
|
</dd>
|
347
347
|
|
@@ -367,7 +367,7 @@ set :views, settings.root + '/templates'
|
|
367
367
|
```
|
368
368
|
|
369
369
|
꼭 알아야 할 중요한 점 한 가지는 템플릿은 언제나 심볼로 참조된다는 것이며,
|
370
|
-
템플릿이 하위 디렉터리에 위치한 경우라도 마찬가지임(그럴 경우에는 `:'subdir/template'`을 사용).
|
370
|
+
템플릿이 하위 디렉터리에 위치한 경우라도 마찬가지임(그럴 경우에는 `:'subdir/template'`을 사용).
|
371
371
|
반드시 심볼이어야 하는 이유는, 만약 그렇게 하지 않으면 렌더링 메서드가 전달된 문자열을 직접 렌더하려 할 것이기 때문임.
|
372
372
|
|
373
373
|
### 가능한 템플릿 언어들(Available Template Languages)
|
@@ -545,7 +545,7 @@ Liquid 템플릿에서는 루비 메서드(`yield` 제외)를 호출할 수 없
|
|
545
545
|
</tr>
|
546
546
|
</table>
|
547
547
|
|
548
|
-
마크다운에서는 메서드 호출 뿐 아니라 locals 전달도 안됨.
|
548
|
+
마크다운에서는 메서드 호출 뿐 아니라 locals 전달도 안됨.
|
549
549
|
따라서 일반적으로는 다른 렌더링 엔진과 함께 사용하게 될 것임:
|
550
550
|
|
551
551
|
```ruby
|
@@ -801,7 +801,7 @@ end
|
|
801
801
|
Templates are evaluated within the same context as route handlers. Instance
|
802
802
|
variables set in route handlers are directly accessible by templates:
|
803
803
|
템플릿은 라우터 핸들러와 같은 맥락(context)에서 평가된다.
|
804
|
-
라우터 핸들러에서 설정한 인스턴스 변수들은 템플릿에서 접근 가능하다:
|
804
|
+
라우터 핸들러에서 설정한 인스턴스 변수들은 템플릿에서 접근 가능하다:
|
805
805
|
|
806
806
|
```ruby
|
807
807
|
get '/:id' do
|
@@ -810,7 +810,7 @@ get '/:id' do
|
|
810
810
|
end
|
811
811
|
```
|
812
812
|
|
813
|
-
또는, 명시적으로 로컬 변수의 해시를 지정:
|
813
|
+
또는, 명시적으로 로컬 변수의 해시를 지정:
|
814
814
|
|
815
815
|
```ruby
|
816
816
|
get '/:id' do
|
@@ -900,7 +900,7 @@ get '/' do
|
|
900
900
|
end
|
901
901
|
```
|
902
902
|
|
903
|
-
`./views/index.myat` 를 렌더함.
|
903
|
+
`./views/index.myat` 를 렌더함.
|
904
904
|
Tilt에 대한 더 자세한 내용은 https://github.com/rtomayko/tilt 참조.
|
905
905
|
|
906
906
|
## 필터(Filters)
|
@@ -989,7 +989,7 @@ helpers FooUtils, BarUtils
|
|
989
989
|
|
990
990
|
### 세션(Sessions) 사용하기
|
991
991
|
|
992
|
-
세션은 요청 동안에 상태를 유지하기 위해 사용한다.
|
992
|
+
세션은 요청 동안에 상태를 유지하기 위해 사용한다.
|
993
993
|
세션이 활성화되면, 사용자 세션 당 session 해시 하나씩을 갖게 된다:
|
994
994
|
|
995
995
|
```ruby
|
@@ -1007,7 +1007,7 @@ end
|
|
1007
1007
|
`enable :sessions`은 실은 모든 데이터를 쿠키 속에 저장함에 유의하자.
|
1008
1008
|
항상 이렇게 하고 싶지 않을 수도 있을 것이다(예를 들어, 많은 양의 데이터를 저장하게 되면 트래픽이 높아진다).
|
1009
1009
|
이 때는 여러 가지 랙 세션 미들웨어(Rack session middleware)를 사용할 수 있을 것이다:
|
1010
|
-
이렇게 할 경우라면, `enable :sessions`을 호출하지 *말고*,
|
1010
|
+
이렇게 할 경우라면, `enable :sessions`을 호출하지 *말고*,
|
1011
1011
|
대신 여러분이 선택한 미들웨어를 다른 모든 미들웨어들처럼 포함시키면 된다:
|
1012
1012
|
|
1013
1013
|
```ruby
|
@@ -1022,7 +1022,7 @@ get '/:value' do
|
|
1022
1022
|
end
|
1023
1023
|
```
|
1024
1024
|
|
1025
|
-
보안을 위해서, 쿠키 속의 세션 데이터는 세션 시크릿(secret)으로 사인(sign)된다.
|
1025
|
+
보안을 위해서, 쿠키 속의 세션 데이터는 세션 시크릿(secret)으로 사인(sign)된다.
|
1026
1026
|
Sinatra는 여러분을 위해 무작위 시크릿을 생성한다.
|
1027
1027
|
그렇지만, 이 시크릿은 여러분 애플리케이션 시작 시마다 변경될 수 있기 때문에,
|
1028
1028
|
여러분은 여러분 애플리케이션의 모든 인스턴스들이 공유할 시크릿을 직접 만들고 싶을 수도 있다:
|
@@ -1112,7 +1112,7 @@ end
|
|
1112
1112
|
위 예제의 경우, `"bar"`를 헬퍼로 옮겨 `/foo`와 `/bar` 모두에서 사용하도록 함으로써
|
1113
1113
|
테스팅을 쉽게 하고 성능을 높일 수 있을 것이다.
|
1114
1114
|
|
1115
|
-
만약 그 요청이 사본이 아닌 바로 그 동일 인스턴스로 보내지도록 하고 싶다면,
|
1115
|
+
만약 그 요청이 사본이 아닌 바로 그 동일 인스턴스로 보내지도록 하고 싶다면,
|
1116
1116
|
`call` 대신 `call!`을 사용하면 된다.
|
1117
1117
|
|
1118
1118
|
`call`에 대한 더 자세한 내용은 Rack 명세를 참고하면 된다.
|
@@ -1168,16 +1168,16 @@ out << "- dary!\n"
|
|
1168
1168
|
end
|
1169
1169
|
```
|
1170
1170
|
|
1171
|
-
이렇게 하면 스트리밍 API나
|
1171
|
+
이렇게 하면 스트리밍 API나
|
1172
1172
|
[서버 발송 이벤트Server Sent Events](http://dev.w3.org/html5/eventsource/)를 구현할 수 있게 해 주며,
|
1173
1173
|
[WebSockets](http://en.wikipedia.org/wiki/WebSocket)을 위한 기반으로 사용될 수 있다.
|
1174
|
-
또한 이 방법은 일부 콘텐츠가 느린 자원에 의존하는 경우에
|
1174
|
+
또한 이 방법은 일부 콘텐츠가 느린 자원에 의존하는 경우에
|
1175
1175
|
스로풋(throughtput)을 높이기 위해 사용될 수도 있다.
|
1176
1176
|
|
1177
1177
|
스트리밍 동작, 특히 동시 요청의 수는 애플리케이션을 서빙하는 웹서버에 크게 의존적이다.
|
1178
1178
|
어떤 서버, 예컨대 WEBRick 같은 경우는 아예 스트리밍을 지원조차 하지 못할 것이다.
|
1179
1179
|
만약 서버가 스트리밍을 지원하지 않는다면, 본문은 `stream` 으로 전달된 블록이 수행을 마친 후에 한꺼번에 반환될 것이다.
|
1180
|
-
스트리밍은 Shotgun에서는 작동하지 않는다.
|
1180
|
+
스트리밍은 Shotgun에서는 작동하지 않는다.
|
1181
1181
|
|
1182
1182
|
만약 선택적 매개변수 `keep_open`이 설정되어 있다면, 스트림 객체에서 `close`를 호출하지 않을 것이고,
|
1183
1183
|
따라서 여러분은 나중에 실행 흐름 상의 어느 시점에서 스트림을 닫을 수 있다.
|
@@ -1203,7 +1203,7 @@ end
|
|
1203
1203
|
### 로깅(Logging)
|
1204
1204
|
|
1205
1205
|
In the request scope, the `logger` helper exposes a `Logger` instance:
|
1206
|
-
요청 스코프(request scope) 내에서, `Logger`의 인스턴스인 `logger` 헬퍼를 사용할 수 있다:
|
1206
|
+
요청 스코프(request scope) 내에서, `Logger`의 인스턴스인 `logger` 헬퍼를 사용할 수 있다:
|
1207
1207
|
|
1208
1208
|
```ruby
|
1209
1209
|
get '/' do
|
@@ -1318,7 +1318,7 @@ end
|
|
1318
1318
|
|
1319
1319
|
### 캐시 컨트롤(Cache Control)
|
1320
1320
|
|
1321
|
-
헤더를 정확하게 설정하는 것은 적절한 HTTP 캐싱의 기본이다.
|
1321
|
+
헤더를 정확하게 설정하는 것은 적절한 HTTP 캐싱의 기본이다.
|
1322
1322
|
|
1323
1323
|
Cache-Control 헤더를 다음과 같이 간단하게 설정할 수 있다:
|
1324
1324
|
|
@@ -1385,7 +1385,7 @@ end
|
|
1385
1385
|
정적 파일에 `Cache-Control` 헤더 정보를 추가하려면 `:static_cache_control` 설정(아래 참조)을 사용하라:
|
1386
1386
|
|
1387
1387
|
RFC 2616에 따르면 If-Match 또는 If-None-Match 헤더가 `*`로 설정된 경우 요청한 리소스(resource)가 이미 존재하느냐 여부에 따라 다르게 취급해야 한다고 되어 있다.
|
1388
|
-
Sinatra는 (get 처럼) 안전하거나 (put 처럼) 멱등인 요청에 대한 리소스는 이미 존재한다고 가정하며,
|
1388
|
+
Sinatra는 (get 처럼) 안전하거나 (put 처럼) 멱등인 요청에 대한 리소스는 이미 존재한다고 가정하며,
|
1389
1389
|
반면 다른 리소스(예를 들면 post 요청 같은)의 경우는 새 리소스로 취급한다.
|
1390
1390
|
이런 설정은 `:new_resource` 옵션으로 전달하여 변경할 수 있다:
|
1391
1391
|
|
@@ -1447,7 +1447,7 @@ Rack 핸들러가 지원할 경우, Ruby 프로세스로부터의 스트리밍
|
|
1447
1447
|
|
1448
1448
|
### 요청 객체에 접근하기(Accessing the Request Object)
|
1449
1449
|
|
1450
|
-
인입되는 요청 객에는 요청 레벨(필터, 라우터, 오류 핸들러)에서 `request` 메서드를 통해 접근 가능하다:
|
1450
|
+
인입되는 요청 객에는 요청 레벨(필터, 라우터, 오류 핸들러)에서 `request` 메서드를 통해 접근 가능하다:
|
1451
1451
|
|
1452
1452
|
```ruby
|
1453
1453
|
# http://example.com/example 상에서 실행 중인 앱
|
@@ -1504,7 +1504,7 @@ end
|
|
1504
1504
|
|
1505
1505
|
### 첨부(Attachments)
|
1506
1506
|
|
1507
|
-
`attachment` 헬퍼를 사용하여 브라우저에게 응답이 브라우저에 표시되는 게 아니라
|
1507
|
+
`attachment` 헬퍼를 사용하여 브라우저에게 응답이 브라우저에 표시되는 게 아니라
|
1508
1508
|
디스크에 저장되어야 함을 알릴 수 있다:
|
1509
1509
|
|
1510
1510
|
```ruby
|
@@ -1536,7 +1536,7 @@ end
|
|
1536
1536
|
```
|
1537
1537
|
|
1538
1538
|
이 메서드는 내부적으로 `expires` 나 `last_modified` 같은 곳에서 사용된다.
|
1539
|
-
따라서 여러분은 애플리케이션에서 `time_for`를 오버라이딩하여
|
1539
|
+
따라서 여러분은 애플리케이션에서 `time_for`를 오버라이딩하여
|
1540
1540
|
이들 메서드의 동작을 쉽게 확장할 수 있다:
|
1541
1541
|
|
1542
1542
|
```ruby
|
@@ -1613,16 +1613,16 @@ end
|
|
1613
1613
|
configure do
|
1614
1614
|
# 옵션 하나 설정
|
1615
1615
|
set :option, 'value'
|
1616
|
-
|
1616
|
+
|
1617
1617
|
# 여러 옵션 설정
|
1618
1618
|
set :a => 1, :b => 2
|
1619
|
-
|
1619
|
+
|
1620
1620
|
# `set :option, true`와 동일
|
1621
1621
|
enable :option
|
1622
|
-
|
1622
|
+
|
1623
1623
|
# `set :option, false`와 동일
|
1624
1624
|
disable :option
|
1625
|
-
|
1625
|
+
|
1626
1626
|
# 블록으로 동적인 설정을 할 수도 있음
|
1627
1627
|
set(:css_dir) { File.join(views, 'css') }
|
1628
1628
|
end
|
@@ -1660,8 +1660,8 @@ end
|
|
1660
1660
|
|
1661
1661
|
### 공격 방어 설정하기(Configuring attack protection)
|
1662
1662
|
|
1663
|
-
Sinatra는 [Rack::Protection](https://github.com/rkh/rack-protection#readme)을 사용하여
|
1664
|
-
일반적인, 일어날 수 있는 공격에 대비한다.
|
1663
|
+
Sinatra는 [Rack::Protection](https://github.com/rkh/rack-protection#readme)을 사용하여
|
1664
|
+
일반적인, 일어날 수 있는 공격에 대비한다.
|
1665
1665
|
이 부분은 간단하게 비활성시킬 수 있다(성능 향상 효과를 가져올 것이다):
|
1666
1666
|
|
1667
1667
|
```ruby
|
@@ -1762,7 +1762,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
1762
1762
|
개발 모드에서는 활성됨.</dd>
|
1763
1763
|
|
1764
1764
|
<dt>root</dt>
|
1765
|
-
<dd>프로젝트 루트 디렉터리 경로.
|
1765
|
+
<dd>프로젝트 루트 디렉터리 경로.
|
1766
1766
|
설정이 없으면 <tt>app_file</tt> 설정으로부터 유추됨.</dd>
|
1767
1767
|
|
1768
1768
|
<dt>raise_errors</dt>
|
@@ -1832,7 +1832,7 @@ ruby my_app.rb -e [ENVIRONMENT]
|
|
1832
1832
|
|
1833
1833
|
## 예외 처리(Error Handling)
|
1834
1834
|
|
1835
|
-
예외 핸들러는 라우터 및 사전 필터와 동일한 맥락에서 실행된다.
|
1835
|
+
예외 핸들러는 라우터 및 사전 필터와 동일한 맥락에서 실행된다.
|
1836
1836
|
이 말인즉, 이들이 제공하는 모든 것들을 사용할 수 있다는 말이다. 예를 들면 `haml`,
|
1837
1837
|
`erb`, `halt`, 등등.
|
1838
1838
|
|
@@ -1900,7 +1900,7 @@ error 400..510 do
|
|
1900
1900
|
end
|
1901
1901
|
```
|
1902
1902
|
|
1903
|
-
Sinatra는 개발 환경에서 동작할 경우에
|
1903
|
+
Sinatra는 개발 환경에서 동작할 경우에
|
1904
1904
|
특별한 `not_found` 와 `error` 핸들러를 설치한다.
|
1905
1905
|
|
1906
1906
|
## Rack 미들웨어(Rack Middleware)
|
@@ -1940,7 +1940,7 @@ Rack은 로깅, 디버깅, URL 라우팅, 인증, 그리고 세센 핸들링을
|
|
1940
1940
|
Sinatra는 설정에 기반하여 이들 컴포넌트들 중 많은 것들을 자동으로 사용하며,
|
1941
1941
|
따라서 여러분은 일반적으로는 `use`를 명시적으로 사용할 필요가 없을 것이다.
|
1942
1942
|
|
1943
|
-
유용한 미들웨어들은
|
1943
|
+
유용한 미들웨어들은
|
1944
1944
|
[rack](https://github.com/rack/rack/tree/master/lib/rack),
|
1945
1945
|
[rack-contrib](https://github.com/rack/rack-contrib#readme),
|
1946
1946
|
[CodeRack](http://coderack.org/) 또는
|
@@ -1959,21 +1959,21 @@ require 'rack/test'
|
|
1959
1959
|
|
1960
1960
|
class MyAppTest < Test::Unit::TestCase
|
1961
1961
|
include Rack::Test::Methods
|
1962
|
-
|
1962
|
+
|
1963
1963
|
def app
|
1964
1964
|
Sinatra::Application
|
1965
1965
|
end
|
1966
|
-
|
1966
|
+
|
1967
1967
|
def test_my_default
|
1968
1968
|
get '/'
|
1969
1969
|
assert_equal 'Hello World!', last_response.body
|
1970
1970
|
end
|
1971
|
-
|
1971
|
+
|
1972
1972
|
def test_with_params
|
1973
1973
|
get '/meet', :name => 'Frank'
|
1974
1974
|
assert_equal 'Hello Frank!', last_response.body
|
1975
1975
|
end
|
1976
|
-
|
1976
|
+
|
1977
1977
|
def test_with_rack_env
|
1978
1978
|
get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
|
1979
1979
|
assert_equal "You're using Songbird!", last_response.body
|
@@ -1986,7 +1986,7 @@ end
|
|
1986
1986
|
톱레벨에서 앱을 정의하는 것은 마이크로 앱(micro-app) 수준에서는 잘 동작하지만,
|
1987
1987
|
Rack 미들웨어나, Rails 메탈(metal) 또는 서버 컴포넌트를 갖는 간단한 라이브러리, 또는 더 나아가
|
1988
1988
|
Sinatra 익스텐션(extension) 같은 재사용 가능한 컴포넌트들을 구축할 경우에는 심각한 약점을 가진다.
|
1989
|
-
톱레벨은 마이크로 앱 스타일의 설정을 가정한다(즉, 하나의 단일 애플리케이션 파일과
|
1989
|
+
톱레벨은 마이크로 앱 스타일의 설정을 가정한다(즉, 하나의 단일 애플리케이션 파일과
|
1990
1990
|
`./public` 및 `./views` 디렉터리, 로깅, 예외 상세 페이지 등등).
|
1991
1991
|
이게 바로 `Sinatra::Base`가 필요한 부분이다:
|
1992
1992
|
|
@@ -1996,7 +1996,7 @@ require 'sinatra/base'
|
|
1996
1996
|
class MyApp < Sinatra::Base
|
1997
1997
|
set :sessions, true
|
1998
1998
|
set :foo, 'bar'
|
1999
|
-
|
1999
|
+
|
2000
2000
|
get '/' do
|
2001
2001
|
'Hello world!'
|
2002
2002
|
end
|
@@ -2068,7 +2068,7 @@ end
|
|
2068
2068
|
|
2069
2069
|
### 모듈 애플리케이션(Modular Application) 제공하기
|
2070
2070
|
|
2071
|
-
모듈 앱을 시작하는 두 가지 일반적인 옵션이 있는데,
|
2071
|
+
모듈 앱을 시작하는 두 가지 일반적인 옵션이 있는데,
|
2072
2072
|
공격적으로 `run!`으로 시작하거나:
|
2073
2073
|
|
2074
2074
|
```ruby
|
@@ -2139,7 +2139,7 @@ Good signs you probably want to use a `config.ru`:
|
|
2139
2139
|
|
2140
2140
|
Sinatra에서 다른 Rack 미들웨어를 사용할 수 있을 뿐 아니라,
|
2141
2141
|
모든 Sinatra 애플리케이션은 순차로 어떠한 Rack 종착점 앞에 미들웨어로 추가될 수 있다.
|
2142
|
-
이 종착점은 다른 Sinatra 애플리케이션이 될 수도 있고,
|
2142
|
+
이 종착점은 다른 Sinatra 애플리케이션이 될 수도 있고,
|
2143
2143
|
또는 Rack 기반의 어떠한 애플리케이션(Rails/Ramaze/Camping/...)이라도 가능하다:
|
2144
2144
|
|
2145
2145
|
```ruby
|
@@ -2147,9 +2147,9 @@ require 'sinatra/base'
|
|
2147
2147
|
|
2148
2148
|
class LoginScreen < Sinatra::Base
|
2149
2149
|
enable :sessions
|
2150
|
-
|
2150
|
+
|
2151
2151
|
get('/login') { haml :login }
|
2152
|
-
|
2152
|
+
|
2153
2153
|
post('/login') do
|
2154
2154
|
if params[:name] == 'admin' && params[:password] == 'admin'
|
2155
2155
|
session['user_name'] = params[:name]
|
@@ -2162,13 +2162,13 @@ end
|
|
2162
2162
|
class MyApp < Sinatra::Base
|
2163
2163
|
# 미들웨어는 사전 필터보다 앞서 실행됨
|
2164
2164
|
use LoginScreen
|
2165
|
-
|
2165
|
+
|
2166
2166
|
before do
|
2167
2167
|
unless session['user_name']
|
2168
2168
|
halt "접근 거부됨, <a href='/login'>로그인</a> 하세요."
|
2169
2169
|
end
|
2170
2170
|
end
|
2171
|
-
|
2171
|
+
|
2172
2172
|
get('/') { "Hello #{session['user_name']}." }
|
2173
2173
|
end
|
2174
2174
|
```
|
@@ -2226,7 +2226,7 @@ run RailsProject::Application
|
|
2226
2226
|
|
2227
2227
|
모든 Sinatra 애플리케이션은 `Sinatra::Base`의 서브클래스에 대응된다.
|
2228
2228
|
만약 톱레벨 DSL (`require 'sinatra'`)을 사용한다면,
|
2229
|
-
이 클래스는 `Sinatra::Application`이며, 그렇지 않을 경우라면 여러분이 명시적으로 생성한
|
2229
|
+
이 클래스는 `Sinatra::Application`이며, 그렇지 않을 경우라면 여러분이 명시적으로 생성한
|
2230
2230
|
그 서브클래스가 된다. 클래스 레벨에서는 `get` 이나 `before` 같은 메서드들을 가지나,
|
2231
2231
|
`request` 객체나 `session` 에는 접근할 수 없다. 왜냐면 모든 요청에 대해
|
2232
2232
|
애플리케이션 클래스는 오직 하나이기 때문이다.
|
@@ -2261,7 +2261,7 @@ end
|
|
2261
2261
|
### 요청/인스턴스 범위
|
2262
2262
|
|
2263
2263
|
매 요청마다, 애플리케이션 클래스의 새 인스턴스가 생성되고 모든 핸들러 블록은 그 범위 내에서 실행된다.
|
2264
|
-
이 범위 내에서 여러분은 `request` 와 `session` 객체에 접근하거나
|
2264
|
+
이 범위 내에서 여러분은 `request` 와 `session` 객체에 접근하거나
|
2265
2265
|
`erb` 나 `haml` 같은 렌더링 메서드를 호출할 수 있다.
|
2266
2266
|
요청 범위 내에서 애플리케이션 범위는 `settings` 헬퍼를 통해 접근 가능하다:
|
2267
2267
|
|
@@ -2271,12 +2271,12 @@ class MyApp < Sinatra::Base
|
|
2271
2271
|
get '/define_route/:name' do
|
2272
2272
|
# '/define_route/:name'의 요청 범위
|
2273
2273
|
@value = 42
|
2274
|
-
|
2274
|
+
|
2275
2275
|
settings.get("/#{params[:name]}") do
|
2276
2276
|
# "/#{params[:name]}"의 요청 범위
|
2277
2277
|
@value # => nil (동일한 요청이 아님)
|
2278
2278
|
end
|
2279
|
-
|
2279
|
+
|
2280
2280
|
"라우터가 정의됨!"
|
2281
2281
|
end
|
2282
2282
|
end
|
@@ -2293,7 +2293,7 @@ end
|
|
2293
2293
|
|
2294
2294
|
위임 범위(delegation scope)는 메서드를 단순히 클래스 범위로 보낸다(forward).
|
2295
2295
|
그렇지만, 100% 클래스 범위처럼 움직이진 않는데, 왜냐면 클래스 바인딩을 갖지 않기 때문이다.
|
2296
|
-
오직 명시적으로 위임(delegation) 표시된 메서드들만 사용 가능하며
|
2296
|
+
오직 명시적으로 위임(delegation) 표시된 메서드들만 사용 가능하며
|
2297
2297
|
또한 클래스 범위와 변수/상태를 공유하지 않는다 (유의: `self`가 다르다).
|
2298
2298
|
`Sinatra::Delegator.delegate :method_name`을 호출하여 메서드 위임을 명시적으로 추가할 수 있다.
|
2299
2299
|
|
@@ -2302,7 +2302,7 @@ end
|
|
2302
2302
|
* 톱레벨 바인딩, `require "sinatra"`를 한 경우
|
2303
2303
|
* `Sinatra::Delegator` 믹스인으로 확장된 객체
|
2304
2304
|
|
2305
|
-
직접 코드를 살펴보길 바란다:
|
2305
|
+
직접 코드를 살펴보길 바란다:
|
2306
2306
|
[Sinatra::Delegator 믹스인](https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/base.rb#L1609-1633)
|
2307
2307
|
코드는 [메인 객체를 확장한 것](https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/main.rb#L28-30)이다.
|
2308
2308
|
|
@@ -2331,7 +2331,7 @@ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
|
|
2331
2331
|
|
2332
2332
|
<dl>
|
2333
2333
|
<dt> Ruby 1.8.7 </dt>
|
2334
|
-
<dd>1.8.7은 완전하게 지원되지만, 꼭 그래야할 특별한 이유가 없다면,
|
2334
|
+
<dd>1.8.7은 완전하게 지원되지만, 꼭 그래야할 특별한 이유가 없다면,
|
2335
2335
|
1.9.2로 업그레이드하거나 또는 JRuby나 Rubinius로 전환할 것을 권장한다.
|
2336
2336
|
1.8.7에 대한 지원은 Sinatra 2.0과 Ruby 2.0 이전에는 중단되지 않을 것이다.
|
2337
2337
|
또한 그때도, 우리는 계속 지원할 것이다.
|
@@ -2349,7 +2349,7 @@ Ruby 1.9.4/2.0 릴리스까지는 적어도 지원을 계속할 것이며,
|
|
2349
2349
|
</dd>
|
2350
2350
|
<dt> Ruby 1.9.3 </dt>
|
2351
2351
|
<dd>1.9.3은 완전하게 지원된다. 그렇지만 프로덕션에서의 사용은
|
2352
|
-
보다 상위의 패치 레벨이 릴리스될 때까지 기다리길 권장한다(현재는 p0).
|
2352
|
+
보다 상위의 패치 레벨이 릴리스될 때까지 기다리길 권장한다(현재는 p0).
|
2353
2353
|
이전 버전에서 1.9.3으로 전환할 경우 모든 세션이 무효화된다는 점을 유의하라.
|
2354
2354
|
|
2355
2355
|
</dd>
|
@@ -2369,7 +2369,7 @@ JRuby의 C 확장 지원은 아직 실험 단계이며, RDiscount, Redcarpet 및
|
|
2369
2369
|
|
2370
2370
|
또한 우리는 새로 나오는 루비 버전을 주시한다.
|
2371
2371
|
|
2372
|
-
다음 루비 구현체들은 공식적으로 지원하지 않지만
|
2372
|
+
다음 루비 구현체들은 공식적으로 지원하지 않지만
|
2373
2373
|
여전히 Sinatra를 실행할 수 있는 것으로 알려져 있다:
|
2374
2374
|
|
2375
2375
|
* JRuby와 Rubinius 예전 버전
|
@@ -2381,17 +2381,17 @@ JRuby의 C 확장 지원은 아직 실험 단계이며, RDiscount, Redcarpet 및
|
|
2381
2381
|
지원되는 플랫폼에서는 그러지 않을 경우, 우리의 문제가 아니라 그쪽의 문제로 간주한다는 뜻이다.
|
2382
2382
|
|
2383
2383
|
또한 우리는 CI를 ruby-head (곧 나올 2.0.0) 과 1.9.4 브랜치에 맞춰 실행하지만,
|
2384
|
-
계속해서 변하고 있기 때문에 아무 것도 보장할 수는 없다.
|
2384
|
+
계속해서 변하고 있기 때문에 아무 것도 보장할 수는 없다.
|
2385
2385
|
1.9.4p0와 2.0.0p0가 지원되길 기대한다.
|
2386
2386
|
|
2387
2387
|
Sinatra는 선택한 루비 구현체가 지원하는 어떠한 운영체제에서도 작동해야 한다.
|
2388
2388
|
|
2389
|
-
현재 Cardinal, SmallRuby, BlueRuby 또는 1.8.7 이전의 루비 버전에서는
|
2389
|
+
현재 Cardinal, SmallRuby, BlueRuby 또는 1.8.7 이전의 루비 버전에서는
|
2390
2390
|
Sinatra를 실행할 수 없을 것이다.
|
2391
2391
|
|
2392
2392
|
## 최신(The Bleeding Edge)
|
2393
2393
|
|
2394
|
-
Sinatra의 가장 최근 코드를 사용하고자 한다면,
|
2394
|
+
Sinatra의 가장 최근 코드를 사용하고자 한다면,
|
2395
2395
|
여러분 애플리케이션을 마스터 브랜치에 맞춰 실행하면 되지만, 덜 안정적일 것임에 분명하다.
|
2396
2396
|
|
2397
2397
|
또한 우리는 가끔 사전배포(prerelease) 젬을 푸시하기 때문에, 다음과 같이 할 수 있다
|
@@ -2404,7 +2404,7 @@ gem install sinatra --pre
|
|
2404
2404
|
|
2405
2405
|
### Bundler를 사용하여
|
2406
2406
|
|
2407
|
-
여러분 애플리케이션을 최신 Sinatra로 실행하고자 한다면,
|
2407
|
+
여러분 애플리케이션을 최신 Sinatra로 실행하고자 한다면,
|
2408
2408
|
[Bundler](http://gembundler.com/)를 사용할 것을 권장한다.
|
2409
2409
|
|
2410
2410
|
우선, 아직 설치하지 않았다면 bundler를 설치한다:
|
@@ -2425,7 +2425,7 @@ gem 'activerecord', '~> 3.0' # 아마도 ActiveRecord 3.x도 필요할 것
|
|
2425
2425
|
```
|
2426
2426
|
|
2427
2427
|
이 속에 애플리케이션의 모든 의존관계를 나열해야 함에 유의하자.
|
2428
|
-
그렇지만, Sinatra가 직접적인 의존관계에 있는 것들 (Rack과 Tilt)은
|
2428
|
+
그렇지만, Sinatra가 직접적인 의존관계에 있는 것들 (Rack과 Tilt)은
|
2429
2429
|
Bundler가 자동으로 추출하여 추가할 것이다.
|
2430
2430
|
|
2431
2431
|
이제 여러분은 다음과 같이 앱을 실행할 수 있다:
|
@@ -2481,7 +2481,7 @@ SemVer 및 SemVerTag 둘 다 해당된.
|
|
2481
2481
|
* [이슈 트래커](http://github.com/sinatra/sinatra/issues)
|
2482
2482
|
* [트위터](http://twitter.com/sinatra)
|
2483
2483
|
* [Mailing List](http://groups.google.com/group/sinatrarb/topics)
|
2484
|
-
* [IRC: #sinatra](irc://chat.freenode.net/#sinatra) http://freenode.net
|
2484
|
+
* [IRC: #sinatra](irc://chat.freenode.net/#sinatra) http://freenode.net
|
2485
2485
|
* [Sinatra Book](http://sinatra-book.gittr.com) Cookbook 튜토리얼
|
2486
2486
|
* [Sinatra Recipes](http://recipes.sinatrarb.com/) 커뮤니티가 만드는 레시피
|
2487
2487
|
* http://rubydoc.info에 있는 [최종 릴리스](http://rubydoc.info/gems/sinatra)
|