sinatra 1.4.4 → 1.4.5
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/CHANGES +19 -2
- data/Gemfile +33 -50
- data/LICENSE +2 -1
- data/README.de.md +2 -3
- data/README.es.md +36 -29
- data/README.fr.md +1 -2
- data/README.ja.md +2726 -0
- data/README.ko.md +1127 -784
- data/README.md +125 -34
- data/README.ru.md +70 -2
- data/README.zh.md +74 -55
- data/Rakefile +1 -1
- data/lib/sinatra/base.rb +17 -7
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +1 -0
- data/test/asciidoctor_test.rb +72 -0
- data/test/helpers_test.rb +3 -3
- data/test/mediawiki_test.rb +68 -0
- data/test/request_test.rb +5 -0
- data/test/routing_test.rb +4 -1
- data/test/sass_test.rb +0 -1
- data/test/scss_test.rb +0 -1
- data/test/static_test.rb +21 -4
- data/test/views/hello.asciidoc +1 -0
- data/test/views/hello.mediawiki +1 -0
- metadata +29 -22
- data/README.jp.md +0 -1141
data/README.ko.md
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
# Sinatra
|
2
2
|
|
3
|
-
*주의: 이 문서는 영문판의 번역본이며 최신판 문서와 다를 수
|
3
|
+
*주의: 이 문서는 영문판의 번역본이며 최신판 문서와 다를 수 있습니다.*
|
4
4
|
|
5
|
-
Sinatra는 최소한의 노력으로 루비 기반 웹 애플리케이션을 신속하게 만들 수 있게
|
5
|
+
Sinatra는 최소한의 노력으로 루비 기반 웹 애플리케이션을 신속하게 만들 수 있게
|
6
|
+
해 주는 [DSL](http://en.wikipedia.org/wiki/Domain-specific_language)입니다.
|
6
7
|
|
7
|
-
```ruby
|
8
|
+
``` ruby
|
8
9
|
# myapp.rb
|
9
10
|
require 'sinatra'
|
10
11
|
|
@@ -13,23 +14,114 @@ get '/' do
|
|
13
14
|
end
|
14
15
|
```
|
15
16
|
|
16
|
-
|
17
|
+
젬을 설치합니다.
|
17
18
|
|
18
|
-
```
|
19
|
+
``` shell
|
19
20
|
gem install sinatra
|
20
|
-
ruby myapp.rb
|
21
21
|
```
|
22
22
|
|
23
|
-
|
23
|
+
실행합니다.
|
24
|
+
|
25
|
+
``` shell
|
26
|
+
ruby myapp.rb
|
27
|
+
```
|
24
28
|
|
25
|
-
`
|
29
|
+
`http://localhost:4567`를 확인해 보세요.
|
30
|
+
|
31
|
+
`gem install thin`도 함께 실행하기를 권장합니다.
|
32
|
+
thin이 설치되어 있을 경우 Sinatra는 thin을 통해 실행합니다.
|
33
|
+
|
34
|
+
## 목차
|
35
|
+
|
36
|
+
* [Sinatra](#sinatra)
|
37
|
+
* [목차](#목차)
|
38
|
+
* [라우터(Routes)](#라우터routes)
|
39
|
+
* [조건(Conditions)](#조건conditions)
|
40
|
+
* [반환값(Return Values)](#반환값return-values)
|
41
|
+
* [커스텀 라우터 매처(Custom Route Matchers)](#커스텀-라우터-매처custom-route-matchers)
|
42
|
+
* [정적 파일(Static Files)](#정적-파일static-files)
|
43
|
+
* [뷰 / 템플릿(Views / Templates)](#뷰--템플릿views--templates)
|
44
|
+
* [리터럴 템플릿(Literal Templates)](#리터럴-템플릿literal-templates)
|
45
|
+
* [가능한 템플릿 언어들(Available Template Languages)](#가능한-템플릿-언어들available-template-languages)
|
46
|
+
* [Haml 템플릿](#haml-템플릿)
|
47
|
+
* [Erb 템플릿](#erb-템플릿)
|
48
|
+
* [Builder 템플릿](#builder-템플릿)
|
49
|
+
* [Nokogiri 템플릿](#nokogiri-템플릿)
|
50
|
+
* [Sass 템플릿](#sass-템플릿)
|
51
|
+
* [SCSS 템플릿](#scss-템플릿)
|
52
|
+
* [Less 템플릿](#less-템플릿)
|
53
|
+
* [Liquid 템플릿](#liquid-템플릿)
|
54
|
+
* [Markdown 템플릿](#markdown-템플릿)
|
55
|
+
* [Textile 템플릿](#textile-템플릿)
|
56
|
+
* [RDoc 템플릿](#rdoc-템플릿)
|
57
|
+
* [Radius 템플릿](#radius-템플릿)
|
58
|
+
* [Markaby 템플릿](#markaby-템플릿)
|
59
|
+
* [RABL 템플릿](#rabl-템플릿)
|
60
|
+
* [Slim 템플릿](#slim-템플릿)
|
61
|
+
* [Creole 템플릿](#creole-템플릿)
|
62
|
+
* [CoffeeScript 템플릿](#coffeescript-템플릿)
|
63
|
+
* [Stylus 템플릿](#stylus-템플릿)
|
64
|
+
* [Yajl 템플릿](#yajl-템플릿)
|
65
|
+
* [WLang 템플릿](#wlang-템플릿)
|
66
|
+
* [템플릿에서 변수에 접근하기](#템플릿에서-변수에-접근하기)
|
67
|
+
* [템플릿에서의 `yield` 와 중첩 레이아웃](#템플릿에서의-yield-와-중첩-레이아웃)
|
68
|
+
* [인라인 템플릿](#인라인-템플릿)
|
69
|
+
* [이름을 가지는 템플릿(Named Templates)](#이름을-가지는-템플릿named-templates)
|
70
|
+
* [파일 확장자 연결하기](#파일-확장자-연결하기)
|
71
|
+
* [나만의 고유한 템플릿 엔진 추가하기](#나만의-고유한-템플릿-엔진-추가하기)
|
72
|
+
* [필터(Filters)](#필터filters)
|
73
|
+
* [헬퍼(Helpers)](#헬퍼helpers)
|
74
|
+
* [세션(Sessions) 사용하기](#세션sessions-사용하기)
|
75
|
+
* [중단하기(Halting)](#중단하기halting)
|
76
|
+
* [넘기기(Passing)](#넘기기passing)
|
77
|
+
* [다른 라우터 부르기(Triggering Another Route)](#다른-라우터-부르기triggering-another-route)
|
78
|
+
* [본문, 상태 코드 및 헤더 설정하기](#본문-상태-코드-및-헤더-설정하기)
|
79
|
+
* [응답 스트리밍(Streaming Responses)](#응답-스트리밍streaming-responses)
|
80
|
+
* [로깅(Logging)](#로깅logging)
|
81
|
+
* [마임 타입(Mime Types)](#마임-타입mime-types)
|
82
|
+
* [URL 생성하기](#url-생성하기)
|
83
|
+
* [브라우저 재지정(Browser Redirect)](#브라우저-재지정browser-redirect)
|
84
|
+
* [캐시 컨트롤(Cache Control)](#캐시-컨트롤cache-control)
|
85
|
+
* [파일 전송하기(Sending Files)](#파일-전송하기sending-files)
|
86
|
+
* [요청 객체에 접근하기(Accessing the Request Object)](#요청-객체에-접근하기accessing-the-request-object)
|
87
|
+
* [첨부(Attachments)](#첨부attachments)
|
88
|
+
* [날짜와 시간 다루기](#날짜와-시간-다루기)
|
89
|
+
* [템플릿 파일 참조하기](#템플릿-파일-참조하기)
|
90
|
+
* [설정(Configuration)](#설정configuration)
|
91
|
+
* [공격 방어 설정하기(Configuring attack protection)](#공격-방어-설정하기configuring-attack-protection)
|
92
|
+
* [가능한 설정들(Available Settings)](#가능한-설정들available-settings)
|
93
|
+
* [환경(Environments)](#환경environments)
|
94
|
+
* [에러 처리(Error Handling)](#에러-처리error-handling)
|
95
|
+
* [찾을 수 없음(Not Found)](#찾을-수-없음not-found)
|
96
|
+
* [에러](#에러)
|
97
|
+
* [Rack 미들웨어(Rack Middleware)](#rack-미들웨어rack-middleware)
|
98
|
+
* [테스팅(Testing)](#테스팅testing)
|
99
|
+
* [Sinatra::Base - 미들웨어(Middleware), 라이브러리(Libraries), 그리고 모듈 앱(Modular Apps)](#sinatrabase---미들웨어middleware-라이브러리libraries-그리고-모듈-앱modular-apps)
|
100
|
+
* [모듈(Modular) vs. 전통적 방식(Classic Style)](#모듈modular-vs-전통적-방식classic-style)
|
101
|
+
* [모듈 애플리케이션(Modular Application) 제공하기](#모듈-애플리케이션modular-application-제공하기)
|
102
|
+
* [config.ru로 전통적 방식의 애플리케이션 사용하기](#configru로-전통적-방식의-애플리케이션-사용하기)
|
103
|
+
* [언제 config.ru를 사용할까?](#언제-configru를-사용할까)
|
104
|
+
* [Sinatra를 미들웨어로 사용하기](#sinatra를-미들웨어로-사용하기)
|
105
|
+
* [동적인 애플리케이션 생성(Dynamic Application Creation)](#동적인-애플리케이션-생성dynamic-application-creation)
|
106
|
+
* [범위(Scopes)와 바인딩(Binding)](#범위scopes와-바인딩binding)
|
107
|
+
* [애플리케이션/클래스 범위](#애플리케이션클래스-범위)
|
108
|
+
* [요청/인스턴스 범위](#요청인스턴스-범위)
|
109
|
+
* [위임 범위(Delegation Scope)](#위임-범위delegation-scope)
|
110
|
+
* [명령행(Command Line)](#명령행command-line)
|
111
|
+
* [요구사항(Requirement)](#요구사항requirement)
|
112
|
+
* [최신(The Bleeding Edge)](#최신the-bleeding-edge)
|
113
|
+
* [Bundler를 사용하여](#bundler를-사용하여)
|
114
|
+
* [직접 하기(Roll Your Own)](#직접-하기roll-your-own)
|
115
|
+
* [전역으로 설치(Install Globally)](#전역으로-설치install-globally)
|
116
|
+
* [버저닝(Versioning)](#버저닝versioning)
|
117
|
+
* [더 읽을 거리(Further Reading)](#더-읽을-거리further-reading)
|
26
118
|
|
27
119
|
## 라우터(Routes)
|
28
120
|
|
29
|
-
Sinatra에서, 라우터(route)는 URL-매칭 패턴과 쌍을 이루는 HTTP
|
30
|
-
각각의 라우터는 블록과
|
121
|
+
Sinatra에서, 라우터(route)는 URL-매칭 패턴과 쌍을 이루는 HTTP 메서드입니다.
|
122
|
+
각각의 라우터는 블록과 연결됩니다.
|
31
123
|
|
32
|
-
```ruby
|
124
|
+
``` ruby
|
33
125
|
get '/' do
|
34
126
|
.. 무언가 보여주기(show) ..
|
35
127
|
end
|
@@ -53,13 +145,21 @@ end
|
|
53
145
|
options '/' do
|
54
146
|
.. 무언가 주기(appease) ..
|
55
147
|
end
|
148
|
+
|
149
|
+
link '/' do
|
150
|
+
.. 무언가 관계맺기(affiliate) ..
|
151
|
+
end
|
152
|
+
|
153
|
+
unlink '/' do
|
154
|
+
.. 무언가 격리하기(separate) ..
|
155
|
+
end
|
56
156
|
```
|
57
157
|
|
58
|
-
라우터는 정의된 순서에 따라
|
158
|
+
라우터는 정의된 순서에 따라 매치되고 요청에 대해 가장 먼저 매칭된 라우터가 호출됩니다.
|
59
159
|
|
60
|
-
라우터 패턴에는 이름을 가진 매개변수가 포함될
|
160
|
+
라우터 패턴에는 이름을 가진 매개변수가 포함될 수 있으며, `params` 해시로 접근할 수 있습니다.
|
61
161
|
|
62
|
-
```ruby
|
162
|
+
``` ruby
|
63
163
|
get '/hello/:name' do
|
64
164
|
# "GET /hello/foo" 및 "GET /hello/bar"와 매치
|
65
165
|
# params[:name]은 'foo' 또는 'bar'
|
@@ -67,17 +167,19 @@ get '/hello/:name' do
|
|
67
167
|
end
|
68
168
|
```
|
69
169
|
|
70
|
-
또한 블록 매개변수를 통하여도 이름을 가진 매개변수에 접근할 수
|
170
|
+
또한 블록 매개변수를 통하여도 이름을 가진 매개변수에 접근할 수 있습니다.
|
71
171
|
|
72
|
-
```ruby
|
172
|
+
``` ruby
|
73
173
|
get '/hello/:name' do |n|
|
174
|
+
# "GET /hello/foo" 및 "GET /hello/bar"와 매치
|
175
|
+
# params[:name]은 'foo' 또는 'bar'
|
74
176
|
"Hello #{n}!"
|
75
177
|
end
|
76
178
|
```
|
77
179
|
|
78
|
-
라우터 패턴에는 스플랫(splat, 또는 와일드카드)도 포함될 수 있으며, 이럴 경우 `params[:splat]`
|
180
|
+
라우터 패턴에는 스플랫(splat, 또는 와일드카드)도 매개변수도 포함될 수 있으며, 이럴 경우 `params[:splat]` 배열을 통해 접근할 수 있습니다.
|
79
181
|
|
80
|
-
```ruby
|
182
|
+
``` ruby
|
81
183
|
get '/say/*/to/*' do
|
82
184
|
# /say/hello/to/world와 매치
|
83
185
|
params[:splat] # => ["hello", "world"]
|
@@ -89,46 +191,46 @@ get '/download/*.*' do
|
|
89
191
|
end
|
90
192
|
```
|
91
193
|
|
92
|
-
|
194
|
+
블록 매개변수로도 접근할 수 있습니다.
|
93
195
|
|
94
|
-
```ruby
|
196
|
+
``` ruby
|
95
197
|
get '/download/*.*' do |path, ext|
|
96
198
|
[path, ext] # => ["path/to/file", "xml"]
|
97
199
|
end
|
98
200
|
```
|
99
201
|
|
100
|
-
|
202
|
+
라우터는 정규표현식으로 매치할 수 있습니다.
|
101
203
|
|
102
|
-
```ruby
|
204
|
+
``` ruby
|
103
205
|
get %r{/hello/([\w]+)} do
|
104
206
|
"Hello, #{params[:captures].first}!"
|
105
207
|
end
|
106
208
|
```
|
107
209
|
|
108
|
-
|
210
|
+
블록 매개변수로도 사용가능합니다.
|
109
211
|
|
110
|
-
```ruby
|
212
|
+
``` ruby
|
111
213
|
get %r{/hello/([\w]+)} do |c|
|
112
214
|
"Hello, #{c}!"
|
113
215
|
end
|
114
216
|
```
|
115
217
|
|
116
|
-
라우터 패턴에는 선택적인(optional) 매개변수도 올 수
|
218
|
+
라우터 패턴에는 선택적인(optional) 매개변수도 올 수 있습니다.
|
117
219
|
|
118
|
-
```ruby
|
220
|
+
``` ruby
|
119
221
|
get '/posts.?:format?' do
|
120
|
-
# "GET /posts"
|
222
|
+
# "GET /posts" 는 물론 "GET /posts.json", "GET /posts.xml" 와 같은 어떤 확장자와도 매칭
|
121
223
|
end
|
122
224
|
```
|
123
225
|
|
124
226
|
한편, 경로 탐색 공격 방지(path traversal attack protection, 아래 참조)를 비활성화시키지 않았다면,
|
125
|
-
요청 경로는 라우터와 매칭되기 이전에 수정될 수
|
227
|
+
요청 경로는 라우터와 매칭되기 이전에 수정될 수 있습니다.
|
126
228
|
|
127
229
|
### 조건(Conditions)
|
128
230
|
|
129
|
-
라우터는
|
231
|
+
라우터는 사용자 에이전트(user agent)같은 다양한 매칭 조건을 포함할 수 있습니다.
|
130
232
|
|
131
|
-
```ruby
|
233
|
+
``` ruby
|
132
234
|
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
|
133
235
|
"Songbird 버전 #{params[:agent][0]}을 사용하는군요!"
|
134
236
|
end
|
@@ -138,9 +240,9 @@ get '/foo' do
|
|
138
240
|
end
|
139
241
|
```
|
140
242
|
|
141
|
-
|
243
|
+
다른 가능한 조건에는 `host_name`과 `provides`가 있습니다.
|
142
244
|
|
143
|
-
```ruby
|
245
|
+
``` ruby
|
144
246
|
get '/', :host_name => /^admin\./ do
|
145
247
|
"Admin Area, Access denied!"
|
146
248
|
end
|
@@ -154,9 +256,9 @@ get '/', :provides => ['rss', 'atom', 'xml'] do
|
|
154
256
|
end
|
155
257
|
```
|
156
258
|
|
157
|
-
|
259
|
+
사용자 정의 조건도 쉽게 만들 수 있습니다.
|
158
260
|
|
159
|
-
```ruby
|
261
|
+
``` ruby
|
160
262
|
set(:probability) { |value| condition { rand <= value } }
|
161
263
|
|
162
264
|
get '/win_a_car', :probability => 0.1 do
|
@@ -168,9 +270,9 @@ get '/win_a_car' do
|
|
168
270
|
end
|
169
271
|
```
|
170
272
|
|
171
|
-
여러 값을 받는 조건에는 스플랫(splat)을
|
273
|
+
여러 값을 받는 조건에는 스플랫(splat)을 사용합니다.
|
172
274
|
|
173
|
-
```ruby
|
275
|
+
``` ruby
|
174
276
|
set(:auth) do |*roles| # <- 이게 스플랫
|
175
277
|
condition do
|
176
278
|
unless logged_in? && roles.any? {|role| current_user.in_role? role }
|
@@ -190,19 +292,19 @@ end
|
|
190
292
|
|
191
293
|
### 반환값(Return Values)
|
192
294
|
|
193
|
-
라우터 블록의
|
194
|
-
대부분의
|
295
|
+
라우터 블록의 반환 값은 HTTP 클라이언트로 전달되는 응답 본문만을 결정하거나, 또는 Rack 스택에서 다음 번 미들웨어만를 결정합니다.
|
296
|
+
위의 예제에서 볼 수 있지만 대부분의 경우 이 반환값은 문자열입니다.하지만 다른 값도 허용됩니다.
|
195
297
|
|
196
|
-
유효한 Rack 응답, Rack 본문 객체 또는 HTTP 상태 코드가 되는 어떠한 객체라도 반환할 수
|
298
|
+
유효한 Rack 응답, Rack 본문 객체 또는 HTTP 상태 코드가 되는 어떠한 객체라도 반환할 수 있습니다.
|
197
299
|
|
198
300
|
* 세 요소를 가진 배열: `[상태 (Fixnum), 헤더 (Hash), 응답 본문 (#each에 반응)]`
|
199
301
|
* 두 요소를 가진 배열: `[상태 (Fixnum), 응답 본문 (#each에 반응)]`
|
200
302
|
* `#each`에 반응하고 주어진 블록으로 문자열만을 전달하는 객체
|
201
303
|
* 상태 코드를 의미하는 Fixnum
|
202
304
|
|
203
|
-
|
305
|
+
이것을 이용한 예를 들자면, 스트리밍(streaming) 예제를 쉽게 구현할 수 있습니다.
|
204
306
|
|
205
|
-
```ruby
|
307
|
+
``` ruby
|
206
308
|
class Stream
|
207
309
|
def each
|
208
310
|
100.times { |i| yield "#{i}\n" }
|
@@ -212,14 +314,14 @@ end
|
|
212
314
|
get('/') { Stream.new }
|
213
315
|
```
|
214
316
|
|
215
|
-
|
317
|
+
`stream` 헬퍼 메서드(아래 참조)를 사용하면 이런 번거로움을 줄이고 스트리밍 로직을 라우터 속에 포함 시킬 수도 있습니다.
|
216
318
|
|
217
319
|
### 커스텀 라우터 매처(Custom Route Matchers)
|
218
320
|
|
219
|
-
위에서 보듯, Sinatra에는 문자열 패턴 및 정규표현식을 이용한 라우터 매칭 지원이 내장되어
|
220
|
-
|
321
|
+
위에서 보듯, Sinatra에는 문자열 패턴 및 정규표현식을 이용한 라우터 매칭 지원이 내장되어 있습니다.
|
322
|
+
하지만, 그게 끝은 아닙니다. 여러분 만의 매처(matcher)도 쉽게 정의할 수 있습니다.
|
221
323
|
|
222
|
-
```ruby
|
324
|
+
``` ruby
|
223
325
|
class AllButPattern
|
224
326
|
Match = Struct.new(:captures)
|
225
327
|
|
@@ -242,18 +344,18 @@ get all_but("/index") do
|
|
242
344
|
end
|
243
345
|
```
|
244
346
|
|
245
|
-
사실 위의 예제는 조금 과하게 작성된 면이
|
347
|
+
사실 위의 예제는 조금 과하게 작성된 면이 있습니다. 간단하게 표현할 수도 있어요.
|
246
348
|
|
247
|
-
```ruby
|
349
|
+
``` ruby
|
248
350
|
get // do
|
249
351
|
pass if request.path_info == "/index"
|
250
352
|
# ...
|
251
353
|
end
|
252
354
|
```
|
253
355
|
|
254
|
-
또는
|
356
|
+
또는 거꾸로 탐색(negative look ahead)할 수도 있습니다.
|
255
357
|
|
256
|
-
```ruby
|
358
|
+
``` ruby
|
257
359
|
get %r{^(?!/index$)} do
|
258
360
|
# ...
|
259
361
|
end
|
@@ -261,62 +363,62 @@ end
|
|
261
363
|
|
262
364
|
## 정적 파일(Static Files)
|
263
365
|
|
264
|
-
정적 파일들은 `./public
|
265
|
-
|
366
|
+
정적 파일들은 `./public` 디렉터리에서 제공됩니다. 위치를 다른 곳으로
|
367
|
+
변경하려면 `:public_folder` 옵션을 지정하면 됩니다.
|
266
368
|
|
267
|
-
```ruby
|
369
|
+
``` ruby
|
268
370
|
set :public_folder, File.dirname(__FILE__) + '/static'
|
269
371
|
```
|
270
372
|
|
271
|
-
|
272
|
-
`./public/css/style.css` 파일은 `http://example.com/css/style.css` 로 접근할 수
|
373
|
+
public 디렉터리명은 URL에 포함되지 않는다는 점에 주의하세요.
|
374
|
+
`./public/css/style.css` 파일은 아마 `http://example.com/css/style.css` 로 접근할 수 있을 것 입니다.
|
273
375
|
|
274
|
-
`Cache-Control` 헤더 정보를 추가하려면 `:static_cache_control` 설정(아래 참조)을 사용하면
|
376
|
+
`Cache-Control` 헤더 정보를 추가하려면 `:static_cache_control` 설정(아래 참조)을 사용하면 됩니다.
|
275
377
|
|
276
378
|
## 뷰 / 템플릿(Views / Templates)
|
277
379
|
|
278
|
-
|
279
|
-
이들 메서드는
|
380
|
+
템플릿 언어들은 각각의 렌더링 메서드를 통해 표출됩니다.
|
381
|
+
이들 메서드는 문자열을 반환할 뿐입니다.
|
280
382
|
|
281
|
-
```ruby
|
383
|
+
``` ruby
|
282
384
|
get '/' do
|
283
385
|
erb :index
|
284
386
|
end
|
285
387
|
```
|
286
388
|
|
287
|
-
이
|
389
|
+
이 구문은 `views/index.erb`를 렌더합니다.
|
288
390
|
|
289
|
-
템플릿 이름 대신 템플릿의 내용을 직접
|
391
|
+
템플릿 이름 대신 템플릿의 내용을 직접 넘길 수도 있습니다.
|
290
392
|
|
291
|
-
```ruby
|
393
|
+
``` ruby
|
292
394
|
get '/' do
|
293
395
|
code = "<%= Time.now %>"
|
294
396
|
erb code
|
295
397
|
end
|
296
398
|
```
|
297
399
|
|
298
|
-
템플릿은 두 번째 인자로 옵션값의 해시를
|
400
|
+
템플릿은 두 번째 인자로 옵션값의 해시를 받습니다.
|
299
401
|
|
300
|
-
```ruby
|
402
|
+
``` ruby
|
301
403
|
get '/' do
|
302
404
|
erb :index, :layout => :post
|
303
405
|
end
|
304
406
|
```
|
305
407
|
|
306
|
-
|
307
|
-
(
|
408
|
+
이 구문은 `views/post.erb` 속에 내장된 `views/index.erb`를 렌더합니다.
|
409
|
+
(`views/layout.erb`파일이 존재할 경우 기본값은 `views/layout.erb`입니다.)
|
308
410
|
|
309
|
-
Sinatra가 이해하지 못하는 모든 옵션값들은 템플릿 엔진으로
|
411
|
+
Sinatra가 이해하지 못하는 모든 옵션값들은 템플릿 엔진으로 전달됩니다.
|
310
412
|
|
311
|
-
```ruby
|
413
|
+
``` ruby
|
312
414
|
get '/' do
|
313
415
|
haml :index, :format => :html5
|
314
416
|
end
|
315
417
|
```
|
316
418
|
|
317
|
-
옵션값은 템플릿 언어별로
|
419
|
+
옵션값은 템플릿 언어별로 전역적으로 설정할 수도 있습니다.
|
318
420
|
|
319
|
-
```ruby
|
421
|
+
``` ruby
|
320
422
|
set :haml, :format => :html5
|
321
423
|
|
322
424
|
get '/' do
|
@@ -324,215 +426,241 @@ get '/' do
|
|
324
426
|
end
|
325
427
|
```
|
326
428
|
|
327
|
-
render 메서드에서 전달된 옵션값들은 `set`을 통해 설정한
|
429
|
+
render 메서드에서 전달된 옵션값들은 `set`을 통해 설정한 옵션값보다 우선합니다.
|
328
430
|
|
329
|
-
가능한
|
431
|
+
가능한 옵션값들은 다음과 같습니다.
|
330
432
|
|
331
433
|
<dl>
|
332
434
|
<dt>locals</dt>
|
333
|
-
<dd
|
334
|
-
|
435
|
+
<dd>
|
436
|
+
문서로 전달되는 local 목록. 파셜과 함께 사용하기 좋음.
|
437
|
+
예제: <tt>erb "<%= foo %>", :locals => {:foo => "bar"}</tt>
|
335
438
|
</dd>
|
336
439
|
|
337
440
|
<dt>default_encoding</dt>
|
338
|
-
<dd
|
441
|
+
<dd>
|
442
|
+
불확실한 경우에 사용할 문자열 인코딩.
|
443
|
+
기본값은 <tt>settings.default_encoding</tt>.
|
444
|
+
</dd>
|
339
445
|
|
340
446
|
<dt>views</dt>
|
341
|
-
<dd
|
447
|
+
<dd>
|
448
|
+
템플릿을 로드할 뷰 폴더.
|
449
|
+
기본값은 <tt>settings.views</tt>.
|
450
|
+
</dd>
|
342
451
|
|
343
452
|
<dt>layout</dt>
|
344
|
-
<dd
|
345
|
-
|
453
|
+
<dd>
|
454
|
+
레이아웃을 사용할지 여부 (<tt>true</tt> 또는 <tt>false</tt>), 만약 이 값이 심볼일 경우,
|
455
|
+
사용할 템플릿을 지정. 예제: <tt>erb :index, :layout => !request.xhr?</tt>
|
346
456
|
</dd>
|
347
457
|
|
348
458
|
<dt>content_type</dt>
|
349
|
-
<dd
|
459
|
+
<dd>
|
460
|
+
템플릿이 생성하는 Content-Type, 기본값은 템플릿 언어에 의존.
|
461
|
+
</dd>
|
350
462
|
|
351
463
|
<dt>scope</dt>
|
352
|
-
<dd
|
353
|
-
|
464
|
+
<dd>
|
465
|
+
템플릿을 렌더링하는 범위. 기본값은 어플리케이션 인스턴스.
|
466
|
+
만약 이 값을 변경하면, 인스턴스 변수와 헬퍼 메서드들을 사용할 수 없게 됨.
|
467
|
+
</dd>
|
354
468
|
|
355
469
|
<dt>layout_engine</dt>
|
356
470
|
<dd>
|
357
|
-
레이아웃 렌더링에 사용할 템플릿 엔진. 레이아웃을 지원하지 않는 언어인 경우에 유용.
|
358
|
-
기본값은 템플릿에서 사용하는 엔진. 예제: <tt>set :rdoc, :layout_engine => :erb</tt>
|
471
|
+
레이아웃 렌더링에 사용할 템플릿 엔진. 레이아웃을 지원하지 않는 언어인 경우에 유용.
|
472
|
+
기본값은 템플릿에서 사용하는 엔진. 예제: <tt>set :rdoc, :layout_engine => :erb</tt>
|
359
473
|
</dd>
|
360
474
|
</dl>
|
361
475
|
|
362
476
|
|
363
|
-
템플릿은 `./views`
|
477
|
+
템플릿은 `./views` 디렉터리에 있는 것으로 가정됩니다. 뷰 디렉터리를
|
478
|
+
다른 곳으로 하고 싶으시면 이렇게 하세요.
|
364
479
|
|
365
|
-
```ruby
|
480
|
+
``` ruby
|
366
481
|
set :views, settings.root + '/templates'
|
367
482
|
```
|
368
483
|
|
369
|
-
|
370
|
-
템플릿이 하위 디렉터리에 위치한
|
371
|
-
반드시 심볼이어야 하는 이유는,
|
484
|
+
템플릿은 언제나 심볼로 참조되어야 한다는 것에 주의하세요.
|
485
|
+
템플릿이 하위 디렉터리에 위치한 경우(그럴 경우에는 `:'subdir/template'`을
|
486
|
+
사용)에도 예외는 없습니다. 반드시 심볼이어야 하는 이유는, 문자열을 넘기면
|
487
|
+
렌더링 메서드가 전달된 문자열을 직접 렌더하기 때문입니다.
|
488
|
+
|
489
|
+
### 리터럴 템플릿(Literal Templates)
|
490
|
+
|
491
|
+
``` ruby
|
492
|
+
get '/' do
|
493
|
+
haml '%div.title Hello World'
|
494
|
+
end
|
495
|
+
```
|
496
|
+
|
497
|
+
템플릿 문자열을 렌더합니다.
|
372
498
|
|
373
499
|
### 가능한 템플릿 언어들(Available Template Languages)
|
374
500
|
|
375
|
-
일부 언어는 여러 개의 구현이
|
376
|
-
먼저 require
|
501
|
+
일부 언어는 여러 개의 구현이 있습니다. (스레드에 안전하게 thread-safe) 어느 구현을
|
502
|
+
사용할지 저정하려면, 먼저 require 하기만 하면 됩니다.
|
377
503
|
|
378
|
-
```ruby
|
504
|
+
``` ruby
|
379
505
|
require 'rdiscount' # or require 'bluecloth'
|
380
506
|
get('/') { markdown :index }
|
381
507
|
```
|
382
508
|
|
383
|
-
|
509
|
+
#### Haml 템플릿
|
384
510
|
|
385
511
|
<table>
|
386
512
|
<tr>
|
387
|
-
<td
|
388
|
-
<td><a href="http://haml.info/">haml</a></td>
|
513
|
+
<td>의존성</td>
|
514
|
+
<td><a href="http://haml.info/">haml</a></td>
|
389
515
|
</tr>
|
390
516
|
<tr>
|
391
|
-
<td>파일 확장자</td>
|
392
|
-
<td><tt>.haml</tt></td>
|
517
|
+
<td>파일 확장자</td>
|
518
|
+
<td><tt>.haml</tt></td>
|
393
519
|
</tr>
|
394
520
|
<tr>
|
395
|
-
<td
|
396
|
-
<td><tt>haml :index, :format => :html5</tt></td>
|
521
|
+
<td>예제</td>
|
522
|
+
<td><tt>haml :index, :format => :html5</tt></td>
|
397
523
|
</tr>
|
398
524
|
</table>
|
399
525
|
|
400
|
-
|
526
|
+
#### Erb 템플릿
|
401
527
|
|
402
528
|
<table>
|
403
529
|
<tr>
|
404
|
-
<td
|
405
|
-
<td><a href="http://www.kuwata-lab.com/erubis/">erubis</a> 또는 erb (루비 속에 포함)</td>
|
530
|
+
<td>의존성</td>
|
531
|
+
<td><a href="http://www.kuwata-lab.com/erubis/">erubis</a> 또는 erb (루비 속에 포함)</td>
|
406
532
|
</tr>
|
407
533
|
<tr>
|
408
|
-
<td>파일 확장자</td>
|
409
|
-
<td><tt>.erb</tt>, <tt>.rhtml</tt
|
534
|
+
<td>파일 확장자</td>
|
535
|
+
<td><tt>.erb</tt>, <tt>.rhtml</tt>, <tt>.erubis</tt> (Erubis만 해당)</td>
|
410
536
|
</tr>
|
411
537
|
<tr>
|
412
|
-
<td>예제</td>
|
413
|
-
<td><tt>erb :index</tt></td>
|
538
|
+
<td>예제</td>
|
539
|
+
<td><tt>erb :index</tt></td>
|
414
540
|
</tr>
|
415
541
|
</table>
|
416
542
|
|
417
|
-
|
543
|
+
#### Builder 템플릿
|
418
544
|
|
419
545
|
<table>
|
420
546
|
<tr>
|
421
|
-
<td
|
422
|
-
<td><a href="http://builder.rubyforge.org/">builder</a></td>
|
547
|
+
<td>의존성</td>
|
548
|
+
<td><a href="http://builder.rubyforge.org/">builder</a></td>
|
423
549
|
</tr>
|
424
550
|
<tr>
|
425
|
-
<td>파일 확장자</td>
|
426
|
-
<td><tt>.builder</tt></td>
|
551
|
+
<td>파일 확장자</td>
|
552
|
+
<td><tt>.builder</tt></td>
|
427
553
|
</tr>
|
428
554
|
<tr>
|
429
|
-
<td
|
430
|
-
<td><tt>builder { |xml| xml.em "hi" }</tt></td>
|
555
|
+
<td>예제</td>
|
556
|
+
<td><tt>builder { |xml| xml.em "hi" }</tt></td>
|
431
557
|
</tr>
|
432
558
|
</table>
|
433
559
|
|
434
|
-
인라인 템플릿으로 블록을
|
560
|
+
인라인 템플릿으로 블록을 받을 수도 있습니다(예제 참조).
|
435
561
|
|
436
|
-
|
562
|
+
#### Nokogiri 템플릿
|
437
563
|
|
438
564
|
<table>
|
439
565
|
<tr>
|
440
|
-
<td
|
441
|
-
<td><a href="http://nokogiri.org/">nokogiri</a></td>
|
566
|
+
<td>의존성</td>
|
567
|
+
<td><a href="http://nokogiri.org/">nokogiri</a></td>
|
442
568
|
</tr>
|
443
569
|
<tr>
|
444
|
-
<td>파일 확장자</td>
|
445
|
-
<td><tt>.nokogiri</tt></td>
|
570
|
+
<td>파일 확장자</td>
|
571
|
+
<td><tt>.nokogiri</tt></td>
|
446
572
|
</tr>
|
447
573
|
<tr>
|
448
|
-
<td>예제</td>
|
449
|
-
<td><tt>nokogiri { |xml| xml.em "hi" }</tt></td>
|
574
|
+
<td>예제</td>
|
575
|
+
<td><tt>nokogiri { |xml| xml.em "hi" }</tt></td>
|
450
576
|
</tr>
|
451
577
|
</table>
|
452
578
|
|
453
|
-
인라인 템플릿으로 블록을
|
579
|
+
인라인 템플릿으로 블록을 받을 수도 있습니다(예제 참조).
|
454
580
|
|
455
|
-
|
581
|
+
#### Sass 템플릿
|
456
582
|
|
457
583
|
<table>
|
458
584
|
<tr>
|
459
|
-
<td
|
460
|
-
<td><a href="http://sass-lang.com/">sass</a></td>
|
585
|
+
<td>의존성</td>
|
586
|
+
<td><a href="http://sass-lang.com/">sass</a></td>
|
461
587
|
</tr>
|
462
588
|
<tr>
|
463
|
-
<td>파일 확장자</td>
|
464
|
-
<td><tt>.sass</tt></td>
|
589
|
+
<td>파일 확장자</td>
|
590
|
+
<td><tt>.sass</tt></td>
|
465
591
|
</tr>
|
466
592
|
<tr>
|
467
|
-
<td>예제</td>
|
468
|
-
<td><tt>sass :stylesheet, :style => :expanded</tt></td>
|
593
|
+
<td>예제</td>
|
594
|
+
<td><tt>sass :stylesheet, :style => :expanded</tt></td>
|
469
595
|
</tr>
|
470
596
|
</table>
|
471
597
|
|
472
|
-
|
598
|
+
#### SCSS 템플릿
|
473
599
|
|
474
600
|
<table>
|
475
601
|
<tr>
|
476
|
-
<td
|
477
|
-
<td><a href="http://sass-lang.com/">sass</a></td>
|
602
|
+
<td>의존성</td>
|
603
|
+
<td><a href="http://sass-lang.com/">sass</a></td>
|
478
604
|
</tr>
|
479
605
|
<tr>
|
480
|
-
<td>파일 확장자</td>
|
481
|
-
<td><tt>.scss</tt></td>
|
606
|
+
<td>파일 확장자</td>
|
607
|
+
<td><tt>.scss</tt></td>
|
482
608
|
</tr>
|
483
609
|
<tr>
|
484
|
-
<td>예제</td>
|
485
|
-
<td><tt>scss :stylesheet, :style => :expanded</tt></td>
|
610
|
+
<td>예제</td>
|
611
|
+
<td><tt>scss :stylesheet, :style => :expanded</tt></td>
|
486
612
|
</tr>
|
487
613
|
</table>
|
488
614
|
|
489
|
-
|
615
|
+
#### Less 템플릿
|
490
616
|
|
491
617
|
<table>
|
492
618
|
<tr>
|
493
|
-
<td
|
494
|
-
<td><a href="http://www.lesscss.org/">less</a></td>
|
619
|
+
<td>의존성</td>
|
620
|
+
<td><a href="http://www.lesscss.org/">less</a></td>
|
495
621
|
</tr>
|
496
622
|
<tr>
|
497
|
-
<td>파일 확장자</td>
|
498
|
-
<td><tt>.less</tt></td>
|
623
|
+
<td>파일 확장자</td>
|
624
|
+
<td><tt>.less</tt></td>
|
499
625
|
</tr>
|
500
626
|
<tr>
|
501
|
-
<td>예제</td>
|
502
|
-
<td><tt>less :stylesheet</tt></td>
|
627
|
+
<td>예제</td>
|
628
|
+
<td><tt>less :stylesheet</tt></td>
|
503
629
|
</tr>
|
504
630
|
</table>
|
505
631
|
|
506
|
-
|
632
|
+
#### Liquid 템플릿
|
507
633
|
|
508
634
|
<table>
|
509
635
|
<tr>
|
510
|
-
<td
|
511
|
-
<td><a href="http://www.liquidmarkup.org/">liquid</a></td>
|
636
|
+
<td>의존성</td>
|
637
|
+
<td><a href="http://www.liquidmarkup.org/">liquid</a></td>
|
512
638
|
</tr>
|
513
639
|
<tr>
|
514
|
-
<td>파일 확장자</td>
|
515
|
-
<td><tt>.liquid</tt></td>
|
640
|
+
<td>파일 확장자</td>
|
641
|
+
<td><tt>.liquid</tt></td>
|
516
642
|
</tr>
|
517
643
|
<tr>
|
518
|
-
<td>예제</td>
|
519
|
-
<td><tt>liquid :index, :locals => { :key => 'value' }</tt></td>
|
644
|
+
<td>예제</td>
|
645
|
+
<td><tt>liquid :index, :locals => { :key => 'value' }</tt></td>
|
520
646
|
</tr>
|
521
647
|
</table>
|
522
648
|
|
523
|
-
Liquid 템플릿에서는 루비 메서드(`yield` 제외)를 호출할 수 없기
|
649
|
+
Liquid 템플릿에서는 루비 메서드(`yield` 제외)를 호출할 수 없기
|
650
|
+
때문에, 거의 대부분의 경우 locals를 전달해야 합니다.
|
524
651
|
|
525
|
-
|
652
|
+
#### Markdown 템플릿
|
526
653
|
|
527
654
|
<table>
|
528
655
|
<tr>
|
529
|
-
<td
|
656
|
+
<td>의존성</td>
|
530
657
|
<td>
|
531
|
-
<a href="https://github.com/rtomayko/rdiscount">
|
532
|
-
<a href="https://github.com/vmg/redcarpet">
|
533
|
-
<a href="http://deveiate.org/projects/BlueCloth">
|
534
|
-
<a href="http://kramdown.rubyforge.org/">kramdown</a
|
535
|
-
<a href="http://maruku.rubyforge.org/">maruku</a>
|
658
|
+
<a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
|
659
|
+
<a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
|
660
|
+
<a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
|
661
|
+
<a href="http://kramdown.rubyforge.org/" title="kramdown">kramdown</a>,
|
662
|
+
<a href="http://maruku.rubyforge.org/" title="maruku">maruku</a>
|
663
|
+
중 아무거나
|
536
664
|
</td>
|
537
665
|
</tr>
|
538
666
|
<tr>
|
@@ -545,289 +673,386 @@ Liquid 템플릿에서는 루비 메서드(`yield` 제외)를 호출할 수 없
|
|
545
673
|
</tr>
|
546
674
|
</table>
|
547
675
|
|
548
|
-
|
549
|
-
따라서 일반적으로는 다른 렌더링 엔진과 함께 사용하게
|
676
|
+
Markdown에서는 메서드 호출 뿐 아니라 locals 전달도 안됩니다.
|
677
|
+
따라서 일반적으로는 다른 렌더링 엔진과 함께 사용하게 됩니다.
|
550
678
|
|
551
|
-
```ruby
|
679
|
+
``` ruby
|
552
680
|
erb :overview, :locals => { :text => markdown(:introduction) }
|
553
681
|
```
|
554
682
|
|
555
|
-
|
683
|
+
다른 템플릿 속에서 `markdown` 메서드를 호출할 수도 있습니다.
|
556
684
|
|
557
|
-
```ruby
|
685
|
+
``` ruby
|
558
686
|
%h1 안녕 Haml!
|
559
687
|
%p= markdown(:greetings)
|
560
688
|
```
|
561
689
|
|
562
|
-
Markdown에서 루비를 호출할 수 없기 때문에, Markdown으로 작성된 레이아웃은
|
563
|
-
|
690
|
+
Markdown에서 루비를 호출할 수 없기 때문에, Markdown으로 작성된 레이아웃은
|
691
|
+
사용할 수 없습니다. 하지만, `:layout_engine` 옵션으로 레이아웃의 템플릿을
|
692
|
+
다른 렌더링 엔진으로 렌더링 할 수는 있습니다.
|
564
693
|
|
565
|
-
|
694
|
+
#### Textile 템플릿
|
566
695
|
|
567
696
|
<table>
|
568
697
|
<tr>
|
569
|
-
<td
|
570
|
-
<td><a href="http://redcloth.org/">RedCloth</a></td>
|
698
|
+
<td>의존성</td>
|
699
|
+
<td><a href="http://redcloth.org/">RedCloth</a></td>
|
571
700
|
</tr>
|
572
701
|
<tr>
|
573
|
-
<td>파일 확장자</td>
|
574
|
-
<td><tt>.textile</tt></td>
|
702
|
+
<td>파일 확장자</td>
|
703
|
+
<td><tt>.textile</tt></td>
|
575
704
|
</tr>
|
576
705
|
<tr>
|
577
|
-
<td>예제</td>
|
578
|
-
<td><tt>textile :index, :layout_engine => :erb</tt></td>
|
706
|
+
<td>예제</td>
|
707
|
+
<td><tt>textile :index, :layout_engine => :erb</tt></td>
|
579
708
|
</tr>
|
580
709
|
</table>
|
581
710
|
|
582
|
-
Textile
|
583
|
-
따라서
|
711
|
+
Textile에서는 메서드 호출 뿐 아니라 locals 전달도 안됩니다.
|
712
|
+
따라서 일반적으로는 다른 렌더링 엔진과 함께 사용하게 됩니다.
|
584
713
|
|
585
|
-
```ruby
|
714
|
+
``` ruby
|
586
715
|
erb :overview, :locals => { :text => textile(:introduction) }
|
587
716
|
```
|
588
717
|
|
589
|
-
|
718
|
+
다른 템플릿 속에서 `textile` 메서드를 호출할 수도 있습니다.
|
590
719
|
|
591
|
-
```ruby
|
720
|
+
``` ruby
|
592
721
|
%h1 안녕 Haml!
|
593
722
|
%p= textile(:greetings)
|
594
723
|
```
|
595
724
|
|
596
|
-
Textile에서 루비를 호출할 수 없기 때문에, Textile
|
597
|
-
|
725
|
+
Textile에서 루비를 호출할 수 없기 때문에, Textile으로 작성된 레이아웃은
|
726
|
+
사용할 수 없습니다. 하지만, `:layout_engine` 옵션으로 레이아웃의 템플릿을
|
727
|
+
다른 렌더링 엔진으로 렌더링 할 수는 있습니다.
|
598
728
|
|
599
|
-
|
729
|
+
#### RDoc 템플릿
|
600
730
|
|
601
731
|
<table>
|
602
732
|
<tr>
|
603
|
-
<td
|
604
|
-
<td><a href="http://rdoc.rubyforge.org/">rdoc</a></td>
|
733
|
+
<td>의존성</td>
|
734
|
+
<td><a href="http://rdoc.rubyforge.org/">rdoc</a></td>
|
605
735
|
</tr>
|
606
736
|
<tr>
|
607
|
-
<td>파일 확장자</td>
|
608
|
-
<td><tt>.rdoc</tt></td>
|
737
|
+
<td>파일 확장자</td>
|
738
|
+
<td><tt>.rdoc</tt></td>
|
609
739
|
</tr>
|
610
740
|
<tr>
|
611
|
-
<td>예제</td>
|
612
|
-
<td><tt>rdoc :README, :layout_engine => :erb</tt></td>
|
741
|
+
<td>예제</td>
|
742
|
+
<td><tt>rdoc :README, :layout_engine => :erb</tt></td>
|
613
743
|
</tr>
|
614
744
|
</table>
|
615
745
|
|
616
|
-
|
617
|
-
따라서
|
746
|
+
RDoc에서는 메서드 호출 뿐 아니라 locals 전달도 안됩니다.
|
747
|
+
따라서 일반적으로는 다른 렌더링 엔진과 함께 사용하게 됩니다.
|
618
748
|
|
619
|
-
```ruby
|
749
|
+
``` ruby
|
620
750
|
erb :overview, :locals => { :text => rdoc(:introduction) }
|
621
751
|
```
|
622
752
|
|
623
|
-
|
753
|
+
다른 템플릿 속에서 `rdoc` 메서드를 호출할 수도 있습니다.
|
624
754
|
|
625
|
-
```ruby
|
755
|
+
``` ruby
|
626
756
|
%h1 Hello From Haml!
|
627
757
|
%p= rdoc(:greetings)
|
628
758
|
```
|
629
759
|
|
630
|
-
RDoc에서 루비를 호출할 수 없기 때문에, RDoc
|
631
|
-
|
632
|
-
|
760
|
+
RDoc에서 루비를 호출할 수 없기 때문에, RDoc으로 작성된 레이아웃은
|
761
|
+
사용할 수 없습니다. 하지만, `:layout_engine` 옵션으로 레이아웃의 템플릿을
|
762
|
+
다른 렌더링 엔진으로 렌더링 할 수는 있습니다.
|
763
|
+
|
764
|
+
#### Radius 템플릿
|
633
765
|
|
634
766
|
<table>
|
635
767
|
<tr>
|
636
|
-
<td
|
637
|
-
<td><a href="http://radius.rubyforge.org/">radius</a></td>
|
768
|
+
<td>의존성</td>
|
769
|
+
<td><a href="http://radius.rubyforge.org/">radius</a></td>
|
638
770
|
</tr>
|
639
771
|
<tr>
|
640
|
-
<td>파일 확장자</td>
|
641
|
-
<td><tt>.radius</tt></td>
|
772
|
+
<td>파일 확장자</td>
|
773
|
+
<td><tt>.radius</tt></td>
|
642
774
|
</tr>
|
643
775
|
<tr>
|
644
|
-
<td>예제</td>
|
645
|
-
<td><tt>radius :index, :locals => { :key => 'value' }</tt></td>
|
776
|
+
<td>예제</td>
|
777
|
+
<td><tt>radius :index, :locals => { :key => 'value' }</tt></td>
|
646
778
|
</tr>
|
647
779
|
</table>
|
648
780
|
|
649
|
-
Radius 템플릿에서는 루비 메서드를 호출할 수 없기
|
781
|
+
Radius 템플릿에서는 루비 메서드를 호출할 수 없기
|
782
|
+
때문에, 거의 대부분의 경우 locals를 전달해야 합니다.
|
650
783
|
|
651
|
-
|
784
|
+
#### Markaby 템플릿
|
652
785
|
|
653
786
|
<table>
|
654
787
|
<tr>
|
655
|
-
<td
|
656
|
-
<td><a href="http://markaby.github.com/">markaby</a></td>
|
788
|
+
<td>의존성</td>
|
789
|
+
<td><a href="http://markaby.github.com/">markaby</a></td>
|
657
790
|
</tr>
|
658
791
|
<tr>
|
659
|
-
<td>파일확장</td>
|
660
|
-
<td><tt>.mab</tt></td>
|
792
|
+
<td>파일확장</td>
|
793
|
+
<td><tt>.mab</tt></td>
|
661
794
|
</tr>
|
662
795
|
<tr>
|
663
|
-
<td>예제</td>
|
664
|
-
<td><tt>markaby { h1 "Welcome!" }</tt></td>
|
796
|
+
<td>예제</td>
|
797
|
+
<td><tt>markaby { h1 "Welcome!" }</tt></td>
|
665
798
|
</tr>
|
666
799
|
</table>
|
667
800
|
|
668
|
-
인라인 템플릿으로 블록을 받을 수도
|
801
|
+
인라인 템플릿으로 블록을 받을 수도 있습니다(예제 참조).
|
669
802
|
|
670
|
-
|
803
|
+
#### RABL 템플릿
|
671
804
|
|
672
805
|
<table>
|
673
806
|
<tr>
|
674
|
-
<td
|
675
|
-
<td><a href="https://github.com/nesquena/rabl">rabl</a></td>
|
807
|
+
<td>의존성</td>
|
808
|
+
<td><a href="https://github.com/nesquena/rabl">rabl</a></td>
|
676
809
|
</tr>
|
677
810
|
<tr>
|
678
|
-
<td>파일 확장자</td>
|
679
|
-
<td><tt>.rabl</tt></td>
|
811
|
+
<td>파일 확장자</td>
|
812
|
+
<td><tt>.rabl</tt></td>
|
680
813
|
</tr>
|
681
814
|
<tr>
|
682
|
-
<td>예제</td>
|
683
|
-
<td><tt>rabl :index</tt></td>
|
815
|
+
<td>예제</td>
|
816
|
+
<td><tt>rabl :index</tt></td>
|
684
817
|
</tr>
|
685
818
|
</table>
|
686
819
|
|
687
|
-
|
820
|
+
#### Slim 템플릿
|
688
821
|
|
689
822
|
<table>
|
690
823
|
<tr>
|
691
|
-
<td
|
692
|
-
<td><a href="http://slim-lang.com/">slim</a></td>
|
824
|
+
<td>의존성</td>
|
825
|
+
<td><a href="http://slim-lang.com/">slim</a></td>
|
693
826
|
</tr>
|
694
827
|
<tr>
|
695
|
-
<td>파일 확장자</td>
|
696
|
-
<td><tt>.slim</tt></td>
|
828
|
+
<td>파일 확장자</td>
|
829
|
+
<td><tt>.slim</tt></td>
|
697
830
|
</tr>
|
698
831
|
<tr>
|
699
|
-
<td>예제</td>
|
700
|
-
<td><tt>slim :index</tt></td>
|
832
|
+
<td>예제</td>
|
833
|
+
<td><tt>slim :index</tt></td>
|
701
834
|
</tr>
|
702
835
|
</table>
|
703
836
|
|
704
|
-
|
837
|
+
#### Creole 템플릿
|
705
838
|
|
706
839
|
<table>
|
707
840
|
<tr>
|
708
|
-
<td
|
709
|
-
<td><a href="https://github.com/minad/creole">creole</a></td>
|
841
|
+
<td>의존성</td>
|
842
|
+
<td><a href="https://github.com/minad/creole">creole</a></td>
|
710
843
|
</tr>
|
711
844
|
<tr>
|
712
|
-
<td>파일 확장자</td>
|
713
|
-
<td><tt>.creole</tt></td>
|
845
|
+
<td>파일 확장자</td>
|
846
|
+
<td><tt>.creole</tt></td>
|
714
847
|
</tr>
|
715
848
|
<tr>
|
716
|
-
<td>예제</td>
|
717
|
-
<td><tt>creole :wiki, :layout_engine => :erb</tt></td>
|
849
|
+
<td>예제</td>
|
850
|
+
<td><tt>creole :wiki, :layout_engine => :erb</tt></td>
|
718
851
|
</tr>
|
719
852
|
</table>
|
720
853
|
|
721
|
-
|
722
|
-
따라서 일반적으로는 다른 렌더링 엔진과 함께 사용하게
|
854
|
+
Creole에서는 메서드 호출 뿐 아니라 locals 전달도 안됩니다.
|
855
|
+
따라서 일반적으로는 다른 렌더링 엔진과 함께 사용하게 됩니다.
|
723
856
|
|
724
|
-
```ruby
|
857
|
+
``` ruby
|
725
858
|
erb :overview, :locals => { :text => creole(:introduction) }
|
726
859
|
```
|
727
860
|
|
728
|
-
|
861
|
+
다른 템플릿 속에서 `creole` 메서드를 호출할 수도 있습니다.
|
729
862
|
|
730
|
-
```ruby
|
863
|
+
``` ruby
|
731
864
|
%h1 Hello From Haml!
|
732
865
|
%p= creole(:greetings)
|
733
866
|
```
|
734
867
|
|
735
|
-
Creole에서 루비를 호출할 수 없기 때문에, Creole
|
736
|
-
|
868
|
+
Creole에서 루비를 호출할 수 없기 때문에, Creole으로 작성된 레이아웃은
|
869
|
+
사용할 수 없습니다. 하지만, `:layout_engine` 옵션으로 레이아웃의 템플릿을
|
870
|
+
다른 렌더링 엔진으로 렌더링 할 수는 있습니다.
|
737
871
|
|
738
|
-
|
872
|
+
#### CoffeeScript 템플릿
|
739
873
|
|
740
874
|
<table>
|
741
875
|
<tr>
|
742
|
-
<td>의존성</td>
|
743
|
-
<td
|
744
|
-
|
745
|
-
|
876
|
+
<td>의존성</td>
|
877
|
+
<td>
|
878
|
+
<a href="https://github.com/josh/ruby-coffee-script" title="Ruby CoffeeScript">
|
879
|
+
CoffeeScript
|
880
|
+
</a> 와
|
881
|
+
<a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
|
882
|
+
자바스크립트 실행법
|
883
|
+
</a>
|
884
|
+
</td>
|
746
885
|
</tr>
|
747
886
|
<tr>
|
748
|
-
<td>파일 확장자</td>
|
749
|
-
<td><tt>.coffee</tt></td>
|
887
|
+
<td>파일 확장자</td>
|
888
|
+
<td><tt>.coffee</tt></td>
|
750
889
|
</tr>
|
751
890
|
<tr>
|
752
|
-
<td>예제</td>
|
753
|
-
<td><tt>coffee :index</tt></td>
|
891
|
+
<td>예제</td>
|
892
|
+
<td><tt>coffee :index</tt></td>
|
754
893
|
</tr>
|
755
894
|
</table>
|
756
895
|
|
896
|
+
#### Stylus 템플릿
|
757
897
|
|
758
|
-
|
898
|
+
<table>
|
899
|
+
<tr>
|
900
|
+
<td>의존성</td>
|
901
|
+
<td>
|
902
|
+
<a href="https://github.com/lucasmazza/ruby-stylus" title="Ruby Stylus">
|
903
|
+
Stylus
|
904
|
+
</a> 와
|
905
|
+
<a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
|
906
|
+
자바스크립트 실행법
|
907
|
+
</a>
|
908
|
+
</td>
|
909
|
+
</tr>
|
910
|
+
<tr>
|
911
|
+
<td>파일 확장자</td>
|
912
|
+
<td><tt>.styl</tt></td>
|
913
|
+
</tr>
|
914
|
+
<tr>
|
915
|
+
<td>예제</td>
|
916
|
+
<td><tt>stylus :index</tt></td>
|
917
|
+
</tr>
|
918
|
+
</table>
|
919
|
+
|
920
|
+
Stylus 템플릿을 사용가능하게 하려면, 먼저 `stylus`와 `stylus/tilt`를 로드
|
921
|
+
해야합니다.
|
922
|
+
|
923
|
+
``` ruby
|
924
|
+
require 'sinatra'
|
925
|
+
require 'stylus'
|
926
|
+
require 'stylus/tilt'
|
927
|
+
|
928
|
+
get '/' do
|
929
|
+
stylus :example
|
930
|
+
end
|
931
|
+
```
|
932
|
+
|
933
|
+
#### Yajl 템플릿
|
759
934
|
|
760
935
|
<table>
|
761
936
|
<tr>
|
762
|
-
<td
|
763
|
-
<td><a href="https://github.com/brianmario/yajl-ruby">yajl-ruby</a></td>
|
937
|
+
<td>의존성</td>
|
938
|
+
<td><a href="https://github.com/brianmario/yajl-ruby">yajl-ruby</a></td>
|
764
939
|
</tr>
|
765
940
|
<tr>
|
766
|
-
<td>파일 확장자</td>
|
767
|
-
<td><tt>.yajl</tt></td>
|
941
|
+
<td>파일 확장자</td>
|
942
|
+
<td><tt>.yajl</tt></td>
|
768
943
|
</tr>
|
769
944
|
<tr>
|
770
|
-
<td>예제</td>
|
771
|
-
<td
|
945
|
+
<td>예제</td>
|
946
|
+
<td>
|
947
|
+
<tt>
|
948
|
+
yajl :index,
|
949
|
+
:locals => { :key => 'qux' },
|
950
|
+
:callback => 'present',
|
951
|
+
:variable => 'resource'
|
952
|
+
</tt>
|
953
|
+
</td>
|
772
954
|
</tr>
|
773
955
|
</table>
|
774
956
|
|
775
|
-
|
776
|
-
템플릿 소스는 루비 문자열로 평가(evaluate)되고, 결과인 json 변수는 #to_json으로 변환됨.
|
957
|
+
템플릿 소스는 루비 문자열로 평가(evaluate)되고, 결과인 json 변수는 `#to_json`으로 변환됩니다.
|
777
958
|
|
778
|
-
```ruby
|
959
|
+
``` ruby
|
779
960
|
json = { :foo => 'bar' }
|
780
961
|
json[:baz] = key
|
781
962
|
```
|
782
963
|
|
783
|
-
`:callback`과 `:variable` 옵션은 렌더된 객체를 꾸미는데(decorate) 사용할 수
|
964
|
+
`:callback`과 `:variable` 옵션은 렌더된 객체를 꾸미는데(decorate) 사용할 수 있습니다.
|
784
965
|
|
785
|
-
```
|
786
|
-
var resource = {"foo":"bar","baz":"qux"};
|
966
|
+
```javascript
|
967
|
+
var resource = {"foo":"bar","baz":"qux"};
|
968
|
+
present(resource);
|
787
969
|
```
|
788
970
|
|
789
|
-
|
971
|
+
#### WLang 템플릿
|
790
972
|
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
|
795
|
-
|
973
|
+
<table>
|
974
|
+
<tr>
|
975
|
+
<td>의존성</td>
|
976
|
+
<td><a href="https://github.com/blambeau/wlang/" title="WLang">WLang</a></td>
|
977
|
+
</tr>
|
978
|
+
<tr>
|
979
|
+
<td>파일 확장자</td>
|
980
|
+
<td><tt>.wlang</tt></td>
|
981
|
+
</tr>
|
982
|
+
<tr>
|
983
|
+
<td>예제</td>
|
984
|
+
<td><tt>wlang :index, :locals => { :key => 'value' }</tt></td>
|
985
|
+
</tr>
|
986
|
+
</table>
|
796
987
|
|
797
|
-
|
988
|
+
WLang 템플릿에서는 루비 메서드(`yield` 제외)를 호출할 수 없기
|
989
|
+
때문에, 거의 대부분의 경우 locals를 전달해야 합니다. 그래도
|
990
|
+
WLang으로 쓰여진 레이아웃과 `yield`는 지원합니다.
|
798
991
|
|
799
992
|
### 템플릿에서 변수에 접근하기
|
800
993
|
|
801
|
-
|
802
|
-
|
803
|
-
템플릿은 라우터 핸들러와 같은 맥락(context)에서 평가된다.
|
804
|
-
라우터 핸들러에서 설정한 인스턴스 변수들은 템플릿에서 접근 가능하다:
|
994
|
+
템플릿은 라우터 핸들러와 같은 맥락(context)에서 평가됩니다. 라우터
|
995
|
+
핸들러에서 설정한 인스턴스 변수들은 템플릿에서 직접 접근 가능합니다.
|
805
996
|
|
806
|
-
```ruby
|
997
|
+
``` ruby
|
807
998
|
get '/:id' do
|
808
999
|
@foo = Foo.find(params[:id])
|
809
1000
|
haml '%h1= @foo.name'
|
810
1001
|
end
|
811
1002
|
```
|
812
1003
|
|
813
|
-
|
1004
|
+
명시적으로 로컬 변수의 해시를 지정할 수도 있습니다.
|
814
1005
|
|
815
|
-
```ruby
|
1006
|
+
``` ruby
|
816
1007
|
get '/:id' do
|
817
1008
|
foo = Foo.find(params[:id])
|
818
1009
|
haml '%h1= bar.name', :locals => { :bar => foo }
|
819
1010
|
end
|
820
1011
|
```
|
821
1012
|
|
822
|
-
|
823
|
-
|
824
|
-
|
1013
|
+
이 방법은 주로 템플릿을 다른 템플릿 속에서 파셜(partial)로 렌더링할
|
1014
|
+
때 사용됩니다.
|
1015
|
+
|
1016
|
+
### 템플릿에서의 `yield` 와 중첩 레이아웃
|
1017
|
+
|
1018
|
+
레이아웃은 보통 `yield`만 호출하는 템플릿입니다.
|
1019
|
+
위에 설명된 `:template` 옵션을 통해 템플릿을 사용하거나,
|
1020
|
+
다음 예제처럼 블록으로 렌더링 할 수 있습니다.
|
1021
|
+
|
1022
|
+
``` ruby
|
1023
|
+
erb :post, :layout => false do
|
1024
|
+
erb :index
|
1025
|
+
end
|
1026
|
+
```
|
1027
|
+
|
1028
|
+
위 코드는 `erb :index, :layout => :post`와 대부분 동일합니다.
|
1029
|
+
|
1030
|
+
렌더링 메서드에 블록 넘기기는 중첩 레이아웃을 만들때 유용합니다.
|
1031
|
+
|
1032
|
+
``` ruby
|
1033
|
+
erb :main_layout, :layout => false do
|
1034
|
+
erb :admin_layout do
|
1035
|
+
erb :user
|
1036
|
+
end
|
1037
|
+
end
|
1038
|
+
```
|
1039
|
+
|
1040
|
+
위의 코드도 줄일 수 있습니다.
|
1041
|
+
|
1042
|
+
``` ruby
|
1043
|
+
erb :admin_layout, :layout => :main_layout do
|
1044
|
+
erb :user
|
1045
|
+
end
|
1046
|
+
```
|
1047
|
+
|
1048
|
+
현재, `erb`, `haml`, `liquid`, `slim `, `wlang`는 블럭을 지원합니다.
|
1049
|
+
일반적인 `render` 메소드도 블럭을 지원합니다.
|
825
1050
|
|
826
1051
|
### 인라인 템플릿
|
827
1052
|
|
828
|
-
템플릿은 소스 파일의 마지막에서 정의할 수도
|
1053
|
+
템플릿은 소스 파일의 마지막에서 정의할 수도 있습니다.
|
829
1054
|
|
830
|
-
```ruby
|
1055
|
+
``` ruby
|
831
1056
|
require 'sinatra'
|
832
1057
|
|
833
1058
|
get '/' do
|
@@ -844,14 +1069,15 @@ __END__
|
|
844
1069
|
%div.title Hello world.
|
845
1070
|
```
|
846
1071
|
|
847
|
-
참고:
|
848
|
-
다른 소스 파일에서 인라인 템플릿을 사용하려면 명시적으로
|
1072
|
+
참고: sinatra를 require한 소스 파일에 정의된 인라인 템플릿은 자동으로
|
1073
|
+
로드됩니다. 다른 소스 파일에서 인라인 템플릿을 사용하려면 명시적으로
|
1074
|
+
`enable :inline_templates`을 호출하면 됩니다.
|
849
1075
|
|
850
1076
|
### 이름을 가지는 템플릿(Named Templates)
|
851
1077
|
|
852
|
-
템플릿은 톱 레벨(top-level)에서 `template
|
1078
|
+
템플릿은 톱 레벨(top-level)에서 `template`메서드로도 정의할 수 있습니다.
|
853
1079
|
|
854
|
-
```ruby
|
1080
|
+
``` ruby
|
855
1081
|
template :layout do
|
856
1082
|
"%html\n =yield\n"
|
857
1083
|
end
|
@@ -865,11 +1091,12 @@ get '/' do
|
|
865
1091
|
end
|
866
1092
|
```
|
867
1093
|
|
868
|
-
"layout"이라는 이름의 템플릿이 존재하면,
|
869
|
-
|
870
|
-
|
1094
|
+
"layout"이라는 이름의 템플릿이 존재하면, 템플릿이 렌더될 때마다 사용됩니다.
|
1095
|
+
레이아웃을 비활성화할 때는 `:layout => false`를 전달하여 개별적으로
|
1096
|
+
비활성시키거나 `set :haml, :layout => false`으로 기본값을 비활성으로 둘 수
|
1097
|
+
있습니다.
|
871
1098
|
|
872
|
-
```ruby
|
1099
|
+
``` ruby
|
873
1100
|
get '/' do
|
874
1101
|
haml :index, :layout => !request.xhr?
|
875
1102
|
end
|
@@ -877,18 +1104,19 @@ end
|
|
877
1104
|
|
878
1105
|
### 파일 확장자 연결하기
|
879
1106
|
|
880
|
-
어떤 파일 확장자를 특정 템플릿 엔진과 연결하려면, `Tilt.register`를 사용하면
|
881
|
-
예를 들어, `tt`라는 파일 확장자를 Textile 템플릿과 연결하고 싶다면,
|
1107
|
+
어떤 파일 확장자를 특정 템플릿 엔진과 연결하려면, `Tilt.register`를 사용하면
|
1108
|
+
됩니다. 예를 들어, `tt`라는 파일 확장자를 Textile 템플릿과 연결하고 싶다면,
|
1109
|
+
다음과 같이 하면 됩니다.
|
882
1110
|
|
883
|
-
```ruby
|
1111
|
+
``` ruby
|
884
1112
|
Tilt.register :tt, Tilt[:textile]
|
885
1113
|
```
|
886
1114
|
|
887
1115
|
### 나만의 고유한 템플릿 엔진 추가하기
|
888
1116
|
|
889
|
-
우선, Tilt로 여러분 엔진을 등록하고,
|
1117
|
+
우선, Tilt로 여러분 엔진을 등록하고, 렌더링 메서드를 생성합니다.
|
890
1118
|
|
891
|
-
```ruby
|
1119
|
+
``` ruby
|
892
1120
|
Tilt.register :myat, MyAwesomeTemplateEngine
|
893
1121
|
|
894
1122
|
helpers do
|
@@ -900,15 +1128,16 @@ get '/' do
|
|
900
1128
|
end
|
901
1129
|
```
|
902
1130
|
|
903
|
-
`./views/index.myat` 를
|
904
|
-
Tilt에 대한 더 자세한 내용은 https://github.com/rtomayko/tilt
|
1131
|
+
위 코드는 `./views/index.myat` 를 렌더합니다.
|
1132
|
+
Tilt에 대한 더 자세한 내용은 https://github.com/rtomayko/tilt 참조하세요.
|
905
1133
|
|
906
1134
|
## 필터(Filters)
|
907
1135
|
|
908
|
-
사전 필터(before filter)는 라우터와 동일한 맥락에서 매 요청 전에 평가되며
|
909
|
-
필터에서 설정된 인스턴스 변수들은 라우터와
|
1136
|
+
사전 필터(before filter)는 라우터와 동일한 맥락에서 매 요청 전에 평가되며
|
1137
|
+
요청과 응답을 변형할 수 있습니다. 필터에서 설정된 인스턴스 변수들은 라우터와
|
1138
|
+
템플릿에서 접근 가능합니다.
|
910
1139
|
|
911
|
-
```ruby
|
1140
|
+
``` ruby
|
912
1141
|
before do
|
913
1142
|
@note = 'Hi!'
|
914
1143
|
request.path_info = '/foo/bar/baz'
|
@@ -920,20 +1149,24 @@ get '/foo/*' do
|
|
920
1149
|
end
|
921
1150
|
```
|
922
1151
|
|
923
|
-
사후 필터(after filter)는 라우터와 동일한 맥락에서 매 요청 이후에 평가되며
|
924
|
-
|
1152
|
+
사후 필터(after filter)는 라우터와 동일한 맥락에서 매 요청 이후에 평가되며
|
1153
|
+
마찬가지로 요청과 응답을 변형할 수 있습니다. 사전 필터와 라우터에서 설정된
|
1154
|
+
인스턴스 변수들은 사후 필터에서 접근 가능합니다.
|
925
1155
|
|
926
|
-
```ruby
|
1156
|
+
``` ruby
|
927
1157
|
after do
|
928
1158
|
puts response.status
|
929
1159
|
end
|
930
1160
|
```
|
931
1161
|
|
932
|
-
참고: 만약 라우터에서 `body` 메서드를 사용하지 않고 그냥 문자열만 반환한
|
1162
|
+
참고: 만약 라우터에서 `body` 메서드를 사용하지 않고 그냥 문자열만 반환한
|
1163
|
+
경우라면, body는 나중에 생성되는 탓에, 아직 사후 필터에서 사용할 수 없을
|
1164
|
+
것입니다.
|
933
1165
|
|
934
|
-
필터는
|
1166
|
+
필터는 패턴을 취할 수도 있으며, 이 경우 요청 경로가 그 패턴과 매치할
|
1167
|
+
경우에만 필터가 평가될 것입니다.
|
935
1168
|
|
936
|
-
```ruby
|
1169
|
+
``` ruby
|
937
1170
|
before '/protected/*' do
|
938
1171
|
authenticate!
|
939
1172
|
end
|
@@ -943,9 +1176,9 @@ after '/create/:slug' do |slug|
|
|
943
1176
|
end
|
944
1177
|
```
|
945
1178
|
|
946
|
-
라우터와 마찬가지로, 필터 역시 조건을
|
1179
|
+
라우터와 마찬가지로, 필터 역시 조건을 취할 수 있습니다.
|
947
1180
|
|
948
|
-
```ruby
|
1181
|
+
``` ruby
|
949
1182
|
before :agent => /Songbird/ do
|
950
1183
|
# ...
|
951
1184
|
end
|
@@ -957,9 +1190,10 @@ end
|
|
957
1190
|
|
958
1191
|
## 헬퍼(Helpers)
|
959
1192
|
|
960
|
-
톱-레벨의 `helpers` 메서드를 사용하여 라우터 핸들러와 템플릿에서 사용할 헬퍼
|
1193
|
+
톱-레벨의 `helpers` 메서드를 사용하여 라우터 핸들러와 템플릿에서 사용할 헬퍼
|
1194
|
+
메서드들을 정의할 수 있습니다.
|
961
1195
|
|
962
|
-
```ruby
|
1196
|
+
``` ruby
|
963
1197
|
helpers do
|
964
1198
|
def bar(name)
|
965
1199
|
"#{name}bar"
|
@@ -971,9 +1205,9 @@ get '/:name' do
|
|
971
1205
|
end
|
972
1206
|
```
|
973
1207
|
|
974
|
-
또는, 헬퍼 메서드는 별도의 모듈 속에 정의할 수도
|
1208
|
+
또는, 헬퍼 메서드는 별도의 모듈 속에 정의할 수도 있습니다.
|
975
1209
|
|
976
|
-
```ruby
|
1210
|
+
``` ruby
|
977
1211
|
module FooUtils
|
978
1212
|
def foo(name) "#{name}foo" end
|
979
1213
|
end
|
@@ -985,14 +1219,14 @@ end
|
|
985
1219
|
helpers FooUtils, BarUtils
|
986
1220
|
```
|
987
1221
|
|
988
|
-
이
|
1222
|
+
이 것은 모듈을 애플리케이션 클래스에 포함(include)시킨 것과 같습니다.
|
989
1223
|
|
990
1224
|
### 세션(Sessions) 사용하기
|
991
1225
|
|
992
|
-
세션은 요청 동안에 상태를 유지하기 위해
|
993
|
-
세션이 활성화되면, 사용자 세션 당
|
1226
|
+
세션은 요청 동안에 상태를 유지하기 위해 사용합니다.
|
1227
|
+
세션이 활성화되면, 사용자 세션 당 세션 해시 하나씩을 갖게 됩니다.
|
994
1228
|
|
995
|
-
```ruby
|
1229
|
+
``` ruby
|
996
1230
|
enable :sessions
|
997
1231
|
|
998
1232
|
get '/' do
|
@@ -1004,13 +1238,14 @@ get '/:value' do
|
|
1004
1238
|
end
|
1005
1239
|
```
|
1006
1240
|
|
1007
|
-
`enable :sessions`은 실은 모든 데이터를 쿠키 속에
|
1008
|
-
|
1009
|
-
|
1010
|
-
|
1011
|
-
|
1241
|
+
`enable :sessions`은 실은 모든 데이터를 쿠키 속에 저장하는 것에 주의하세요.
|
1242
|
+
이 방식이 바람직하지 않을 수도 있습니다. (예를 들어, 많은 양의 데이터를
|
1243
|
+
저장하게 되면 트래픽이 늘어납니다).
|
1244
|
+
이런 경우에는 랙 세션 미들웨어(Rack session middleware)를 사용할 수 있습니다.
|
1245
|
+
`enable :sessions`을 호출하지 **않는** 대신에, 선택한 미들웨어를 다른
|
1246
|
+
미들웨어들처럼 포함시키면 됩니다.
|
1012
1247
|
|
1013
|
-
```ruby
|
1248
|
+
``` ruby
|
1014
1249
|
use Rack::Session::Pool, :expire_after => 2592000
|
1015
1250
|
|
1016
1251
|
get '/' do
|
@@ -1022,64 +1257,72 @@ get '/:value' do
|
|
1022
1257
|
end
|
1023
1258
|
```
|
1024
1259
|
|
1025
|
-
|
1026
|
-
Sinatra는
|
1027
|
-
|
1028
|
-
|
1260
|
+
보안 강화을 위해서, 쿠키 속의 세션 데이터는 세션 시크릿(secret)으로
|
1261
|
+
사인(sign)됩니다. Sinatra는 무작위 시크릿을 생성합니다. 하지만, 이
|
1262
|
+
시크릿은 애플리케이션 시작 시마다 변경되기 때문에, 애플리케이션의
|
1263
|
+
모든 인스턴스들이 공유할 시크릿을 직접 만들 수도 있습니다.
|
1029
1264
|
|
1030
|
-
```ruby
|
1265
|
+
``` ruby
|
1031
1266
|
set :session_secret, 'super secret'
|
1032
1267
|
```
|
1033
1268
|
|
1034
|
-
조금 더 세부적인 설정이 필요하다면, `sessions` 설정에서 옵션이 있는
|
1269
|
+
조금 더 세부적인 설정이 필요하다면, `sessions` 설정에서 옵션이 있는
|
1270
|
+
해시를 저장할 수도 있습니다.
|
1035
1271
|
|
1036
|
-
```ruby
|
1272
|
+
``` ruby
|
1037
1273
|
set :sessions, :domain => 'foo.com'
|
1038
1274
|
```
|
1039
1275
|
|
1276
|
+
세션을 다른 foo.com의 서브도메인 들과 공유하기 원한다면, 다음에 나오는
|
1277
|
+
것 처럼 도메인 앞에 *.*을 붙이셔야 합니다.
|
1278
|
+
|
1279
|
+
``` ruby
|
1280
|
+
set :sessions, :domain => '.foo.com'
|
1281
|
+
```
|
1282
|
+
|
1040
1283
|
### 중단하기(Halting)
|
1041
1284
|
|
1042
|
-
필터나 라우터에서 요청을 즉각 중단하고 싶을 때
|
1285
|
+
필터나 라우터에서 요청을 즉각 중단하고 싶을 때 사용하합니다.
|
1043
1286
|
|
1044
|
-
```ruby
|
1287
|
+
``` ruby
|
1045
1288
|
halt
|
1046
1289
|
```
|
1047
1290
|
|
1048
|
-
중단할 때 상태를 지정할 수도
|
1291
|
+
중단할 때 상태를 지정할 수도 있습니다.
|
1049
1292
|
|
1050
|
-
```ruby
|
1293
|
+
``` ruby
|
1051
1294
|
halt 410
|
1052
1295
|
```
|
1053
1296
|
|
1054
|
-
|
1297
|
+
본문을 넣을 수도 있습니다.
|
1055
1298
|
|
1056
|
-
```ruby
|
1299
|
+
``` ruby
|
1057
1300
|
halt 'this will be the body'
|
1058
1301
|
```
|
1059
1302
|
|
1060
|
-
|
1303
|
+
둘 다 할 수도 있습니다.
|
1061
1304
|
|
1062
|
-
```ruby
|
1305
|
+
``` ruby
|
1063
1306
|
halt 401, 'go away!'
|
1064
1307
|
```
|
1065
1308
|
|
1066
|
-
헤더를 추가할 경우에는 다음과 같이 하면
|
1309
|
+
헤더를 추가할 경우에는 다음과 같이 하면 됩니다.
|
1067
1310
|
|
1068
|
-
```ruby
|
1311
|
+
``` ruby
|
1069
1312
|
halt 402, {'Content-Type' => 'text/plain'}, 'revenge'
|
1070
1313
|
```
|
1071
1314
|
|
1072
|
-
|
1315
|
+
당연히 `halt`와 템플릿은 같이 사용할 수 있습니다.
|
1073
1316
|
|
1074
|
-
```ruby
|
1317
|
+
``` ruby
|
1075
1318
|
halt erb(:error)
|
1076
1319
|
```
|
1077
1320
|
|
1078
1321
|
### 넘기기(Passing)
|
1079
1322
|
|
1080
|
-
라우터는 `pass`를 사용하여 다음 번 매칭되는 라우터로 처리를 넘길 수
|
1323
|
+
라우터는 `pass`를 사용하여 다음 번 매칭되는 라우터로 처리를 넘길 수 있습니다.
|
1081
1324
|
|
1082
|
-
```ruby
|
1325
|
+
``` ruby
|
1083
1326
|
get '/guess/:who' do
|
1084
1327
|
pass unless params[:who] == 'Frank'
|
1085
1328
|
'You got me!'
|
@@ -1090,15 +1333,15 @@ get '/guess/*' do
|
|
1090
1333
|
end
|
1091
1334
|
```
|
1092
1335
|
|
1093
|
-
이
|
1094
|
-
만약 매칭되는 라우터를 찾지 못하면, 404가
|
1336
|
+
이 때 라우터 블록에서 즉각 빠져나오게 되고 제어는 다음 번 매칭되는 라우터로
|
1337
|
+
넘어갑니다. 만약 매칭되는 라우터를 찾지 못하면, 404가 반환됩니다.
|
1095
1338
|
|
1096
1339
|
### 다른 라우터 부르기(Triggering Another Route)
|
1097
1340
|
|
1098
|
-
|
1099
|
-
|
1341
|
+
때로는 `pass`가 아니라, 다른 라우터를 호출한 결과를 얻고 싶을 때도
|
1342
|
+
있습니다. 이럴때는 간단하게 `call`을 사용하면 됩니다.
|
1100
1343
|
|
1101
|
-
```ruby
|
1344
|
+
``` ruby
|
1102
1345
|
get '/foo' do
|
1103
1346
|
status, headers, body = call env.merge("PATH_INFO" => '/bar')
|
1104
1347
|
[status, headers, body.map(&:upcase)]
|
@@ -1109,21 +1352,22 @@ get '/bar' do
|
|
1109
1352
|
end
|
1110
1353
|
```
|
1111
1354
|
|
1112
|
-
위 예제의 경우, `"bar"`를 헬퍼로 옮겨 `/foo`와 `/bar` 모두에서 사용하도록
|
1113
|
-
테스팅을 쉽게 하고 성능을 높일 수
|
1355
|
+
위 예제의 경우, `"bar"`를 헬퍼로 옮겨 `/foo`와 `/bar` 모두에서 사용하도록
|
1356
|
+
하면 테스팅을 쉽게 하고 성능을 높일 수 있습니다.
|
1114
1357
|
|
1115
|
-
|
1116
|
-
`call` 대신 `call!`을 사용하면
|
1358
|
+
요청의 사본이 아닌 바로 그 인스턴스로 보내지도록 하고 싶다면,
|
1359
|
+
`call` 대신 `call!`을 사용하면 됩니다.
|
1117
1360
|
|
1118
|
-
`call`에 대한 더 자세한 내용은 Rack 명세를
|
1361
|
+
`call`에 대한 더 자세한 내용은 Rack 명세를 참고하세요.
|
1119
1362
|
|
1120
1363
|
### 본문, 상태 코드 및 헤더 설정하기
|
1121
1364
|
|
1122
|
-
라우터 블록의 반환값과 함께 상태 코드(status code)와 응답 본문(response body)을
|
1123
|
-
|
1124
|
-
|
1365
|
+
라우터 블록의 반환값과 함께 상태 코드(status code)와 응답 본문(response body)을
|
1366
|
+
설정할수 있고 권장됩니다. 하지만, 경우에 따라서는 본문을 실행 흐름 중의 임의
|
1367
|
+
지점에서 설정해야 할때도 있습니다. 이런 경우 `body` 헬퍼 메서드를 사용하면
|
1368
|
+
됩니다. 이렇게 하면, 그 순간부터 본문에 접근할 때 그 메서드를 사용할 수가 있습니다.
|
1125
1369
|
|
1126
|
-
```ruby
|
1370
|
+
``` ruby
|
1127
1371
|
get '/foo' do
|
1128
1372
|
body "bar"
|
1129
1373
|
end
|
@@ -1133,12 +1377,13 @@ after do
|
|
1133
1377
|
end
|
1134
1378
|
```
|
1135
1379
|
|
1136
|
-
`body`로 블록을 전달하는 것도 가능하며, 이 블록은 랙(Rack) 핸들러에 의해
|
1137
|
-
(이 방법은 스트리밍을 구현할 때 사용할 수
|
1380
|
+
`body`로 블록을 전달하는 것도 가능하며, 이 블록은 랙(Rack) 핸들러에 의해
|
1381
|
+
실행됩니다. (이 방법은 스트리밍을 구현할 때 사용할 수 있습니다. "값
|
1382
|
+
반환하기"를 참고하세요).
|
1138
1383
|
|
1139
|
-
본문와 마찬가지로, 상태코드와 헤더도 설정할 수
|
1384
|
+
본문와 마찬가지로, 상태코드와 헤더도 설정할 수 있습니다.
|
1140
1385
|
|
1141
|
-
```ruby
|
1386
|
+
``` ruby
|
1142
1387
|
get '/foo' do
|
1143
1388
|
status 418
|
1144
1389
|
headers \
|
@@ -1148,104 +1393,123 @@ get '/foo' do
|
|
1148
1393
|
end
|
1149
1394
|
```
|
1150
1395
|
|
1151
|
-
`body`처럼, `header`와 `status`도 매개변수 없이 사용하여
|
1396
|
+
`body`처럼, `header`와 `status`도 매개변수 없이 사용하여 현재 값을
|
1397
|
+
액세스할 수 있습니다.
|
1152
1398
|
|
1153
1399
|
### 응답 스트리밍(Streaming Responses)
|
1154
1400
|
|
1155
|
-
응답 본문의 일정 부분을 계속 생성하는 가운데 데이터를 내보내기 시작하고
|
1156
|
-
극단적인 예제로, 클라이언트가 접속을 끊기 전까지
|
1157
|
-
여러분만의 래퍼(wrapper)를
|
1401
|
+
응답 본문의 일정 부분을 계속 생성하는 가운데 데이터를 내보내기 시작하고
|
1402
|
+
싶을 경우가 있습니다. 극단적인 예제로, 클라이언트가 접속을 끊기 전까지
|
1403
|
+
계속 데이터를 내보내고 싶을 경우도 있죠. 여러분만의 래퍼(wrapper)를
|
1404
|
+
만들지 않으려면 `stream` 헬퍼를 사용하면 됩니다.
|
1158
1405
|
|
1159
|
-
```ruby
|
1406
|
+
``` ruby
|
1160
1407
|
get '/' do
|
1161
1408
|
stream do |out|
|
1162
|
-
out << "It's gonna be legen -\n"
|
1163
|
-
sleep 0.5
|
1164
|
-
out << " (wait for it) \n"
|
1165
|
-
sleep 1
|
1166
|
-
out << "- dary!\n"
|
1409
|
+
out << "It's gonna be legen -\n"
|
1410
|
+
sleep 0.5
|
1411
|
+
out << " (wait for it) \n"
|
1412
|
+
sleep 1
|
1413
|
+
out << "- dary!\n"
|
1167
1414
|
end
|
1168
1415
|
end
|
1169
1416
|
```
|
1170
1417
|
|
1171
|
-
이렇게
|
1172
|
-
|
1173
|
-
[WebSockets](http://en.wikipedia.org/wiki/WebSocket)을 위한 기반으로
|
1174
|
-
|
1175
|
-
|
1418
|
+
이렇게 스트리밍 API나 [서버 발송 이벤트Server Sent
|
1419
|
+
Events](http://dev.w3.org/html5/eventsource/)를 구현할 수 있고, 이 방법은
|
1420
|
+
[WebSockets](http://en.wikipedia.org/wiki/WebSocket)을 위한 기반으로 사용됩니다.
|
1421
|
+
이 방법은 일부 콘텐츠가 느린 자원에 의존하는 경우에 스로풋(throughtput)을
|
1422
|
+
높이기 위해 사용되기도 합니다.
|
1423
|
+
|
1424
|
+
스트리밍 동작, 특히 동시 요청의 수는 애플리케이션을 서빙하는 웹서버에 크게
|
1425
|
+
의존합니다. WEBRick서버 같은 일부의 경우 아예 스트리밍을 지원하지 조차 않습니다.
|
1426
|
+
만약 서버가 스트리밍을 지원하지 않는다면, 본문은 `stream` 으로 전달된 블록이
|
1427
|
+
수행을 마친 후에 한꺼번에 반환됩니다. 이런 한번에 쏘는 샷건같은 방식으로는
|
1428
|
+
스트리밍은 움직이지 않습니다.
|
1176
1429
|
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1430
|
+
선택적 매개변수 `keep_open`이 설정되어 있다면, 스트림 객체에서 `close`를
|
1431
|
+
호출하지 않을 것이고, 나중에 실행 흐름 상의 어느 시점에서 스트림을 닫을 수
|
1432
|
+
있습니다. 이 옵션은 Thin과 Rainbow 같은 이벤트 기반 서버에서만 작동하고
|
1433
|
+
다른 서버들은 여전히 스트림을 닫습니다.
|
1181
1434
|
|
1182
|
-
|
1183
|
-
|
1184
|
-
이 옵션은 Thin과 Rainbow 같은 이벤트 기반 서버에서만 작동한다.
|
1185
|
-
다른 서버들은 여전히 스트림을 닫을 것이다:
|
1435
|
+
``` ruby
|
1436
|
+
# long polling
|
1186
1437
|
|
1187
|
-
```ruby
|
1188
1438
|
set :server, :thin
|
1189
1439
|
connections = []
|
1190
1440
|
|
1191
|
-
get '/' do
|
1192
|
-
#
|
1441
|
+
get '/subscribe' do
|
1442
|
+
# register a client's interest in server events
|
1193
1443
|
stream(:keep_open) { |out| connections << out }
|
1444
|
+
|
1445
|
+
# purge dead connections
|
1446
|
+
connections.reject!(&:closed?)
|
1447
|
+
|
1448
|
+
# acknowledge
|
1449
|
+
"subscribed"
|
1194
1450
|
end
|
1195
1451
|
|
1196
|
-
post '/' do
|
1197
|
-
|
1198
|
-
|
1199
|
-
|
1452
|
+
post '/message' do
|
1453
|
+
connections.each do |out|
|
1454
|
+
# notify client that a new message has arrived
|
1455
|
+
out << params[:message] << "\n"
|
1456
|
+
|
1457
|
+
# indicate client to connect again
|
1458
|
+
out.close
|
1459
|
+
end
|
1460
|
+
|
1461
|
+
# acknowledge
|
1462
|
+
"message received"
|
1200
1463
|
end
|
1201
1464
|
```
|
1202
1465
|
|
1203
1466
|
### 로깅(Logging)
|
1204
1467
|
|
1205
|
-
|
1206
|
-
|
1468
|
+
요청 스코프(request scope) 내에서, `Logger`의 인스턴스인 `logger`
|
1469
|
+
헬퍼를 사용할 수 있습니다.
|
1207
1470
|
|
1208
|
-
```ruby
|
1471
|
+
``` ruby
|
1209
1472
|
get '/' do
|
1210
1473
|
logger.info "loading data"
|
1211
1474
|
# ...
|
1212
1475
|
end
|
1213
1476
|
```
|
1214
1477
|
|
1215
|
-
이 로거는
|
1216
|
-
만약 로깅이
|
1217
|
-
|
1478
|
+
이 로거는 자동으로 Rack 핸들러에서 설정한 로그설정을 참고합니다.
|
1479
|
+
만약 로깅이 비활성상태라면, 이 메서드는 더미(dummy) 객체를 반환하기 때문에,
|
1480
|
+
라우터나 필터에서 이 부분에 대해 걱정할 필요는 없습니다.
|
1218
1481
|
|
1219
|
-
로깅은 `Sinatra::Application`에서만 기본으로 활성화되어 있음에
|
1220
|
-
만약 `Sinatra::Base`로부터 상속받은 경우라면 직접 활성화시켜 줘야
|
1482
|
+
로깅은 `Sinatra::Application`에서만 기본으로 활성화되어 있음에 유의합시다.
|
1483
|
+
만약 `Sinatra::Base`로부터 상속받은 경우라면 직접 활성화시켜 줘야 합니다.
|
1221
1484
|
|
1222
|
-
```ruby
|
1485
|
+
``` ruby
|
1223
1486
|
class MyApp < Sinatra::Base
|
1224
1487
|
configure :production, :development do
|
1225
|
-
enable :logging
|
1488
|
+
enable :logging
|
1226
1489
|
end
|
1227
1490
|
end
|
1228
1491
|
```
|
1229
1492
|
|
1230
|
-
|
1231
|
-
|
1232
|
-
통상적인 유스케이스는 여러분만의 로거를 사용하고자 할 경우일
|
1233
|
-
Sinatra는 `env['rack.logger']`에서 찾은
|
1493
|
+
로깅 미들웨어를 사용하지 않으려면, `logging` 설정을 `nil`로 두면 됩니다.
|
1494
|
+
하지만, 이 경우 주의할 것은 `logger`는 `nil`을 반환하는 것입니다.
|
1495
|
+
통상적인 유스케이스는 여러분만의 로거를 사용하고자 할 경우일 것입니다.
|
1496
|
+
Sinatra는 `env['rack.logger']`에서 찾은 로거를 사용할 것입니다.
|
1234
1497
|
|
1235
1498
|
### 마임 타입(Mime Types)
|
1236
1499
|
|
1237
|
-
`send_file`이나 정적인 파일을 사용할 때에 Sinatra가 인식하지 못하는
|
1238
|
-
이 경우 `mime_type`을 사용하여 파일
|
1500
|
+
`send_file`이나 정적인 파일을 사용할 때에 Sinatra가 인식하지 못하는
|
1501
|
+
마임 타입이 있을 수 있습니다. 이 경우 `mime_type`을 사용하여 파일
|
1502
|
+
확장자를 등록합니다.
|
1239
1503
|
|
1240
|
-
```ruby
|
1504
|
+
``` ruby
|
1241
1505
|
configure do
|
1242
1506
|
mime_type :foo, 'text/foo'
|
1243
1507
|
end
|
1244
1508
|
```
|
1245
1509
|
|
1246
|
-
|
1510
|
+
`content_type` 헬퍼로 쓸 수도 있습니다.
|
1247
1511
|
|
1248
|
-
```ruby
|
1512
|
+
``` ruby
|
1249
1513
|
get '/' do
|
1250
1514
|
content_type :foo
|
1251
1515
|
"foo foo foo"
|
@@ -1254,37 +1518,38 @@ end
|
|
1254
1518
|
|
1255
1519
|
### URL 생성하기
|
1256
1520
|
|
1257
|
-
URL을
|
1521
|
+
URL을 생성할때 `url` 헬퍼 메서드를 사용합니다. 예를 들어 Haml에서는 이렇게
|
1522
|
+
합니다.
|
1258
1523
|
|
1259
|
-
```ruby
|
1524
|
+
``` ruby
|
1260
1525
|
%a{:href => url('/foo')} foo
|
1261
1526
|
```
|
1262
1527
|
|
1263
|
-
이것은 리버스 프록시(reverse proxies)와 Rack
|
1528
|
+
이것은 리버스 프록시(reverse proxies)와 Rack 라우터가 있다면 참고합니다.
|
1264
1529
|
|
1265
|
-
|
1266
|
-
이 메서드는 `to`라는 별칭으로도 사용할 수 있다 (아래 예제 참조).
|
1530
|
+
이 메서드는 `to`라는 별칭으로도 사용할 수 있습니다. (아래 예제 참조)
|
1267
1531
|
|
1268
1532
|
### 브라우저 재지정(Browser Redirect)
|
1269
1533
|
|
1270
|
-
`redirect` 헬퍼 메서드를 사용하여
|
1534
|
+
`redirect` 헬퍼 메서드를 사용하여 브라우저를 리다이렉트 시킬 수 있습니다.
|
1271
1535
|
|
1272
|
-
```ruby
|
1536
|
+
``` ruby
|
1273
1537
|
get '/foo' do
|
1274
1538
|
redirect to('/bar')
|
1275
1539
|
end
|
1276
1540
|
```
|
1277
1541
|
|
1278
|
-
|
1542
|
+
다른 부가적인 매개변수들은 `halt`에 전달하는 인자들과 비슷합니다.
|
1279
1543
|
|
1280
|
-
```ruby
|
1544
|
+
``` ruby
|
1281
1545
|
redirect to('/bar'), 303
|
1282
1546
|
redirect 'http://google.com', 'wrong place, buddy'
|
1283
1547
|
```
|
1284
1548
|
|
1285
|
-
`redirect back`을 사용하면 사용자가 왔던 페이지로 다시
|
1549
|
+
`redirect back`을 사용하면 쉽게 사용자가 왔던 페이지로 다시 돌아가게
|
1550
|
+
할 수 있습니다.
|
1286
1551
|
|
1287
|
-
```ruby
|
1552
|
+
``` ruby
|
1288
1553
|
get '/foo' do
|
1289
1554
|
"<a href='/bar'>do something</a>"
|
1290
1555
|
end
|
@@ -1295,15 +1560,15 @@ get '/bar' do
|
|
1295
1560
|
end
|
1296
1561
|
```
|
1297
1562
|
|
1298
|
-
리다이렉트와 함께 인자를 전달하려면,
|
1563
|
+
리다이렉트와 함께 인자를 전달하려면, 쿼리로 붙이거나,
|
1299
1564
|
|
1300
|
-
```ruby
|
1565
|
+
``` ruby
|
1301
1566
|
redirect to('/bar?sum=42')
|
1302
1567
|
```
|
1303
1568
|
|
1304
|
-
|
1569
|
+
세션을 사용하면 됩니다.
|
1305
1570
|
|
1306
|
-
```ruby
|
1571
|
+
``` ruby
|
1307
1572
|
enable :sessions
|
1308
1573
|
|
1309
1574
|
get '/foo' do
|
@@ -1318,39 +1583,40 @@ end
|
|
1318
1583
|
|
1319
1584
|
### 캐시 컨트롤(Cache Control)
|
1320
1585
|
|
1321
|
-
헤더를 정확하게 설정하는 것은 적절한 HTTP 캐싱의
|
1586
|
+
헤더를 정확하게 설정하는 것은 적절한 HTTP 캐싱의 기본입니다.
|
1322
1587
|
|
1323
|
-
Cache-Control 헤더를 다음과 같이 간단하게 설정할 수
|
1588
|
+
Cache-Control 헤더를 다음과 같이 간단하게 설정할 수 있습니다.
|
1324
1589
|
|
1325
|
-
```ruby
|
1590
|
+
``` ruby
|
1326
1591
|
get '/' do
|
1327
1592
|
cache_control :public
|
1328
1593
|
"cache it!"
|
1329
1594
|
end
|
1330
1595
|
```
|
1331
1596
|
|
1332
|
-
프로 팁: 캐싱은 사전 필터에서
|
1597
|
+
프로 팁: 캐싱은 사전 필터에서 설정하세요.
|
1333
1598
|
|
1334
|
-
```ruby
|
1599
|
+
``` ruby
|
1335
1600
|
before do
|
1336
1601
|
cache_control :public, :must_revalidate, :max_age => 60
|
1337
1602
|
end
|
1338
1603
|
```
|
1339
1604
|
|
1340
1605
|
`expires` 헬퍼를 사용하여 그에 상응하는 헤더를 설정한다면,
|
1341
|
-
`Cache-Control`이 자동으로
|
1606
|
+
`Cache-Control`이 자동으로 설정됩니다.
|
1342
1607
|
|
1343
|
-
```ruby
|
1608
|
+
``` ruby
|
1344
1609
|
before do
|
1345
1610
|
expires 500, :public, :must_revalidate
|
1346
1611
|
end
|
1347
1612
|
```
|
1348
1613
|
|
1349
1614
|
캐시를 잘 사용하려면, `etag` 또는 `last_modified`의 사용을 고려해야 할 것이다.
|
1350
|
-
무거운 작업을 하기 *전*에 이들 헬퍼를
|
1351
|
-
|
1615
|
+
무거운 작업을 하기 *전*에 이들 헬퍼를 호출하길 권장합니다. 이렇게 하면,
|
1616
|
+
클라이언트 캐시에 현재 버전이 이미 들어 있을 경우엔 즉각 응답을
|
1617
|
+
뿌릴(flush) 것입니다.
|
1352
1618
|
|
1353
|
-
```ruby
|
1619
|
+
``` ruby
|
1354
1620
|
get '/article/:id' do
|
1355
1621
|
@article = Article.find params[:id]
|
1356
1622
|
last_modified @article.updated_at
|
@@ -1359,17 +1625,18 @@ get '/article/:id' do
|
|
1359
1625
|
end
|
1360
1626
|
```
|
1361
1627
|
|
1362
|
-
[약한 ETag](http://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation)를
|
1628
|
+
[약한 ETag](http://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation)를
|
1629
|
+
사용할 수 도 있습니다.
|
1363
1630
|
|
1364
|
-
```ruby
|
1631
|
+
``` ruby
|
1365
1632
|
etag @article.sha1, :weak
|
1366
1633
|
```
|
1367
1634
|
|
1368
|
-
이들 헬퍼는 어떠한 캐싱도 하지 않으며, 대신 필요한 정보를
|
1369
|
-
|
1370
|
-
[rack-cache](https://github.com/rtomayko/rack-cache)를
|
1635
|
+
이들 헬퍼는 어떠한 캐싱도 하지 않으며, 대신 캐시에 필요한 정보를 제공합니다.
|
1636
|
+
손쉬운 리버스 프록시(reverse-proxy) 캐싱 솔루션을 찾고 있다면,
|
1637
|
+
[rack-cache](https://github.com/rtomayko/rack-cache)를 써보세요.
|
1371
1638
|
|
1372
|
-
```ruby
|
1639
|
+
``` ruby
|
1373
1640
|
require "rack/cache"
|
1374
1641
|
require "sinatra"
|
1375
1642
|
|
@@ -1382,14 +1649,16 @@ get '/' do
|
|
1382
1649
|
end
|
1383
1650
|
```
|
1384
1651
|
|
1385
|
-
정적 파일에 `Cache-Control` 헤더 정보를 추가하려면 `:static_cache_control`
|
1652
|
+
정적 파일에 `Cache-Control` 헤더 정보를 추가하려면 `:static_cache_control`
|
1653
|
+
설정(아래 참조)을 쓰세요.
|
1386
1654
|
|
1387
|
-
RFC 2616에 따르면 If-Match 또는 If-None-Match 헤더가 `*`로 설정된 경우 요청한
|
1388
|
-
|
1389
|
-
|
1390
|
-
|
1655
|
+
RFC 2616에 따르면 If-Match 또는 If-None-Match 헤더가 `*`로 설정된 경우 요청한
|
1656
|
+
리소스(resource)가 이미 존재하느냐 여부에 따라 다르게 취급해야 한다고 되어
|
1657
|
+
있습니다. Sinatra는 (get 처럼) 안전하거나 (put 처럼) 멱등인 요청에 대한 리소스는
|
1658
|
+
이미 존재한다고 가정하지만, 다른 리소스(예를 들면 post 요청 같은)의 경우는
|
1659
|
+
새 리소스로 취급합니다. 이 행동은 `:new_resource` 옵션을 전달하여 변경할 수 있습니다.
|
1391
1660
|
|
1392
|
-
```ruby
|
1661
|
+
``` ruby
|
1393
1662
|
get '/create' do
|
1394
1663
|
etag '', :new_resource => true
|
1395
1664
|
Article.create
|
@@ -1397,25 +1666,25 @@ get '/create' do
|
|
1397
1666
|
end
|
1398
1667
|
```
|
1399
1668
|
|
1400
|
-
|
1669
|
+
약한 ETag를 사용하고자 한다면, `:kind`으로 전달합시다.
|
1401
1670
|
|
1402
|
-
```ruby
|
1671
|
+
``` ruby
|
1403
1672
|
etag '', :new_resource => true, :kind => :weak
|
1404
1673
|
```
|
1405
1674
|
|
1406
1675
|
### 파일 전송하기(Sending Files)
|
1407
1676
|
|
1408
|
-
파일을 전송하려면, `send_file` 헬퍼 메서드를 사용하면
|
1677
|
+
파일을 전송하려면, `send_file` 헬퍼 메서드를 사용하면 됩니다.
|
1409
1678
|
|
1410
|
-
```ruby
|
1679
|
+
``` ruby
|
1411
1680
|
get '/' do
|
1412
1681
|
send_file 'foo.png'
|
1413
1682
|
end
|
1414
1683
|
```
|
1415
1684
|
|
1416
|
-
이 메서드는 몇 가지 옵션을
|
1685
|
+
이 메서드는 몇 가지 옵션을 받습니다.
|
1417
1686
|
|
1418
|
-
```ruby
|
1687
|
+
``` ruby
|
1419
1688
|
send_file 'foo.png', :type => :jpg
|
1420
1689
|
```
|
1421
1690
|
|
@@ -1423,33 +1692,40 @@ send_file 'foo.png', :type => :jpg
|
|
1423
1692
|
|
1424
1693
|
<dl>
|
1425
1694
|
<dt>filename</dt>
|
1426
|
-
|
1695
|
+
<dd>응답에서의 파일명. 기본값은 실제 파일명.</dd>
|
1427
1696
|
|
1428
1697
|
<dt>last_modified</dt>
|
1429
|
-
|
1698
|
+
<dd>Last-Modified 헤더값. 기본값은 파일의 mtime.</dd>
|
1430
1699
|
|
1431
1700
|
<dt>type</dt>
|
1432
|
-
|
1701
|
+
<dd>사용할 컨텐츠 유형. 없으면 파일 확장자로부터 유추.</dd>
|
1433
1702
|
|
1434
1703
|
<dt>disposition</dt>
|
1435
|
-
|
1436
|
-
|
1704
|
+
<dd>
|
1705
|
+
Content-Disposition에서 사용됨. 가능한 값들: <tt>nil</tt> (기본값),
|
1706
|
+
<tt>:attachment</tt> 및 <tt>:inline</tt>
|
1707
|
+
</dd>
|
1437
1708
|
|
1438
1709
|
<dt>length</dt>
|
1439
|
-
|
1710
|
+
<dd>Content-Length, 기본값은 파일 크기.</dd>
|
1440
1711
|
|
1441
1712
|
<dt>status</dt>
|
1442
|
-
|
1713
|
+
<dd>
|
1714
|
+
전송할 상태 코드. 오류 페이지로 정적 파일을 전송할 경우에 유용.
|
1715
|
+
|
1716
|
+
Rack 핸들러가 지원할 경우, Ruby 프로세스로부터의 스트리밍이 아닌
|
1717
|
+
다른 수단이 사용가능함. 이 헬퍼 메서드를 사용하게 되면, Sinatra는
|
1718
|
+
자동으로 범위 요청(range request)을 처리함.
|
1719
|
+
</dd>
|
1443
1720
|
</dl>
|
1444
1721
|
|
1445
|
-
Rack 핸들러가 지원할 경우, Ruby 프로세스로부터의 스트리밍이 아닌 다른 수단을 사용할 수 있다.
|
1446
|
-
만약 이 헬퍼 메서드를 사용하게 되면, Sinatra는 자동으로 범위 요청(range request)을 처리할 것이다.
|
1447
1722
|
|
1448
1723
|
### 요청 객체에 접근하기(Accessing the Request Object)
|
1449
1724
|
|
1450
|
-
|
1725
|
+
들어오는 요청 객에는 요청 레벨(필터, 라우터, 오류 핸들러)에서 `request`
|
1726
|
+
메서드를 통해 접근 가능합니다.
|
1451
1727
|
|
1452
|
-
```ruby
|
1728
|
+
``` ruby
|
1453
1729
|
# http://example.com/example 상에서 실행 중인 앱
|
1454
1730
|
get '/foo' do
|
1455
1731
|
t = %w[text/css text/html application/javascript]
|
@@ -1482,9 +1758,9 @@ get '/foo' do
|
|
1482
1758
|
end
|
1483
1759
|
```
|
1484
1760
|
|
1485
|
-
|
1761
|
+
`script_name`, `path_info`같은 일부 옵션들은 이렇게 쓸 수도 있습니다.
|
1486
1762
|
|
1487
|
-
```ruby
|
1763
|
+
``` ruby
|
1488
1764
|
before { request.path_info = "/" }
|
1489
1765
|
|
1490
1766
|
get "/" do
|
@@ -1492,9 +1768,9 @@ get "/" do
|
|
1492
1768
|
end
|
1493
1769
|
```
|
1494
1770
|
|
1495
|
-
`request.body`는 IO
|
1771
|
+
`request.body`는 IO 객체이거나 StringIO 객체입니다.
|
1496
1772
|
|
1497
|
-
```ruby
|
1773
|
+
``` ruby
|
1498
1774
|
post "/api" do
|
1499
1775
|
request.body.rewind # 누군가 이미 읽은 경우
|
1500
1776
|
data = JSON.parse request.body.read
|
@@ -1504,19 +1780,19 @@ end
|
|
1504
1780
|
|
1505
1781
|
### 첨부(Attachments)
|
1506
1782
|
|
1507
|
-
`attachment` 헬퍼를 사용하여
|
1508
|
-
디스크에 저장되어야 함을 알릴 수
|
1783
|
+
`attachment` 헬퍼를 사용하여 응답이 브라우저에 표시하는 대신
|
1784
|
+
디스크에 저장되어야 함을 블라우저에게 알릴 수 있습니다.
|
1509
1785
|
|
1510
|
-
```ruby
|
1786
|
+
``` ruby
|
1511
1787
|
get '/' do
|
1512
1788
|
attachment
|
1513
1789
|
"store it!"
|
1514
1790
|
end
|
1515
1791
|
```
|
1516
1792
|
|
1517
|
-
|
1793
|
+
파일명을 전달할 수도 있습니다.
|
1518
1794
|
|
1519
|
-
```ruby
|
1795
|
+
``` ruby
|
1520
1796
|
get '/' do
|
1521
1797
|
attachment "info.txt"
|
1522
1798
|
"store it!"
|
@@ -1525,21 +1801,22 @@ end
|
|
1525
1801
|
|
1526
1802
|
### 날짜와 시간 다루기
|
1527
1803
|
|
1528
|
-
Sinatra는 `time_for_` 헬퍼 메서드를
|
1529
|
-
`DateTime
|
1804
|
+
Sinatra는 `time_for_` 헬퍼 메서드를 제공합니다. 이 메서드는
|
1805
|
+
주어진 값으로부터 Time 객체를 생성한다. `DateTime`, `Date` 같은
|
1806
|
+
비슷한 클래스들도 변환됩니다.
|
1530
1807
|
|
1531
|
-
```ruby
|
1808
|
+
``` ruby
|
1532
1809
|
get '/' do
|
1533
1810
|
pass if Time.now > time_for('Dec 23, 2012')
|
1534
1811
|
"still time"
|
1535
1812
|
end
|
1536
1813
|
```
|
1537
1814
|
|
1538
|
-
이 메서드는 내부적으로 `expires` 나 `last_modified` 같은 곳에서
|
1539
|
-
따라서 여러분은 애플리케이션에서 `time_for`를 오버라이딩하여
|
1540
|
-
|
1815
|
+
이 메서드는 내부적으로 `expires` 나 `last_modified` 같은 곳에서 사용됩니다.
|
1816
|
+
따라서 여러분은 애플리케이션에서 `time_for`를 오버라이딩하여 이들 메서드의
|
1817
|
+
동작을 쉽게 확장할 수 있습니다.
|
1541
1818
|
|
1542
|
-
```ruby
|
1819
|
+
``` ruby
|
1543
1820
|
helpers do
|
1544
1821
|
def time_for(value)
|
1545
1822
|
case value
|
@@ -1559,21 +1836,19 @@ end
|
|
1559
1836
|
|
1560
1837
|
### 템플릿 파일 참조하기
|
1561
1838
|
|
1562
|
-
`find_template`는 렌더링할 템플릿 파일을 찾는데
|
1839
|
+
`find_template`는 렌더링할 템플릿 파일을 찾는데 사용됩니다.
|
1563
1840
|
|
1564
|
-
```ruby
|
1841
|
+
``` ruby
|
1565
1842
|
find_template settings.views, 'foo', Tilt[:haml] do |file|
|
1566
1843
|
puts "could be #{file}"
|
1567
1844
|
end
|
1568
1845
|
```
|
1569
1846
|
|
1570
|
-
|
1571
|
-
|
1572
|
-
|
1573
|
-
이건 별로 유용하지 않다. 그렇지만 이 메서드를 오버라이드하여 여러분만의 참조 메커니즘에서 가로채는 것은 유용하다.
|
1574
|
-
예를 들어, 하나 이상의 뷰 디렉터리를 사용하고자 한다면:
|
1847
|
+
이것만으로는 그렇게 유용하지는 않습니다만, 이 메서드를 오버라이드하여 여러분만의
|
1848
|
+
참조 메커니즘에서 가로채게 하면 유용해집니다. 예를 들어, 하나 이상의 뷰 디렉터리를
|
1849
|
+
사용하고자 한다면 이렇게 하세요.
|
1575
1850
|
|
1576
|
-
```ruby
|
1851
|
+
``` ruby
|
1577
1852
|
set :views, ['views', 'templates']
|
1578
1853
|
|
1579
1854
|
helpers do
|
@@ -1583,9 +1858,9 @@ helpers do
|
|
1583
1858
|
end
|
1584
1859
|
```
|
1585
1860
|
|
1586
|
-
|
1861
|
+
다른 예제는 각 엔진마다 다른 디렉터리를 사용할 경우입니다.
|
1587
1862
|
|
1588
|
-
```ruby
|
1863
|
+
``` ruby
|
1589
1864
|
set :views, :sass => 'views/sass', :haml => 'templates', :default => 'views'
|
1590
1865
|
|
1591
1866
|
helpers do
|
@@ -1599,17 +1874,17 @@ end
|
|
1599
1874
|
|
1600
1875
|
여러분은 이것을 간단하게 확장(extension)으로 만들어 다른 사람들과 공유할 수 있다!
|
1601
1876
|
|
1602
|
-
`find_template`은 그 파일이 실제 존재하는지 검사하지 않음에
|
1603
|
-
|
1604
|
-
|
1605
|
-
또한, 템플릿 위치(그리고 콘텐츠)는 개발 모드에서 실행 중이 아니라면 캐시될
|
1606
|
-
정말로 멋진 메세드를 작성하고 싶다면 이 점을
|
1877
|
+
`find_template`은 그 파일이 실제 존재하는지 검사하지 않음에 유의합니다.
|
1878
|
+
모든 가능한 경로에 대해 주어진 블록을 호출할 뿐입니다. 이것은 성능 문제는
|
1879
|
+
되지 않습니다. 왜냐하면 `render`는 파일이 발견되는 즉시 `break`하기 때문입니다.
|
1880
|
+
또한, 템플릿 위치(그리고 콘텐츠)는 개발 모드에서 실행 중이 아니라면 캐시될 것입니다.
|
1881
|
+
정말로 멋진 메세드를 작성하고 싶다면 이 점을 명심하세요.
|
1607
1882
|
|
1608
1883
|
## 설정(Configuration)
|
1609
1884
|
|
1610
|
-
모든 환경에서, 시작될 때, 한번만
|
1885
|
+
모든 환경에서, 시작될 때, 한번만 실행되게 하려면 이렇게 하면 됩니다.
|
1611
1886
|
|
1612
|
-
```ruby
|
1887
|
+
``` ruby
|
1613
1888
|
configure do
|
1614
1889
|
# 옵션 하나 설정
|
1615
1890
|
set :option, 'value'
|
@@ -1628,25 +1903,25 @@ configure do
|
|
1628
1903
|
end
|
1629
1904
|
```
|
1630
1905
|
|
1631
|
-
환경(RACK_ENV 환경 변수)이 `:production`일 때만
|
1906
|
+
환경(RACK_ENV 환경 변수)이 `:production`일 때만 실행되게 하려면 이렇게 하면 됩니다.
|
1632
1907
|
|
1633
|
-
```ruby
|
1908
|
+
``` ruby
|
1634
1909
|
configure :production do
|
1635
1910
|
...
|
1636
1911
|
end
|
1637
1912
|
```
|
1638
1913
|
|
1639
|
-
환경이 `:production` 또는 `:test`일 때
|
1914
|
+
환경이 `:production` 또는 `:test`일 때 실행되게 하려면 이렇게 하면 됩니다.
|
1640
1915
|
|
1641
|
-
```ruby
|
1916
|
+
``` ruby
|
1642
1917
|
configure :production, :test do
|
1643
1918
|
...
|
1644
1919
|
end
|
1645
1920
|
```
|
1646
1921
|
|
1647
|
-
|
1922
|
+
이 옵션들은 `settings`를 통해 접근 가능합니다.
|
1648
1923
|
|
1649
|
-
```ruby
|
1924
|
+
``` ruby
|
1650
1925
|
configure do
|
1651
1926
|
set :foo, 'bar'
|
1652
1927
|
end
|
@@ -1661,25 +1936,34 @@ end
|
|
1661
1936
|
### 공격 방어 설정하기(Configuring attack protection)
|
1662
1937
|
|
1663
1938
|
Sinatra는 [Rack::Protection](https://github.com/rkh/rack-protection#readme)을 사용하여
|
1664
|
-
|
1665
|
-
|
1939
|
+
일반적이고 일어날 수 있는 공격에 대비합니다. 이 모듈은 간단하게 비활성시킬 수 있습니다.
|
1940
|
+
(하지만 애플리케이션에 엄청나게 많은 취약성을 야기합니다.)
|
1666
1941
|
|
1667
|
-
```ruby
|
1942
|
+
``` ruby
|
1668
1943
|
disable :protection
|
1669
1944
|
```
|
1670
1945
|
|
1671
|
-
하나의 방어층만 스킵하려면, 옵션 해시에 `protection`을 설정하면
|
1946
|
+
하나의 방어층만 스킵하려면, 옵션 해시에 `protection`을 설정하면 됩니다.
|
1672
1947
|
|
1673
|
-
```ruby
|
1948
|
+
``` ruby
|
1674
1949
|
set :protection, :except => :path_traversal
|
1675
1950
|
```
|
1676
1951
|
|
1677
|
-
|
1952
|
+
배열로 넘김으로써 방어층 여러 개를 비활성화할 수 있습니다.
|
1678
1953
|
|
1679
|
-
```ruby
|
1954
|
+
``` ruby
|
1680
1955
|
set :protection, :except => [:path_traversal, :session_hijacking]
|
1681
1956
|
```
|
1682
1957
|
|
1958
|
+
기본적으로 `:sessions`가 활성 중일 때만 Sinatra는 방어층을 설정합니다.
|
1959
|
+
때로는 자신만의 세션을 설정할 때도 있습니다. 이런 경우 `:session` 옵션을
|
1960
|
+
넘겨줌으로써 세션을 기반으로한 방어층을 설정 할 수 있습니다.
|
1961
|
+
|
1962
|
+
``` ruby
|
1963
|
+
use Rack::Session::Pool
|
1964
|
+
set :protection, :session => true
|
1965
|
+
```
|
1966
|
+
|
1683
1967
|
### 가능한 설정들(Available Settings)
|
1684
1968
|
|
1685
1969
|
<dl>
|
@@ -1687,202 +1971,248 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
1687
1971
|
<dd>
|
1688
1972
|
만약 비활성이면, Sinatra는 상대경로 리다이렉트를 허용할 것이지만,
|
1689
1973
|
이렇게 되면 Sinatra는 더 이상 오직 절대경로 리다이렉트만 허용하고 있는
|
1690
|
-
RFC 2616(HTTP 1.1)에
|
1691
|
-
|
1974
|
+
RFC 2616(HTTP 1.1)에 위배됨.
|
1975
|
+
</dd>
|
1976
|
+
<dd>
|
1692
1977
|
적정하게 설정되지 않은 리버스 프록시 하에서 앱을 실행 중이라면 활성화시킬 것.
|
1693
1978
|
<tt>rul</tt> 헬퍼는, 만약 두 번째 매개변수로 <tt>false</tt>를 전달하지만 않는다면,
|
1694
|
-
여전히 절대경로 URL을 생성할 것임에
|
1695
|
-
|
1696
|
-
기본값은 비활성.
|
1979
|
+
여전히 절대경로 URL을 생성할 것임에 유의.
|
1697
1980
|
</dd>
|
1981
|
+
<dd>기본값은 비활성.</dd>
|
1698
1982
|
|
1699
1983
|
<dt>add_charsets</dt>
|
1700
1984
|
<dd>
|
1701
1985
|
<tt>content_type</tt>가 문자셋 정보에 자동으로 추가하게 될 마임(mime) 타입.
|
1702
|
-
|
1703
|
-
이 옵션은 오버라이딩하지 말고 추가해야 한다:
|
1704
|
-
|
1986
|
+
이 옵션은 오버라이딩하지 말고 추가해야 함.
|
1705
1987
|
<tt>settings.add_charsets << "application/foobar"</tt>
|
1706
1988
|
</dd>
|
1707
1989
|
|
1708
1990
|
<dt>app_file</dt>
|
1709
|
-
<dd
|
1710
|
-
|
1991
|
+
<dd>
|
1992
|
+
메인 애플리케이션 파일의 경로. 프로젝트 루트, 뷰, public 폴더,
|
1993
|
+
인라인 템플릿을 파악할 때 사용됨.
|
1711
1994
|
</dd>
|
1712
1995
|
|
1713
1996
|
<dt>bind</dt>
|
1714
|
-
<dd>바인드할 IP 주소(기본값: 0.0.0.0).
|
1715
|
-
오직 빌트인(built-in) 서버에서만 사용됨.
|
1716
|
-
</dd>
|
1997
|
+
<dd>바인드할 IP 주소(기본값: <tt>0.0.0.0</tt> <em>이나</em> `environment`가 개발로 설정 되어있으면 <tt>localhost</tt>). 오직 빌트인(built-in) 서버에서만 사용됨.</dd>
|
1717
1998
|
|
1718
1999
|
<dt>default_encoding</dt>
|
1719
|
-
<dd
|
1720
|
-
(기본값은 <tt>"utf-8"</tt>).
|
1721
|
-
</dd>
|
2000
|
+
<dd>인코딩을 알 수 없을 때 인코딩(기본값은 <tt>"utf-8"</tt>).</dd>
|
1722
2001
|
|
1723
2002
|
<dt>dump_errors</dt>
|
1724
|
-
<dd>
|
1725
|
-
로그로 에러 출력.
|
1726
|
-
</dd>
|
2003
|
+
<dd>로그안의 에러 출력.</dd>
|
1727
2004
|
|
1728
2005
|
<dt>environment</dt>
|
1729
|
-
<dd
|
2006
|
+
<dd>
|
2007
|
+
현재 환경, 기본값은 <tt>ENV['RACK_ENV']</tt> ENV에 없을 경우엔 "development".
|
2008
|
+
</dd>
|
1730
2009
|
|
1731
2010
|
<dt>logging</dt>
|
1732
2011
|
<dd>로거(logger) 사용.</dd>
|
1733
2012
|
|
1734
2013
|
<dt>lock</dt>
|
1735
|
-
<dd
|
1736
|
-
|
1737
|
-
|
1738
|
-
|
2014
|
+
<dd>
|
2015
|
+
Ruby 프로세스 당 요청을 동시에 할 경우에만 매 요청에 걸쳐 잠금(lock)을 설정.
|
2016
|
+
</dd>
|
2017
|
+
<dd>앱이 스레드에 안전(thread-safe)하지 않으면 활성화시킬 것. 기본값은 비활성.</dd>
|
1739
2018
|
|
1740
2019
|
<dt>method_override</dt>
|
1741
|
-
<dd>
|
1742
|
-
|
2020
|
+
<dd>
|
2021
|
+
put/delete를 지원하지 않는 브라우저에서 put/delete 폼을 허용하는
|
2022
|
+
<tt>_method</tt> 꼼수 사용.
|
2023
|
+
</dd>
|
1743
2024
|
|
1744
2025
|
<dt>port</dt>
|
1745
2026
|
<dd>접속 포트. 빌트인 서버에서만 사용됨.</dd>
|
1746
2027
|
|
1747
2028
|
<dt>prefixed_redirects</dt>
|
1748
|
-
<dd
|
1749
|
-
|
1750
|
-
|
2029
|
+
<dd>
|
2030
|
+
절대경로가 주어지지 않은 리다이렉트에 <tt>request.script_name</tt>를
|
2031
|
+
삽입할지 여부를 결정. 활성화 하면 <tt>redirect '/foo'</tt>는
|
2032
|
+
<tt>redirect to('/foo')</tt>처럼 동작. 기본값은 비활성.
|
2033
|
+
</dd>
|
1751
2034
|
|
1752
2035
|
<dt>protection</dt>
|
1753
2036
|
<dd>웹 공격 방어를 활성화시킬 건지 여부. 위의 보안 섹션 참조.</dd>
|
1754
2037
|
|
2038
|
+
<dt>public_dir</dt>
|
2039
|
+
<dd><tt>public_folder</tt>의 별칭. 밑을 참조.</dd>
|
2040
|
+
|
1755
2041
|
<dt>public_folder</dt>
|
1756
|
-
<dd>
|
1757
|
-
|
1758
|
-
|
2042
|
+
<dd>
|
2043
|
+
public 파일이 제공될 폴더의 경로.
|
2044
|
+
static 파일 제공이 활성화된 경우만 사용됨(아래 <tt>static</tt>참조).
|
2045
|
+
만약 설정이 없으면 <tt>app_file</tt>로부터 유추됨.
|
2046
|
+
</dd>
|
1759
2047
|
|
1760
2048
|
<dt>reload_templates</dt>
|
1761
|
-
<dd
|
1762
|
-
|
2049
|
+
<dd>
|
2050
|
+
요청 간에 템플릿을 리로드(reload)할 건지 여부. 개발 모드에서는 활성됨.
|
2051
|
+
</dd>
|
1763
2052
|
|
1764
2053
|
<dt>root</dt>
|
1765
|
-
<dd
|
1766
|
-
|
2054
|
+
<dd>
|
2055
|
+
프로젝트 루트 디렉터리 경로. 설정이 없으면 <tt>app_file</tt> 설정으로부터 유추됨.
|
2056
|
+
</dd>
|
1767
2057
|
|
1768
2058
|
<dt>raise_errors</dt>
|
1769
|
-
<dd
|
1770
|
-
|
2059
|
+
<dd>
|
2060
|
+
예외 발생(애플리케이션은 중단됨).
|
2061
|
+
기본값은 <tt>environment</tt>가 <tt>"test"</tt>인 경우는 활성, 그렇지 않으면 비활성.
|
2062
|
+
</dd>
|
1771
2063
|
|
1772
2064
|
<dt>run</dt>
|
1773
|
-
<dd
|
1774
|
-
|
2065
|
+
<dd>
|
2066
|
+
활성화되면, Sinatra가 웹서버의 시작을 핸들링.
|
2067
|
+
rackup 또는 다른 도구를 사용하는 경우라면 활성화시키지 말 것.
|
2068
|
+
</dd>
|
1775
2069
|
|
1776
2070
|
<dt>running</dt>
|
1777
|
-
<dd>빌트인 서버가 실행
|
1778
|
-
이 설정은 변경하지 말 것!</dd>
|
2071
|
+
<dd>빌트인 서버가 실행 중인가? 이 설정은 변경하지 말 것!</dd>
|
1779
2072
|
|
1780
2073
|
<dt>server</dt>
|
1781
2074
|
<dd>
|
1782
2075
|
빌트인 서버로 사용할 서버 또는 서버 목록.
|
1783
|
-
기본값은
|
2076
|
+
기본값은 루비구현에 따라 다르며 순서는 우선순위를 의미.
|
1784
2077
|
</dd>
|
2078
|
+
|
1785
2079
|
<dt>sessions</dt>
|
1786
|
-
<dd
|
1787
|
-
|
2080
|
+
<dd>
|
2081
|
+
<tt>Rack::Session::Cookie</tt>를 사용한 쿠키 기반 세션 활성화.
|
2082
|
+
보다 자세한 정보는 '세션 사용하기' 참조.
|
2083
|
+
</dd>
|
1788
2084
|
|
1789
2085
|
<dt>show_exceptions</dt>
|
1790
|
-
<dd
|
1791
|
-
|
2086
|
+
<dd>
|
2087
|
+
예외 발생 시에 브라우저에 스택 추적을 보임.
|
2088
|
+
기본값은 <tt>environment</tt>가 <tt>"development"</tt>인
|
2089
|
+
경우는 활성, 나머지는 비활성.
|
2090
|
+
</dd>
|
2091
|
+
<dd>
|
2092
|
+
<tt>:after_handler</tt>를 설정함으로써 브라우저에서
|
2093
|
+
스택 트레이스를 보여주기 전에 앱에 특화된 에러 핸들링을
|
2094
|
+
할 수도 있음.
|
1792
2095
|
</dd>
|
1793
2096
|
|
1794
2097
|
<dt>static</dt>
|
1795
|
-
<dd>Sinatra가 정적(static) 파일을 핸들링할 지
|
1796
|
-
|
1797
|
-
|
1798
|
-
|
2098
|
+
<dd>Sinatra가 정적(static) 파일을 핸들링할 지 여부를 설정.</dd>
|
2099
|
+
<dd>이 기능이 가능한 서버를 사용하는 경우라면 비활성시킬 것.</dd>
|
2100
|
+
<dd>비활성시키면 성능이 올라감.</dd>
|
2101
|
+
<dd>
|
2102
|
+
기본값은 전통적 방식에서는 활성, 모듈 앱에서는 비활성.
|
2103
|
+
</dd>
|
1799
2104
|
|
1800
2105
|
<dt>static_cache_control</dt>
|
1801
|
-
<dd>
|
1802
|
-
|
1803
|
-
|
1804
|
-
|
1805
|
-
|
2106
|
+
<dd>
|
2107
|
+
Sinatra가 정적 파일을 제공하는 경우, 응답에 <tt>Cache-Control</tt> 헤더를
|
2108
|
+
추가할 때 설정. <tt>cache_control</tt> 헬퍼를 사용.
|
2109
|
+
기본값은 비활성.
|
2110
|
+
</dd>
|
2111
|
+
<dd>
|
2112
|
+
여러 값을 설정할 경우는 명시적으로 배열을 사용할 것:
|
2113
|
+
<tt>set :static_cache_control, [:public, :max_age => 300]</tt>
|
1806
2114
|
</dd>
|
1807
2115
|
|
1808
2116
|
<dt>threaded</dt>
|
1809
|
-
<dd
|
2117
|
+
<dd>
|
2118
|
+
<tt>true</tt>로 설정하면, Thin이 요청을 처리하는데 있어
|
2119
|
+
<tt>EventMachine.defer</tt>를 사용하도록 함.
|
2120
|
+
</dd>
|
1810
2121
|
|
1811
2122
|
<dt>views</dt>
|
1812
|
-
<dd
|
2123
|
+
<dd>
|
2124
|
+
뷰 폴더 경로. 설정하지 않은 경우 <tt>app_file</tt>로부터 유추됨.
|
2125
|
+
</dd>
|
2126
|
+
|
2127
|
+
<dt>x_cascade</dt>
|
2128
|
+
<dd>
|
2129
|
+
라우트를 찾지못했을 때의 X-Cascade 해더를 설정여부.
|
2130
|
+
기본값은 <tt>true</tt>
|
2131
|
+
</dd>
|
1813
2132
|
</dl>
|
1814
2133
|
|
1815
2134
|
|
1816
2135
|
## 환경(Environments)
|
1817
2136
|
|
1818
|
-
|
1819
|
-
|
1820
|
-
|
1821
|
-
|
1822
|
-
|
2137
|
+
3가지의 미리 정의된 `environments` `"development"`, `"production"`, `"test"`
|
2138
|
+
가 있습니다. 환경은 `RACK_ENV` 환경 변수를 통해서도 설정됩니다. 기본값은
|
2139
|
+
`"development"`입니다. `"development"` 모드에서는 모든 템플릿들은 요청 간에
|
2140
|
+
리로드됩니다. 또, `"development"` 모드에서는 특별한 `not_found` 와 `error`
|
2141
|
+
핸들러가 브라우저에서 스택 트레이스를 볼 수 있게합니다.
|
2142
|
+
`"production"`과 `"test"`에서는 기본적으로 템플릿은 캐시됩니다.
|
1823
2143
|
|
1824
|
-
다른 환경으로 실행시키려면
|
2144
|
+
다른 환경으로 실행시키려면 `RACK_ENV` 환경 변수를 사용하세요.
|
1825
2145
|
|
1826
|
-
```
|
1827
|
-
ruby my_app.rb
|
2146
|
+
``` shell
|
2147
|
+
RACK_ENV=production ruby my_app.rb
|
1828
2148
|
```
|
1829
2149
|
|
1830
|
-
현재 설정된 환경이 무엇인지 검사하기
|
1831
|
-
사용할 수
|
2150
|
+
현재 설정된 환경이 무엇인지 검사하기 위해서는 준비된 `development?`, `test?`,
|
2151
|
+
`production?` 메서드를 사용할 수 있습니다.
|
2152
|
+
|
2153
|
+
``` ruby
|
2154
|
+
get '/' do
|
2155
|
+
if settings.development?
|
2156
|
+
"development!"
|
2157
|
+
else
|
2158
|
+
"not development!"
|
2159
|
+
end
|
2160
|
+
end
|
2161
|
+
```
|
1832
2162
|
|
1833
|
-
##
|
2163
|
+
## 에러 처리(Error Handling)
|
1834
2164
|
|
1835
|
-
예외 핸들러는 라우터 및 사전 필터와 동일한 맥락에서
|
1836
|
-
이 말인즉, 이들이 제공하는 모든
|
1837
|
-
|
2165
|
+
예외 핸들러는 라우터 및 사전 필터와 동일한 맥락에서 실행됩니다.
|
2166
|
+
이 말인즉, `haml`, `erb`, `halt`같은 이들이 제공하는 모든 것들을 사용할 수
|
2167
|
+
있다는 뜻입니다.
|
1838
2168
|
|
1839
2169
|
### 찾을 수 없음(Not Found)
|
1840
2170
|
|
1841
2171
|
`Sinatra::NotFound` 예외가 발생하거나 또는 응답의 상태 코드가 404라면,
|
1842
|
-
`not_found` 핸들러가
|
2172
|
+
`not_found` 핸들러가 호출됩니다.
|
1843
2173
|
|
1844
|
-
```ruby
|
2174
|
+
``` ruby
|
1845
2175
|
not_found do
|
1846
2176
|
'아무 곳에도 찾을 수 없습니다.'
|
1847
2177
|
end
|
1848
2178
|
```
|
1849
2179
|
|
1850
|
-
###
|
2180
|
+
### 에러
|
1851
2181
|
|
1852
|
-
`error` 핸들러는 라우터 또는 필터에서 뭐든 오류가 발생할 경우에
|
1853
|
-
예외 객체는 Rack 변수 `sinatra.error`로부터 얻을 수
|
2182
|
+
`error` 핸들러는 라우터 또는 필터에서 뭐든 오류가 발생할 경우에 호출됩니다.
|
2183
|
+
예외 객체는 Rack 변수 `sinatra.error`로부터 얻을 수 있습니다.
|
1854
2184
|
|
1855
|
-
```ruby
|
2185
|
+
``` ruby
|
1856
2186
|
error do
|
1857
2187
|
'고약한 오류가 발생했군요 - ' + env['sinatra.error'].name
|
1858
2188
|
end
|
1859
2189
|
```
|
1860
2190
|
|
1861
|
-
사용자 정의
|
2191
|
+
사용자 정의 오류는 이렇게 정의한다.
|
1862
2192
|
|
1863
|
-
```ruby
|
2193
|
+
``` ruby
|
1864
2194
|
error MyCustomError do
|
1865
2195
|
'무슨 일이 생겼나면요...' + env['sinatra.error'].message
|
1866
2196
|
end
|
1867
2197
|
```
|
1868
2198
|
|
1869
|
-
그런 다음, 이 오류가
|
2199
|
+
그런 다음, 이 오류가 발생하면 이렇게 처리한다.
|
1870
2200
|
|
1871
|
-
```ruby
|
2201
|
+
``` ruby
|
1872
2202
|
get '/' do
|
1873
2203
|
raise MyCustomError, '안좋은 일'
|
1874
2204
|
end
|
1875
2205
|
```
|
1876
2206
|
|
1877
|
-
|
2207
|
+
결과는 이렇습니다.
|
1878
2208
|
|
1879
|
-
```
|
2209
|
+
```
|
1880
2210
|
무슨 일이 생겼냐면요... 안좋은 일
|
1881
2211
|
```
|
1882
2212
|
|
1883
|
-
|
2213
|
+
상태 코드에 대해 오류 핸들러를 설치할 수도 있습니다.
|
1884
2214
|
|
1885
|
-
```ruby
|
2215
|
+
``` ruby
|
1886
2216
|
error 403 do
|
1887
2217
|
'액세스가 금지됨'
|
1888
2218
|
end
|
@@ -1892,29 +2222,29 @@ get '/secret' do
|
|
1892
2222
|
end
|
1893
2223
|
```
|
1894
2224
|
|
1895
|
-
|
2225
|
+
범위로 지정할 수도 있습니다.
|
1896
2226
|
|
1897
|
-
```ruby
|
2227
|
+
``` ruby
|
1898
2228
|
error 400..510 do
|
1899
2229
|
'어이쿠'
|
1900
2230
|
end
|
1901
2231
|
```
|
1902
2232
|
|
1903
|
-
Sinatra는 개발 환경에서 동작할
|
1904
|
-
특별한 `not_found` 와 `error` 핸들러를
|
2233
|
+
Sinatra는 개발 환경에서 동작할 때 브라우저에 괜찮은 스택 트레이스와 추가적인
|
2234
|
+
디버그 정보를 보여주기 위해 특별한 `not_found` 와 `error` 핸들러를 설치합니다.
|
1905
2235
|
|
1906
2236
|
## Rack 미들웨어(Rack Middleware)
|
1907
2237
|
|
1908
|
-
Sinatra는 [Rack](http://rack.rubyforge.org/) 위에서 동작하며,
|
1909
|
-
|
1910
|
-
|
1911
|
-
|
1912
|
-
|
1913
|
-
다양한 유형의 공통 기능을 제공하는 컴포넌트(component)다.
|
2238
|
+
Sinatra는 [Rack](http://rack.rubyforge.org/) 위에서 동작하며, Rack은 루비 웹
|
2239
|
+
프레임워크를 위한 최소한의 표준 인터페이스입니다. Rack이 애플리케이션 개발자들에게
|
2240
|
+
제공하는 가장 흥미로운 기능은 "미들웨어(middleware)"에 대한 지원입니다.
|
2241
|
+
여기서 미들웨어란 서버와 여러분의 애플리케이션 사이에 위치하면서 HTTP 요청/응답을
|
2242
|
+
모니터링하거나/조작함으로써 다양한 유형의 공통 기능을 제공하는 컴포넌트입니다.
|
1914
2243
|
|
1915
|
-
Sinatra는 톱레벨의 `use` 메서드를 사용하여 Rack 미들웨어의 파이프라인을 만드는 일을
|
2244
|
+
Sinatra는 톱레벨의 `use` 메서드를 사용하여 Rack 미들웨어의 파이프라인을 만드는 일을
|
2245
|
+
식은 죽 먹기로 만듭니다.
|
1916
2246
|
|
1917
|
-
```ruby
|
2247
|
+
``` ruby
|
1918
2248
|
require 'sinatra'
|
1919
2249
|
require 'my_custom_middleware'
|
1920
2250
|
|
@@ -1926,33 +2256,32 @@ get '/hello' do
|
|
1926
2256
|
end
|
1927
2257
|
```
|
1928
2258
|
|
1929
|
-
`use
|
1930
|
-
(rackup 파일에서 가장 많이
|
1931
|
-
|
2259
|
+
`use`문법은 [Rack::Builder](http://rack.rubyforge.org/doc/classes/Rack/Builder.html]) DSL
|
2260
|
+
(rackup 파일에서 가장 많이 사용)에서 정의한 것과 동일합니다. 예를 들어, `use` 메서드는
|
2261
|
+
블록이나 여러 개의/가변적인 인자도 받을 수 있습니다.
|
1932
2262
|
|
1933
|
-
```ruby
|
2263
|
+
``` ruby
|
1934
2264
|
use Rack::Auth::Basic do |username, password|
|
1935
2265
|
username == 'admin' && password == 'secret'
|
1936
2266
|
end
|
1937
2267
|
```
|
1938
2268
|
|
1939
|
-
Rack은 로깅, 디버깅, URL 라우팅, 인증, 그리고 세센 핸들링을 위한 다양한 표준
|
1940
|
-
Sinatra는 설정에 기반하여 이들 컴포넌트들 중
|
1941
|
-
따라서 여러분은 일반적으로는 `use`를 명시적으로
|
2269
|
+
Rack은 로깅, 디버깅, URL 라우팅, 인증, 그리고 세센 핸들링을 위한 다양한 표준
|
2270
|
+
미들웨어로 분산되어 있습니다. Sinatra는 설정에 기반하여 이들 컴포넌트들 중
|
2271
|
+
많은 것들을 자동으로 사용하며, 따라서 여러분은 일반적으로는 `use`를 명시적으로
|
2272
|
+
사용할 필요가 없을 것입니다.
|
1942
2273
|
|
1943
|
-
유용한 미들웨어들은
|
1944
2274
|
[rack](https://github.com/rack/rack/tree/master/lib/rack),
|
1945
2275
|
[rack-contrib](https://github.com/rack/rack-contrib#readme),
|
1946
|
-
[CodeRack](http://coderack.org/) 또는
|
1947
2276
|
[Rack wiki](https://github.com/rack/rack/wiki/List-of-Middleware)
|
1948
|
-
에서 찾을 수
|
2277
|
+
에서 유용한 미들웨어들을 찾을 수 있습니다.
|
1949
2278
|
|
1950
2279
|
## 테스팅(Testing)
|
1951
2280
|
|
1952
|
-
Sinatra 테스트는 Rack 기반
|
1953
|
-
[Rack::Test](http://rdoc.info/github/brynary/rack-test/master/frames)를
|
2281
|
+
Sinatra 테스트는 많은 Rack 기반 테스팅 라이브러리, 프레임워크를 사용하여 작성가능합니다.
|
2282
|
+
그 중 [Rack::Test](http://rdoc.info/github/brynary/rack-test/master/frames)를 권장합니다.
|
1954
2283
|
|
1955
|
-
```ruby
|
2284
|
+
``` ruby
|
1956
2285
|
require 'my_sinatra_app'
|
1957
2286
|
require 'test/unit'
|
1958
2287
|
require 'rack/test'
|
@@ -1981,16 +2310,19 @@ class MyAppTest < Test::Unit::TestCase
|
|
1981
2310
|
end
|
1982
2311
|
```
|
1983
2312
|
|
2313
|
+
주의: Sinatra를 모듈러 방식으로 사용한다면, `Sinatra::Application`
|
2314
|
+
를 앱에서 사용하는 클래스 이름으로 바꾸세요.
|
2315
|
+
|
1984
2316
|
## Sinatra::Base - 미들웨어(Middleware), 라이브러리(Libraries), 그리고 모듈 앱(Modular Apps)
|
1985
2317
|
|
1986
2318
|
톱레벨에서 앱을 정의하는 것은 마이크로 앱(micro-app) 수준에서는 잘 동작하지만,
|
1987
|
-
Rack 미들웨어나, Rails 메탈(metal) 또는 서버 컴포넌트를 갖는 간단한 라이브러리,
|
1988
|
-
Sinatra 익스텐션(extension) 같은 재사용 가능한 컴포넌트들을 구축할
|
1989
|
-
톱레벨은 마이크로 앱 스타일의 설정을
|
1990
|
-
`./public` 및 `./views` 디렉터리,
|
1991
|
-
|
2319
|
+
Rack 미들웨어나, Rails 메탈(metal) 또는 서버 컴포넌트를 갖는 간단한 라이브러리,
|
2320
|
+
또는 더 나아가 Sinatra 익스텐션(extension) 같은 재사용 가능한 컴포넌트들을 구축할
|
2321
|
+
경우에는 심각한 약점이 있습니다. 톱레벨은 마이크로 앱 스타일의 설정을 가정하는 것
|
2322
|
+
입니다. (즉, 하나의 단일 애플리케이션 파일과 `./public` 및 `./views` 디렉터리,
|
2323
|
+
로깅, 예외 상세 페이지 등등). 이 곳에서 `Sinatra::Base`가 필요합니다.
|
1992
2324
|
|
1993
|
-
```ruby
|
2325
|
+
``` ruby
|
1994
2326
|
require 'sinatra/base'
|
1995
2327
|
|
1996
2328
|
class MyApp < Sinatra::Base
|
@@ -2003,36 +2335,37 @@ class MyApp < Sinatra::Base
|
|
2003
2335
|
end
|
2004
2336
|
```
|
2005
2337
|
|
2006
|
-
`Sinatra::Base` 서브클래스에서 사용가능한 메서드들은 톱레벨 DSL로 접근 가능한 것들과
|
2007
|
-
대부분의 톱레벨
|
2338
|
+
`Sinatra::Base` 서브클래스에서 사용가능한 메서드들은 톱레벨 DSL로 접근 가능한 것들과
|
2339
|
+
동일합니다. 대부분의 톱레벨 앱들은 다음 두 가지만 수정하면 `Sinatra::Base` 컴포넌트로
|
2340
|
+
변환 가능합니다.
|
2008
2341
|
|
2009
|
-
* 파일은 `sinatra`가 아닌 `sinatra/base`를 require해야
|
2010
|
-
모든 Sinatra의 DSL 메서드들이 메인 네임스페이스에 불러지게
|
2011
|
-
|
2342
|
+
* 파일은 `sinatra`가 아닌 `sinatra/base`를 require해야 합니다.
|
2343
|
+
그렇지 않으면 모든 Sinatra의 DSL 메서드들이 메인 네임스페이스에 불러지게
|
2344
|
+
됩니다.
|
2345
|
+
* 앱의 라우터, 예외 핸들러, 필터, 옵션은 `Sinatra::Base`의 서브클래스에 두어야
|
2346
|
+
합니다.
|
2012
2347
|
|
2013
|
-
`Sinatra::Base`는
|
2014
|
-
|
2015
|
-
|
2348
|
+
`Sinatra::Base`는 백지상태(blank slate)입니다. 빌트인 서버를 비롯한 대부분의 옵션들이
|
2349
|
+
기본값으로 꺼져 있습니다. 가능한 옵션들과 그 작동에 대한 상세는 [옵션과
|
2350
|
+
설정](http://sinatra.github.com/configuration.html)을 참조하세요.
|
2016
2351
|
|
2017
2352
|
### 모듈(Modular) vs. 전통적 방식(Classic Style)
|
2018
2353
|
|
2019
|
-
일반적인 믿음과는 반대로, 전통적 방식에 잘못된 부분은
|
2020
|
-
|
2354
|
+
일반적인 믿음과는 반대로, 전통적 방식에 잘못된 부분은 없습니다. 여러분 애플리케이션에
|
2355
|
+
맞다면, 모듈 애플리케이션으로 전환할 필요는 없습니다.
|
2021
2356
|
|
2022
2357
|
모듈 방식이 아닌 전통적 방식을 사용할 경우 생기는 주된 단점은 루비 프로세스 당
|
2023
|
-
|
2024
|
-
|
2025
|
-
|
2358
|
+
하나의 Sinatra 애플리케이션만 사용할 수 있다는 점입니다. 만약 하나 이상을 사용할
|
2359
|
+
계획이라면 모듈 방식으로 전환하세요. 모듈 방식과 전통적 방식을 섞어쓰지 못할
|
2360
|
+
이유는 없습니다.
|
2026
2361
|
|
2027
|
-
|
2028
|
-
|
2029
|
-
설정전통적 방식 모듈 방식
|
2362
|
+
방식을 전환할 경우에는, 기본값 설정의 미묘한 차이에 유의해야 합니다.
|
2030
2363
|
|
2031
2364
|
<table>
|
2032
2365
|
<tr>
|
2033
|
-
<th
|
2034
|
-
<th
|
2035
|
-
<th
|
2366
|
+
<th>설정</th>
|
2367
|
+
<th>전통적 방식</th>
|
2368
|
+
<th>모듈</th>
|
2036
2369
|
</tr>
|
2037
2370
|
<tr>
|
2038
2371
|
<td>app_file</td>
|
@@ -2068,10 +2401,10 @@ end
|
|
2068
2401
|
|
2069
2402
|
### 모듈 애플리케이션(Modular Application) 제공하기
|
2070
2403
|
|
2071
|
-
모듈 앱을 시작하는 두 가지 일반적인 옵션이
|
2072
|
-
|
2404
|
+
모듈 앱을 시작하는 두 가지 일반적인 옵션이 있습니다.
|
2405
|
+
`run!`으로 능동적으로 시작하는 방법은 이렇습니다.
|
2073
2406
|
|
2074
|
-
```ruby
|
2407
|
+
``` ruby
|
2075
2408
|
# my_app.rb
|
2076
2409
|
require 'sinatra/base'
|
2077
2410
|
|
@@ -2083,31 +2416,32 @@ class MyApp < Sinatra::Base
|
|
2083
2416
|
end
|
2084
2417
|
```
|
2085
2418
|
|
2086
|
-
|
2419
|
+
이렇게 시작할 수도 있습니다.
|
2087
2420
|
|
2088
|
-
```
|
2421
|
+
``` shell
|
2089
2422
|
ruby my_app.rb
|
2090
2423
|
```
|
2091
2424
|
|
2092
|
-
|
2425
|
+
`config.ru`와 함께 사용할수도 있습니다. 이 경우는 어떠한 Rack 핸들러도 사용할 수 있도록
|
2426
|
+
허용 합다.
|
2093
2427
|
|
2094
|
-
```ruby
|
2428
|
+
``` ruby
|
2095
2429
|
# config.ru
|
2096
2430
|
require './my_app'
|
2097
2431
|
run MyApp
|
2098
2432
|
```
|
2099
2433
|
|
2100
|
-
|
2434
|
+
실행은 이렇게 합니다.
|
2101
2435
|
|
2102
|
-
```
|
2436
|
+
``` shell
|
2103
2437
|
rackup -p 4567
|
2104
2438
|
```
|
2105
2439
|
|
2106
2440
|
### config.ru로 전통적 방식의 애플리케이션 사용하기
|
2107
2441
|
|
2108
|
-
앱 파일을 다음과 같이
|
2442
|
+
앱 파일을 다음과 같이 작성합니다.
|
2109
2443
|
|
2110
|
-
```ruby
|
2444
|
+
``` ruby
|
2111
2445
|
# app.rb
|
2112
2446
|
require 'sinatra'
|
2113
2447
|
|
@@ -2116,33 +2450,33 @@ get '/' do
|
|
2116
2450
|
end
|
2117
2451
|
```
|
2118
2452
|
|
2119
|
-
대응하는 `config.ru`는 다음과 같이
|
2453
|
+
대응하는 `config.ru`는 다음과 같이 작성합니다.
|
2120
2454
|
|
2121
|
-
```ruby
|
2455
|
+
``` ruby
|
2122
2456
|
require './app'
|
2123
2457
|
run Sinatra::Application
|
2124
2458
|
```
|
2125
2459
|
|
2126
2460
|
### 언제 config.ru를 사용할까?
|
2127
2461
|
|
2128
|
-
|
2129
|
-
다음은 `config.ru`를 사용하게 될 징후들이다:
|
2462
|
+
`config.ru`는 다음 경우에 권장 됩니다.
|
2130
2463
|
|
2131
2464
|
* 다른 Rack 핸들러(Passenger, Unicorn, Heroku, ...)로 배포하고자 할 때.
|
2132
2465
|
* 하나 이상의 `Sinatra::Base` 서브클래스를 사용하고자 할 때.
|
2133
2466
|
* Sinatra를 최종점(endpoint)이 아니라, 오로지 미들웨어로만 사용하고자 할 때.
|
2134
2467
|
|
2135
2468
|
**모듈 방식으로 전환했다는 이유만으로 `config.ru`로 전환할 필요는 없으며,
|
2136
|
-
또한 `config.ru`를 사용한다고 해서 모듈 방식을 사용해야 하는 것도
|
2469
|
+
또한 `config.ru`를 사용한다고 해서 모듈 방식을 사용해야 하는 것도 아닙니다.**
|
2137
2470
|
|
2138
2471
|
### Sinatra를 미들웨어로 사용하기
|
2139
2472
|
|
2140
2473
|
Sinatra에서 다른 Rack 미들웨어를 사용할 수 있을 뿐 아니라,
|
2141
|
-
|
2142
|
-
이 종착점은 다른 Sinatra 애플리케이션이 될 수도 있고,
|
2143
|
-
또는 Rack 기반의 어떠한 애플리케이션(Rails/Ramaze/Camping/...)
|
2474
|
+
어떤 Sinatra 애플리케이션에서도 순차로 어떠한 Rack 종착점 앞에 미들웨어로
|
2475
|
+
추가될 수 있습니다. 이 종착점은 다른 Sinatra 애플리케이션이 될 수도 있고,
|
2476
|
+
또는 Rack 기반의 어떠한 애플리케이션(Rails/Ramaze/Camping/...)이 될 수도
|
2477
|
+
있습니다.
|
2144
2478
|
|
2145
|
-
```ruby
|
2479
|
+
``` ruby
|
2146
2480
|
require 'sinatra/base'
|
2147
2481
|
|
2148
2482
|
class LoginScreen < Sinatra::Base
|
@@ -2151,11 +2485,11 @@ class LoginScreen < Sinatra::Base
|
|
2151
2485
|
get('/login') { haml :login }
|
2152
2486
|
|
2153
2487
|
post('/login') do
|
2154
|
-
if params[:name] == 'admin' && params[:password] == 'admin'
|
2155
|
-
|
2156
|
-
else
|
2157
|
-
|
2158
|
-
end
|
2488
|
+
if params[:name] == 'admin' && params[:password] == 'admin'
|
2489
|
+
session['user_name'] = params[:name]
|
2490
|
+
else
|
2491
|
+
redirect '/login'
|
2492
|
+
end
|
2159
2493
|
end
|
2160
2494
|
end
|
2161
2495
|
|
@@ -2175,18 +2509,18 @@ end
|
|
2175
2509
|
|
2176
2510
|
### 동적인 애플리케이션 생성(Dynamic Application Creation)
|
2177
2511
|
|
2178
|
-
|
2179
|
-
|
2512
|
+
어떤 상수에 할당하지 않고 런타임에서 새 애플리케이션들을 생성하려면,
|
2513
|
+
`Sinatra.new`를 쓰면 됩니다.
|
2180
2514
|
|
2181
|
-
```ruby
|
2515
|
+
``` ruby
|
2182
2516
|
require 'sinatra/base'
|
2183
2517
|
my_app = Sinatra.new { get('/') { "hi" } }
|
2184
2518
|
my_app.run!
|
2185
2519
|
```
|
2186
2520
|
|
2187
|
-
|
2521
|
+
선택적 인자로 상속할 애플리케이션을 받을 수 있습니다.
|
2188
2522
|
|
2189
|
-
```ruby
|
2523
|
+
``` ruby
|
2190
2524
|
# config.ru
|
2191
2525
|
require 'sinatra/base'
|
2192
2526
|
|
@@ -2204,11 +2538,12 @@ map('/b') do
|
|
2204
2538
|
end
|
2205
2539
|
```
|
2206
2540
|
|
2207
|
-
|
2541
|
+
이 방법은 Sintra 익스텐션을 테스팅하거나 또는 여러분의 라이브러리에서 Sinatra를
|
2542
|
+
사용할 경우에 특히 유용합니다.
|
2208
2543
|
|
2209
|
-
|
2544
|
+
이 방법은 Sinatra를 미들웨어로 사용하는 것을 아주 쉽게 만들어 주기도 합니다.
|
2210
2545
|
|
2211
|
-
```ruby
|
2546
|
+
``` ruby
|
2212
2547
|
require 'sinatra/base'
|
2213
2548
|
|
2214
2549
|
use Sinatra do
|
@@ -2220,32 +2555,32 @@ run RailsProject::Application
|
|
2220
2555
|
|
2221
2556
|
## 범위(Scopes)와 바인딩(Binding)
|
2222
2557
|
|
2223
|
-
현재 어느 범위에 있느냐가 어떤 메서드와 변수를 사용할 수 있는지를
|
2558
|
+
현재 어느 범위에 있느냐가 어떤 메서드와 변수를 사용할 수 있는지를 결정합니다.
|
2224
2559
|
|
2225
2560
|
### 애플리케이션/클래스 범위
|
2226
2561
|
|
2227
|
-
모든 Sinatra 애플리케이션은 `Sinatra::Base`의 서브클래스에
|
2228
|
-
만약 톱레벨 DSL (`require 'sinatra'`)을 사용한다면,
|
2229
|
-
|
2230
|
-
그 서브클래스가
|
2231
|
-
`request` 객체나 `session` 에는 접근할 수
|
2232
|
-
애플리케이션 클래스는 오직 하나이기
|
2562
|
+
모든 Sinatra 애플리케이션은 `Sinatra::Base`의 서브클래스에 대응됩니다.
|
2563
|
+
만약 톱레벨 DSL (`require 'sinatra'`)을 사용한다면, 이 클래스는
|
2564
|
+
`Sinatra::Application`이며, 그렇지 않을 경우라면 여러분이 명시적으로 생성한
|
2565
|
+
그 서브클래스가 됩니다. 클래스 레벨에서는 `get` 이나 `before` 같은 메서드들을
|
2566
|
+
가지나, `request` 객체나 `session` 에는 접근할 수 없습니다. 왜냐면 모든 요청에
|
2567
|
+
대해 애플리케이션 클래스는 오직 하나이기 때문입니다.
|
2233
2568
|
|
2234
|
-
`set`으로 생성한 옵션들은 클래스 레벨의
|
2569
|
+
`set`으로 생성한 옵션들은 클래스 레벨의 메서드들입니다.
|
2235
2570
|
|
2236
|
-
```ruby
|
2571
|
+
``` ruby
|
2237
2572
|
class MyApp < Sinatra::Base
|
2238
|
-
#
|
2573
|
+
# 저기요, 저는 애플리케이션 범위에 있다구요!
|
2239
2574
|
set :foo, 42
|
2240
2575
|
foo # => 42
|
2241
2576
|
|
2242
2577
|
get '/foo' do
|
2243
|
-
# 저기요, 전 이제 더 이상 애플리케이션 범위 속에 있지 않아요!
|
2578
|
+
# 저기요, 전 이제 더 이상 애플리케이션 범위 속에 있지 않아요!
|
2244
2579
|
end
|
2245
2580
|
end
|
2246
2581
|
```
|
2247
2582
|
|
2248
|
-
|
2583
|
+
애플리케이션 범위에는 이런 것들이 있습니다.
|
2249
2584
|
|
2250
2585
|
* 애플리케이션 클래스 본문
|
2251
2586
|
* 확장으로 정의된 메서드
|
@@ -2253,36 +2588,36 @@ end
|
|
2253
2588
|
* `set`의 값으로 사용된 Procs/blocks
|
2254
2589
|
* `Sinatra.new`로 전달된 블록
|
2255
2590
|
|
2256
|
-
범위 객체 (클래스)는 다음과 같이 접근할 수
|
2591
|
+
범위 객체 (클래스)는 다음과 같이 접근할 수 있습니다.
|
2257
2592
|
|
2258
2593
|
* configure 블록으로 전달된 객체를 통해(`configure { |c| ... }`)
|
2259
2594
|
* 요청 범위 내에서 `settings`
|
2260
2595
|
|
2261
2596
|
### 요청/인스턴스 범위
|
2262
2597
|
|
2263
|
-
매 요청마다, 애플리케이션 클래스의 새 인스턴스가 생성되고 모든 핸들러 블록은
|
2264
|
-
|
2265
|
-
`erb` 나 `haml` 같은 렌더링 메서드를 호출할 수
|
2266
|
-
|
2598
|
+
매 요청마다, 애플리케이션 클래스의 새 인스턴스가 생성되고 모든 핸들러 블록은
|
2599
|
+
그 범위 내에서 실행됩니다. 범위 내에서 여러분은 `request` 와 `session` 객체에
|
2600
|
+
접근하거나 `erb` 나 `haml` 같은 렌더링 메서드를 호출할 수 있습니다. 요청 범위
|
2601
|
+
내에서 `settings` 헬퍼를 통해 애플리케이션 범위에 접근 가능합니다.
|
2267
2602
|
|
2268
|
-
```ruby
|
2603
|
+
``` ruby
|
2269
2604
|
class MyApp < Sinatra::Base
|
2270
2605
|
# 이봐요, 전 애플리케이션 범위에 있다구요!
|
2271
2606
|
get '/define_route/:name' do
|
2272
|
-
# '/define_route/:name'의 요청 범위
|
2273
|
-
@value = 42
|
2607
|
+
# '/define_route/:name'의 요청 범위
|
2608
|
+
@value = 42
|
2274
2609
|
|
2275
|
-
settings.get("/#{params[:name]}") do
|
2276
|
-
|
2277
|
-
|
2278
|
-
end
|
2610
|
+
settings.get("/#{params[:name]}") do
|
2611
|
+
# "/#{params[:name]}"의 요청 범위
|
2612
|
+
@value # => nil (동일한 요청이 아님)
|
2613
|
+
end
|
2279
2614
|
|
2280
|
-
"라우터가 정의됨!"
|
2615
|
+
"라우터가 정의됨!"
|
2281
2616
|
end
|
2282
2617
|
end
|
2283
2618
|
```
|
2284
2619
|
|
2285
|
-
|
2620
|
+
요청 범위에는 이런 것들이 있습니다.
|
2286
2621
|
|
2287
2622
|
* get/head/post/put/delete/options 블록
|
2288
2623
|
* before/after 필터
|
@@ -2291,30 +2626,31 @@ end
|
|
2291
2626
|
|
2292
2627
|
### 위임 범위(Delegation Scope)
|
2293
2628
|
|
2294
|
-
위임 범위(delegation scope)는 메서드를 단순히 클래스 범위로
|
2295
|
-
|
2296
|
-
오직 명시적으로 위임(delegation) 표시된 메서드들만 사용
|
2297
|
-
또한 클래스 범위와 변수/상태를 공유하지
|
2298
|
-
`Sinatra::Delegator.delegate :method_name`을 호출하여 메서드 위임을 명시적으로
|
2629
|
+
위임 범위(delegation scope)는 메서드를 단순히 클래스 범위로 보냅니다(forward).
|
2630
|
+
하지만 클래스 바인딩을 갖지 않기에 완전히 클래스 범위처럼 동작하지는 않습니다.
|
2631
|
+
오직 명시적으로 위임(delegation) 표시된 메서드들만 사용 가능하고,
|
2632
|
+
또한 클래스 범위와 변수/상태를 공유하지 않습니다 (유의: `self`가 다름).
|
2633
|
+
`Sinatra::Delegator.delegate :method_name`을 호출하여 메서드 위임을 명시적으로
|
2634
|
+
추가할 수 있습니다.
|
2299
2635
|
|
2300
|
-
|
2636
|
+
위임 범위에는 이런 것들이 있습니다.
|
2301
2637
|
|
2302
2638
|
* 톱레벨 바인딩, `require "sinatra"`를 한 경우
|
2303
2639
|
* `Sinatra::Delegator` 믹스인으로 확장된 객체
|
2304
2640
|
|
2305
|
-
직접 코드를 살펴보길
|
2641
|
+
직접 코드를 살펴보길 바랍니다.
|
2306
2642
|
[Sinatra::Delegator 믹스인](https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/base.rb#L1609-1633)
|
2307
|
-
|
2643
|
+
은 [메인 객체를 확장한 것](https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/main.rb#L28-30) 입니다.
|
2308
2644
|
|
2309
2645
|
## 명령행(Command Line)
|
2310
2646
|
|
2311
|
-
Sinatra 애플리케이션은 직접 실행할 수
|
2647
|
+
Sinatra 애플리케이션은 직접 실행할 수 있습니다.
|
2312
2648
|
|
2313
|
-
```
|
2649
|
+
``` shell
|
2314
2650
|
ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
|
2315
2651
|
```
|
2316
2652
|
|
2317
|
-
|
2653
|
+
옵션들은 다음과 같습니다.
|
2318
2654
|
|
2319
2655
|
```
|
2320
2656
|
-h # 도움말
|
@@ -2327,163 +2663,170 @@ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
|
|
2327
2663
|
|
2328
2664
|
## 요구사항(Requirement)
|
2329
2665
|
|
2330
|
-
다음의 루비 버전은 공식적으로
|
2331
|
-
|
2666
|
+
다음의 루비 버전은 공식적으로 지원됩니다.
|
2332
2667
|
<dl>
|
2333
2668
|
<dt> Ruby 1.8.7 </dt>
|
2334
|
-
<dd>
|
2335
|
-
1.
|
2336
|
-
1.
|
2337
|
-
|
2338
|
-
|
2339
|
-
|
2340
|
-
Sinatra 1.4.0이 릴리스될 때 까지는 버그 픽스를 받을 수 있을 것이다.
|
2669
|
+
<dd>
|
2670
|
+
1.8.7은 완전하게 지원되지만, 꼭 그래야할 특별한 이유가 없다면,
|
2671
|
+
1.9.2로 업그레이드하거나 또는 JRuby나 Rubinius로 전환할 것을 권장합니다.
|
2672
|
+
1.8.7에 대한 지원은 Sinatra 2.0 이전에는 중단되지 않을 것입니다.
|
2673
|
+
Ruby 1.8.6은 더이상 지원하지 않습니다.
|
2674
|
+
</dd>
|
2341
2675
|
|
2342
|
-
</dd>
|
2343
2676
|
<dt> Ruby 1.9.2 </dt>
|
2344
|
-
<dd>
|
2345
|
-
1.9.2p0은, Sinatra를 실행했을 때 세그먼트 오류가
|
2346
|
-
|
2347
|
-
|
2677
|
+
<dd>
|
2678
|
+
1.9.2는 완전하게 지원됩니다. 1.9.2p0은, Sinatra를 실행했을 때 세그먼트 오류가
|
2679
|
+
발생할수 있으므로 쓰지 마세요. 공식 지원은 Sinatra 1.5 이전에는 중단되지 않을
|
2680
|
+
것입니다.
|
2681
|
+
</dd>
|
2348
2682
|
|
2349
|
-
</dd>
|
2350
2683
|
<dt> Ruby 1.9.3 </dt>
|
2351
|
-
<dd>
|
2352
|
-
|
2353
|
-
|
2684
|
+
<dd>
|
2685
|
+
1.9.3은 완전하게 지원되고 권장합니다. 이전 버전에서 1.9.3으로 전환할 경우 모든
|
2686
|
+
세션이 무효화되므로 주의하세요. 1.9.3에 대한 지원은 Sinatra 2.0 이전에는
|
2687
|
+
중단되지 않을 것입니다.
|
2688
|
+
</dd>
|
2354
2689
|
|
2355
|
-
</
|
2356
|
-
<
|
2357
|
-
|
2358
|
-
|
2690
|
+
<dt>Ruby 2.0.0</dt>
|
2691
|
+
<dd>
|
2692
|
+
2.0.0은 완전하게 지원되고 권장합니다. 현재 공식 지원 중지 계획은 없습니다.
|
2693
|
+
</dd>
|
2359
2694
|
|
2360
|
-
</
|
2361
|
-
<
|
2362
|
-
|
2363
|
-
|
2364
|
-
|
2365
|
-
|
2366
|
-
|
2695
|
+
<dt>Rubinius</dt>
|
2696
|
+
<dd>
|
2697
|
+
Rubinius는 공식적으로 지원됩니다. (Rubinius >= 2.x)
|
2698
|
+
<tt>gem install puma</tt>를 권장합니다.
|
2699
|
+
</dd>
|
2700
|
+
|
2701
|
+
<dt>JRuby</dt>
|
2702
|
+
<dd>
|
2703
|
+
JRuby의 마지막 안정판은 공식적으로 지원됩니다. C 확장을 JRuby와 사용하는
|
2704
|
+
것은 권장되지 않습니다.
|
2705
|
+
<tt>gem install trinidad</tt>를 권장합니다.
|
2367
2706
|
</dd>
|
2368
2707
|
</dl>
|
2369
2708
|
|
2370
|
-
|
2709
|
+
새로 나오는 루비 버전도 주시하고 있습니다.
|
2371
2710
|
|
2372
2711
|
다음 루비 구현체들은 공식적으로 지원하지 않지만
|
2373
|
-
여전히 Sinatra를 실행할 수 있는 것으로 알려져
|
2712
|
+
여전히 Sinatra를 실행할 수 있는 것으로 알려져 있습니다.
|
2374
2713
|
|
2375
2714
|
* JRuby와 Rubinius 예전 버전
|
2376
2715
|
* Ruby Enterprise Edition
|
2377
2716
|
* MacRuby, Maglev, IronRuby
|
2378
|
-
* Ruby 1.9.0 및 1.9.1 (
|
2717
|
+
* Ruby 1.9.0 및 1.9.1 (이 버전들은 사용하지 말 것을 권합니다)
|
2379
2718
|
|
2380
|
-
공식적으로 지원하지 않는다는 것의 의미는 무언가가
|
2381
|
-
지원되는 플랫폼에서는 그러지 않을 경우, 우리의 문제가 아니라
|
2719
|
+
공식적으로 지원하지 않는다는 것의 의미는 무언가가 그 플랫폼에서만 잘못되고
|
2720
|
+
지원되는 플랫폼에서는 그러지 않을 경우, 우리의 문제가 아니라 그 플랫폼의 문제로
|
2721
|
+
간주한다는 뜻입니다.
|
2382
2722
|
|
2383
|
-
또한 우리는 CI를 ruby-head (곧 나올 2.
|
2384
|
-
계속해서 변하고 있기 때문에 아무 것도 보장할 수는
|
2385
|
-
1.
|
2723
|
+
또한 우리는 CI를 ruby-head (곧 나올 2.1.0) 브랜치에 맞춰 실행하지만,
|
2724
|
+
계속해서 변하고 있기 때문에 아무 것도 보장할 수는 없습니다.
|
2725
|
+
2.1.0가 완전히 지원되길 기대합시다.
|
2386
2726
|
|
2387
|
-
Sinatra는 선택한 루비 구현체가 지원하는 어떠한 운영체제에서도 작동해야
|
2727
|
+
Sinatra는 선택한 루비 구현체가 지원하는 어떠한 운영체제에서도 작동해야
|
2728
|
+
합니다.
|
2388
2729
|
|
2389
2730
|
현재 Cardinal, SmallRuby, BlueRuby 또는 1.8.7 이전의 루비 버전에서는
|
2390
|
-
Sinatra를 실행할 수 없을
|
2731
|
+
Sinatra를 실행할 수 없을 것입니다.
|
2391
2732
|
|
2392
2733
|
## 최신(The Bleeding Edge)
|
2393
2734
|
|
2394
|
-
Sinatra의 가장 최근 코드를 사용하고자 한다면,
|
2395
|
-
|
2735
|
+
Sinatra의 가장 최근 코드를 사용하고자 한다면, 애플리케이션을 마스터 브랜치에 맞춰
|
2736
|
+
실행하면 되므로 부담가지지 마세요. 하지만 덜 안정적일 것 입니다.
|
2396
2737
|
|
2397
|
-
|
2738
|
+
주기적으로 사전배포(prerelease) 젬을 푸시하기 때문에, 최신 기능들을 얻기 위해
|
2739
|
+
다음과 같이 할 수도 있습니다.
|
2398
2740
|
|
2399
|
-
```
|
2741
|
+
``` shell
|
2400
2742
|
gem install sinatra --pre
|
2401
2743
|
```
|
2402
2744
|
|
2403
|
-
최신 기능들을 얻기 위해선
|
2404
|
-
|
2405
2745
|
### Bundler를 사용하여
|
2406
2746
|
|
2407
2747
|
여러분 애플리케이션을 최신 Sinatra로 실행하고자 한다면,
|
2408
|
-
[Bundler](http://gembundler.com/)를 사용할 것을
|
2748
|
+
[Bundler](http://gembundler.com/)를 사용할 것을 권장합니다.
|
2409
2749
|
|
2410
|
-
우선, 아직 설치하지 않았다면 bundler를
|
2750
|
+
우선, 아직 설치하지 않았다면 bundler를 설치합니다.
|
2411
2751
|
|
2412
|
-
```
|
2752
|
+
``` shell
|
2413
2753
|
gem install bundler
|
2414
2754
|
```
|
2415
2755
|
|
2416
|
-
그런 다음, 프로젝트 디렉터리에서, `Gemfile`을
|
2756
|
+
그런 다음, 프로젝트 디렉터리에서, `Gemfile`을 만듭니다.
|
2417
2757
|
|
2418
|
-
```ruby
|
2419
|
-
source
|
2420
|
-
gem 'sinatra', :
|
2758
|
+
``` ruby
|
2759
|
+
source 'https://rubygems.org'
|
2760
|
+
gem 'sinatra', :github => "sinatra/sinatra"
|
2421
2761
|
|
2422
2762
|
# 다른 의존관계들
|
2423
|
-
gem 'haml'# 예를 들어, haml을 사용한다면
|
2763
|
+
gem 'haml' # 예를 들어, haml을 사용한다면
|
2424
2764
|
gem 'activerecord', '~> 3.0' # 아마도 ActiveRecord 3.x도 필요할 것
|
2425
2765
|
```
|
2426
2766
|
|
2427
|
-
|
2428
|
-
|
2429
|
-
Bundler가 자동으로
|
2767
|
+
`Gemfile`안에 애플리케이션의 모든 의존성을 적어야 합니다.
|
2768
|
+
하지만, Sinatra가 직접적인 의존관계에 있는 것들(Rack과 Tilt)은
|
2769
|
+
Bundler가 자동으로 찾아서 추가할 것입니다.
|
2430
2770
|
|
2431
|
-
이제
|
2771
|
+
이제 앱을 실행할 수 있습니다.
|
2432
2772
|
|
2433
|
-
```
|
2773
|
+
``` shell
|
2434
2774
|
bundle exec ruby myapp.rb
|
2435
2775
|
```
|
2436
2776
|
|
2437
2777
|
### 직접 하기(Roll Your Own)
|
2438
2778
|
|
2439
2779
|
로컬 클론(clone)을 생성한 다음 `$LOAD_PATH`에 `sinatra/lib` 디렉터리를 주고
|
2440
|
-
여러분 앱을
|
2780
|
+
여러분 앱을 실행합니다.
|
2441
2781
|
|
2442
|
-
```
|
2782
|
+
``` shell
|
2443
2783
|
cd myapp
|
2444
2784
|
git clone git://github.com/sinatra/sinatra.git
|
2445
|
-
ruby -
|
2785
|
+
ruby -I sinatra/lib myapp.rb
|
2446
2786
|
```
|
2447
2787
|
|
2448
|
-
이후에 Sinatra 소스를
|
2788
|
+
이후에 Sinatra 소스를 업데이트하려면 이렇게 하세요.
|
2449
2789
|
|
2450
|
-
```
|
2790
|
+
``` shell
|
2451
2791
|
cd myapp/sinatra
|
2452
2792
|
git pull
|
2453
2793
|
```
|
2454
2794
|
|
2455
2795
|
### 전역으로 설치(Install Globally)
|
2456
2796
|
|
2457
|
-
젬을 직접 빌드할 수
|
2797
|
+
젬을 직접 빌드할 수 있습니다.
|
2458
2798
|
|
2459
|
-
```
|
2799
|
+
``` shell
|
2460
2800
|
git clone git://github.com/sinatra/sinatra.git
|
2461
2801
|
cd sinatra
|
2462
2802
|
rake sinatra.gemspec
|
2463
2803
|
rake install
|
2464
2804
|
```
|
2465
2805
|
|
2466
|
-
만약 젬을 루트로 설치한다면, 마지막 단계는 다음과 같이 해야
|
2806
|
+
만약 젬을 루트로 설치한다면, 마지막 단계는 다음과 같이 해야 합니다.
|
2467
2807
|
|
2468
|
-
```
|
2808
|
+
``` shell
|
2469
2809
|
sudo rake install
|
2470
2810
|
```
|
2471
2811
|
|
2472
2812
|
## 버저닝(Versioning)
|
2473
2813
|
|
2474
|
-
Sinatra는 [시맨틱 버저닝Semantic Versioning](http://semver.org/)
|
2475
|
-
SemVer
|
2814
|
+
Sinatra는 [시맨틱 버저닝Semantic Versioning](http://semver.org/)
|
2815
|
+
[(번역)](http://surpreem.com/archives/380)의 SemVer,
|
2816
|
+
SemVerTag를 준수합니다.
|
2476
2817
|
|
2477
2818
|
## 더 읽을 거리(Further Reading)
|
2478
2819
|
|
2479
|
-
* [프로젝트 웹사이트](http://www.sinatrarb.com/) - 추가 문서들, 뉴스,
|
2480
|
-
|
2820
|
+
* [프로젝트 웹사이트](http://www.sinatrarb.com/) - 추가 문서들, 뉴스,
|
2821
|
+
그리고 다른 리소스들에 대한 링크.
|
2822
|
+
* [기여하기](http://www.sinatrarb.com/contributing) - 버그를 찾았나요?
|
2823
|
+
도움이 필요한가요? 패치를 하셨나요?
|
2481
2824
|
* [이슈 트래커](http://github.com/sinatra/sinatra/issues)
|
2482
2825
|
* [트위터](http://twitter.com/sinatra)
|
2483
|
-
* [
|
2484
|
-
*
|
2826
|
+
* [메일링 리스트](http://groups.google.com/group/sinatrarb/topics)
|
2827
|
+
* IRC: [#sinatra](irc://chat.freenode.net/#sinatra) http://freenode.net
|
2485
2828
|
* [Sinatra Book](http://sinatra-book.gittr.com) Cookbook 튜토리얼
|
2486
2829
|
* [Sinatra Recipes](http://recipes.sinatrarb.com/) 커뮤니티가 만드는 레시피
|
2487
2830
|
* http://rubydoc.info에 있는 [최종 릴리스](http://rubydoc.info/gems/sinatra)
|
2488
|
-
또는 [current HEAD](http://rubydoc.info/github/sinatra/sinatra)에 대한 API 문서
|
2831
|
+
또는 [current HEAD](http://rubydoc.info/github/sinatra/sinatra)에 대한 API 문서
|
2489
2832
|
* [CI server](http://travis-ci.org/sinatra/sinatra)
|