sinatra 1.4.5 → 1.4.6
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sinatra might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/AUTHORS.md +77 -0
- data/CHANGES +30 -0
- data/Gemfile +5 -5
- data/README.de.md +186 -56
- data/README.es.md +76 -76
- data/README.fr.md +120 -56
- data/README.hu.md +19 -19
- data/README.ja.md +44 -46
- data/README.ko.md +163 -67
- data/README.md +151 -127
- data/README.pt-br.md +905 -144
- data/README.pt-pt.md +17 -17
- data/README.ru.md +88 -52
- data/README.zh.md +76 -68
- data/lib/sinatra.rb +0 -1
- data/lib/sinatra/base.rb +21 -15
- data/lib/sinatra/show_exceptions.rb +10 -4
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +1 -1
- data/test/asciidoctor_test.rb +2 -2
- data/test/base_test.rb +1 -5
- data/test/builder_test.rb +2 -2
- data/test/coffee_test.rb +8 -2
- data/test/compile_test.rb +1 -1
- data/test/contest.rb +3 -12
- data/test/creole_test.rb +2 -2
- data/test/delegator_test.rb +1 -1
- data/test/encoding_test.rb +1 -1
- data/test/erb_test.rb +1 -1
- data/test/extensions_test.rb +1 -1
- data/test/filter_test.rb +2 -2
- data/test/haml_test.rb +2 -2
- data/test/helper.rb +8 -7
- data/test/helpers_test.rb +6 -6
- data/test/integration_test.rb +3 -3
- data/test/less_test.rb +2 -2
- data/test/liquid_test.rb +3 -3
- data/test/mapped_error_test.rb +5 -5
- data/test/markaby_test.rb +2 -2
- data/test/markdown_test.rb +6 -3
- data/test/mediawiki_test.rb +2 -2
- data/test/middleware_test.rb +1 -1
- data/test/nokogiri_test.rb +2 -2
- data/test/rabl_test.rb +2 -2
- data/test/rack_test.rb +1 -1
- data/test/radius_test.rb +2 -2
- data/test/rdoc_test.rb +4 -4
- data/test/readme_test.rb +1 -1
- data/test/request_test.rb +4 -1
- data/test/response_test.rb +1 -1
- data/test/result_test.rb +2 -2
- data/test/route_added_hook_test.rb +1 -1
- data/test/routing_test.rb +7 -7
- data/test/sass_test.rb +3 -3
- data/test/scss_test.rb +2 -2
- data/test/server_test.rb +10 -2
- data/test/settings_test.rb +4 -4
- data/test/sinatra_test.rb +1 -1
- data/test/slim_test.rb +2 -2
- data/test/static_test.rb +2 -2
- data/test/streaming_test.rb +2 -2
- data/test/stylus_test.rb +2 -2
- data/test/templates_test.rb +3 -3
- data/test/textile_test.rb +2 -2
- data/test/wlang_test.rb +1 -1
- data/test/yajl_test.rb +2 -2
- metadata +10 -11
- data/AUTHORS +0 -61
data/README.ja.md
CHANGED
@@ -165,8 +165,8 @@ end
|
|
165
165
|
``` ruby
|
166
166
|
get '/hello/:name' do
|
167
167
|
# "GET /hello/foo" と "GET /hello/bar" にマッチ
|
168
|
-
# params[
|
169
|
-
"Hello #{params[
|
168
|
+
# params['name'] は 'foo' か 'bar'
|
169
|
+
"Hello #{params['name']}!"
|
170
170
|
end
|
171
171
|
```
|
172
172
|
|
@@ -175,24 +175,24 @@ end
|
|
175
175
|
``` ruby
|
176
176
|
get '/hello/:name' do |n|
|
177
177
|
# "GET /hello/foo" と "GET /hello/bar" にマッチ
|
178
|
-
# params[
|
179
|
-
# n が params[
|
178
|
+
# params['name'] は 'foo' か 'bar'
|
179
|
+
# n が params['name'] を保持
|
180
180
|
"Hello #{n}!"
|
181
181
|
end
|
182
182
|
```
|
183
183
|
|
184
184
|
ルーティングパターンはアスタリスク(すなわちワイルドカード)を含むこともでき、
|
185
|
-
`params[
|
185
|
+
`params['splat']` で取得できます。
|
186
186
|
|
187
187
|
``` ruby
|
188
188
|
get '/say/*/to/*' do
|
189
189
|
# /say/hello/to/world にマッチ
|
190
|
-
params[
|
190
|
+
params['splat'] # => ["hello", "world"]
|
191
191
|
end
|
192
192
|
|
193
193
|
get '/download/*.*' do
|
194
194
|
# /download/path/to/file.xml にマッチ
|
195
|
-
params[
|
195
|
+
params['splat'] # => ["path/to/file", "xml"]
|
196
196
|
end
|
197
197
|
```
|
198
198
|
|
@@ -207,8 +207,8 @@ end
|
|
207
207
|
ルーティングを正規表現にマッチさせることもできます。
|
208
208
|
|
209
209
|
``` ruby
|
210
|
-
get
|
211
|
-
"Hello, #{params[
|
210
|
+
get /\A\/hello\/([\w]+)\z/ do
|
211
|
+
"Hello, #{params['captures'].first}!"
|
212
212
|
end
|
213
213
|
```
|
214
214
|
|
@@ -237,7 +237,7 @@ end
|
|
237
237
|
|
238
238
|
``` ruby
|
239
239
|
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
|
240
|
-
"Songbirdのバージョン #{params[
|
240
|
+
"Songbirdのバージョン #{params['agent'][0]}を使ってます。"
|
241
241
|
end
|
242
242
|
|
243
243
|
get '/foo' do
|
@@ -557,7 +557,7 @@ get('/') { markdown :index }
|
|
557
557
|
<tr>
|
558
558
|
<td>依存</td>
|
559
559
|
<td>
|
560
|
-
<a href="
|
560
|
+
<a href="https://github.com/jimweirich/builder" title="builder">builder</a>
|
561
561
|
</td>
|
562
562
|
</tr>
|
563
563
|
<tr>
|
@@ -673,8 +673,8 @@ LiquidテンプレートからRubyのメソッド(`yield`を除く)を呼び出
|
|
673
673
|
<a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
|
674
674
|
<a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
|
675
675
|
<a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
|
676
|
-
<a href="http://kramdown.
|
677
|
-
<a href="
|
676
|
+
<a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
|
677
|
+
<a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
|
678
678
|
</td>
|
679
679
|
</tr>
|
680
680
|
<tr>
|
@@ -742,7 +742,7 @@ TexttileからはRubyを呼ぶことができないので、Textileで書かれ
|
|
742
742
|
<table>
|
743
743
|
<tr>
|
744
744
|
<td>依存</td>
|
745
|
-
<td><a href="http://rdoc.
|
745
|
+
<td><a href="http://rdoc.sourceforge.net/" title="RDoc">RDoc</a></td>
|
746
746
|
</tr>
|
747
747
|
<tr>
|
748
748
|
<td>ファイル拡張子</td>
|
@@ -795,7 +795,7 @@ AsciiDocテンプレートからRubyのメソッドを直接呼び出すこと
|
|
795
795
|
<table>
|
796
796
|
<tr>
|
797
797
|
<td>依存</td>
|
798
|
-
<td><a href="
|
798
|
+
<td><a href="https://github.com/jlong/radius" title="Radius">Radius</a></td>
|
799
799
|
</tr>
|
800
800
|
<tr>
|
801
801
|
<td>ファイル拡張子</td>
|
@@ -1044,7 +1044,7 @@ WLang内でのRubyメソッドの呼び出しは一般的ではないので、
|
|
1044
1044
|
|
1045
1045
|
``` ruby
|
1046
1046
|
get '/:id' do
|
1047
|
-
@foo = Foo.find(params[
|
1047
|
+
@foo = Foo.find(params['id'])
|
1048
1048
|
haml '%h1= @foo.name'
|
1049
1049
|
end
|
1050
1050
|
```
|
@@ -1053,7 +1053,7 @@ end
|
|
1053
1053
|
|
1054
1054
|
``` ruby
|
1055
1055
|
get '/:id' do
|
1056
|
-
foo = Foo.find(params[
|
1056
|
+
foo = Foo.find(params['id'])
|
1057
1057
|
haml '%h1= bar.name', :locals => { :bar => foo }
|
1058
1058
|
end
|
1059
1059
|
```
|
@@ -1183,7 +1183,7 @@ end
|
|
1183
1183
|
|
1184
1184
|
get '/foo/*' do
|
1185
1185
|
@note #=> 'Hi!'
|
1186
|
-
params[
|
1186
|
+
params['splat'] #=> 'bar/baz'
|
1187
1187
|
end
|
1188
1188
|
```
|
1189
1189
|
|
@@ -1233,7 +1233,7 @@ helpers do
|
|
1233
1233
|
end
|
1234
1234
|
|
1235
1235
|
get '/:name' do
|
1236
|
-
bar(params[
|
1236
|
+
bar(params['name'])
|
1237
1237
|
end
|
1238
1238
|
```
|
1239
1239
|
|
@@ -1266,7 +1266,7 @@ get '/' do
|
|
1266
1266
|
end
|
1267
1267
|
|
1268
1268
|
get '/:value' do
|
1269
|
-
session[:value] = params[
|
1269
|
+
session[:value] = params['value']
|
1270
1270
|
end
|
1271
1271
|
```
|
1272
1272
|
|
@@ -1280,7 +1280,7 @@ get '/' do
|
|
1280
1280
|
end
|
1281
1281
|
|
1282
1282
|
get '/:value' do
|
1283
|
-
session[:value] = params[
|
1283
|
+
session[:value] = params['value']
|
1284
1284
|
end
|
1285
1285
|
```
|
1286
1286
|
|
@@ -1346,7 +1346,7 @@ halt erb(:error)
|
|
1346
1346
|
|
1347
1347
|
``` ruby
|
1348
1348
|
get '/guess/:who' do
|
1349
|
-
pass unless params[
|
1349
|
+
pass unless params['who'] == 'Frank'
|
1350
1350
|
"見つかっちゃった!"
|
1351
1351
|
end
|
1352
1352
|
|
@@ -1439,19 +1439,17 @@ connections = []
|
|
1439
1439
|
|
1440
1440
|
get '/subscribe' do
|
1441
1441
|
# サーバイベントにおけるクライアントの関心を登録
|
1442
|
-
stream(:keep_open)
|
1443
|
-
|
1444
|
-
|
1445
|
-
|
1446
|
-
|
1447
|
-
# 肯定応答
|
1448
|
-
"subscribed"
|
1442
|
+
stream(:keep_open) do |out|
|
1443
|
+
connections << out
|
1444
|
+
# 死んでいるコネクションを排除
|
1445
|
+
connections.reject!(&:closed?)
|
1446
|
+
end
|
1449
1447
|
end
|
1450
1448
|
|
1451
1449
|
post '/message' do
|
1452
1450
|
connections.each do |out|
|
1453
1451
|
# クライアントへ新規メッセージ到着の通知
|
1454
|
-
out << params[
|
1452
|
+
out << params['message'] << "\n"
|
1455
1453
|
|
1456
1454
|
# クライアントへの再接続の指示
|
1457
1455
|
out.close
|
@@ -1604,7 +1602,7 @@ end
|
|
1604
1602
|
|
1605
1603
|
``` ruby
|
1606
1604
|
get '/article/:id' do
|
1607
|
-
@article = Article.find params[
|
1605
|
+
@article = Article.find params['id']
|
1608
1606
|
last_modified @article.updated_at
|
1609
1607
|
etag @article.sha1
|
1610
1608
|
erb :article
|
@@ -1679,7 +1677,7 @@ send_file 'foo.png', :type => :jpg
|
|
1679
1677
|
<dt>type</dt>
|
1680
1678
|
<dd>コンテンツの種類。設定がない場合、ファイル拡張子から類推される。</dd>
|
1681
1679
|
|
1682
|
-
|
1680
|
+
<dt>disposition</dt>
|
1683
1681
|
<dd>
|
1684
1682
|
Content-Dispositionに使われる。許容値: <tt>nil</tt> (デフォルト)、
|
1685
1683
|
<tt>:attachment</tt> および <tt>:inline</tt>
|
@@ -1697,7 +1695,7 @@ send_file 'foo.png', :type => :jpg
|
|
1697
1695
|
</dl>
|
1698
1696
|
|
1699
1697
|
|
1700
|
-
|
1698
|
+
### リクエストオブジェクトへのアクセス
|
1701
1699
|
|
1702
1700
|
受信するリクエストオブジェクトは、`request`メソッドを通じてリクエストレベル(フィルタ、ルーティング、エラーハンドラ)からアクセスすることができます。
|
1703
1701
|
|
@@ -1937,10 +1935,10 @@ set :protection, :session => true
|
|
1937
1935
|
</dd>
|
1938
1936
|
<dd>デフォルトは無効。</dd>
|
1939
1937
|
|
1940
|
-
<dt>
|
1938
|
+
<dt>add_charset</dt>
|
1941
1939
|
<dd>
|
1942
1940
|
Mimeタイプ <tt>content_type</tt>ヘルパーが自動的にキャラクタセット情報をここに追加する。このオプションは書き換えるのではなく、値を追加するようにすること。
|
1943
|
-
<tt>settings.
|
1941
|
+
<tt>settings.add_charset << "application/foobar"</tt>
|
1944
1942
|
</dd>
|
1945
1943
|
|
1946
1944
|
<dt>app_file</dt>
|
@@ -1949,7 +1947,7 @@ set :protection, :session => true
|
|
1949
1947
|
</dd>
|
1950
1948
|
|
1951
1949
|
<dt>bind</dt>
|
1952
|
-
<dd>バインドするIPアドレス(デフォルト: `environment`がdevelopmentにセットされているときは、<tt>0.0.0.0</tt> <em>または</em> <tt>localhost</tt>)
|
1950
|
+
<dd>バインドするIPアドレス(デフォルト: `environment`がdevelopmentにセットされているときは、<tt>0.0.0.0</tt> <em>または</em> <tt>localhost</tt>)。ビルトインサーバでのみ使われる。</dd>
|
1953
1951
|
|
1954
1952
|
<dt>default_encoding</dt>
|
1955
1953
|
<dd>不明なときに仮定されるエンコーディング(デフォルトは<tt>"utf-8"</tt>)。</dd>
|
@@ -2111,7 +2109,7 @@ end
|
|
2111
2109
|
|
2112
2110
|
``` ruby
|
2113
2111
|
error do
|
2114
|
-
'エラーが発生しました。 - ' + env['sinatra.error'].
|
2112
|
+
'エラーが発生しました。 - ' + env['sinatra.error'].message
|
2115
2113
|
end
|
2116
2114
|
```
|
2117
2115
|
|
@@ -2162,7 +2160,7 @@ Sinatraを開発環境の下で実行している場合は、特別な`not_found
|
|
2162
2160
|
|
2163
2161
|
## Rackミドルウェア(Rack Middleware)
|
2164
2162
|
|
2165
|
-
SinatraはRuby製Webフレームワークのミニマルな標準的インタフェースである[Rack](http://rack.
|
2163
|
+
SinatraはRuby製Webフレームワークのミニマルな標準的インタフェースである[Rack](http://rack.github.io/)上に構築されています。アプリケーションデベロッパーにとってRackにおける最も興味深い機能は、「ミドルウェア(middleware)」をサポートしていることであり、これは、サーバとアプリケーションとの間に置かれ、HTTPリクエスト/レスポンスを監視および/または操作することで、各種の汎用的機能を提供するコンポーネントです。
|
2166
2164
|
|
2167
2165
|
Sinatraはトップレベルの`use`メソッドを通して、Rackミドルウェアパイプラインの構築を楽にします。
|
2168
2166
|
|
@@ -2178,7 +2176,7 @@ get '/hello' do
|
|
2178
2176
|
end
|
2179
2177
|
```
|
2180
2178
|
|
2181
|
-
`use`の文法は、[Rack::Builder](http://
|
2179
|
+
`use`の文法は、[Rack::Builder](http://rubydoc.info/github/rack/rack/master/Rack/Builder)DSLで定義されているそれ(rackupファイルで最もよく使われる)と同じです。例えば `use`メソッドは複数の引数、そしてブロックも取ることができます。
|
2182
2180
|
|
2183
2181
|
``` ruby
|
2184
2182
|
use Rack::Auth::Basic do |username, password|
|
@@ -2200,10 +2198,10 @@ SinatraでのテストはRackベースのテストライブラリまたはフレ
|
|
2200
2198
|
|
2201
2199
|
``` ruby
|
2202
2200
|
require 'my_sinatra_app'
|
2203
|
-
require '
|
2201
|
+
require 'minitest/autorun'
|
2204
2202
|
require 'rack/test'
|
2205
2203
|
|
2206
|
-
class MyAppTest < Test
|
2204
|
+
class MyAppTest < Minitest::Test
|
2207
2205
|
include Rack::Test::Methods
|
2208
2206
|
|
2209
2207
|
def app
|
@@ -2407,8 +2405,8 @@ class LoginScreen < Sinatra::Base
|
|
2407
2405
|
get('/login') { haml :login }
|
2408
2406
|
|
2409
2407
|
post('/login') do
|
2410
|
-
if params[
|
2411
|
-
session['user_name'] = params[
|
2408
|
+
if params['name'] = 'admin' and params['password'] = 'admin'
|
2409
|
+
session['user_name'] = params['name']
|
2412
2410
|
else
|
2413
2411
|
redirect '/login'
|
2414
2412
|
end
|
@@ -2525,8 +2523,8 @@ class MyApp < Sinatra::Base
|
|
2525
2523
|
# '/define_route/:name'のためのリクエストスコープ
|
2526
2524
|
@value = 42
|
2527
2525
|
|
2528
|
-
settings.get("/#{params[
|
2529
|
-
# "/#{params[
|
2526
|
+
settings.get("/#{params['name']}") do
|
2527
|
+
# "/#{params['name']}"のためのリクエストスコープ
|
2530
2528
|
@value # => nil (not the same request)
|
2531
2529
|
end
|
2532
2530
|
|
@@ -2719,7 +2717,7 @@ Sinatraは、[Semantic Versioning](http://semver.org/)におけるSemVerおよ
|
|
2719
2717
|
* [Twitter](http://twitter.com/sinatra)
|
2720
2718
|
* [メーリングリスト](http://groups.google.com/group/sinatrarb/topics)
|
2721
2719
|
* http://freenode.net上のIRC: [#sinatra](irc://chat.freenode.net/#sinatra)
|
2722
|
-
* [Sinatra Book](
|
2720
|
+
* [Sinatra Book](https://github.com/sinatra/sinatra-book/) クックブック、チュートリアル
|
2723
2721
|
* [Sinatra Recipes](http://recipes.sinatrarb.com/) コミュニティによるレシピ集
|
2724
2722
|
* http://rubydoc.info上のAPIドキュメント: [最新版(latest release)用](http://rubydoc.info/gems/sinatra)または[現在のHEAD用](http://rubydoc.info/github/sinatra/sinatra)
|
2725
2723
|
* [CIサーバ](http://travis-ci.org/sinatra/sinatra)
|
data/README.ko.md
CHANGED
@@ -54,11 +54,13 @@ thin이 설치되어 있을 경우 Sinatra는 thin을 통해 실행합니다.
|
|
54
54
|
* [Markdown 템플릿](#markdown-템플릿)
|
55
55
|
* [Textile 템플릿](#textile-템플릿)
|
56
56
|
* [RDoc 템플릿](#rdoc-템플릿)
|
57
|
+
* [AsciiDoc 템플릿](#asciidoc-템플릿)
|
57
58
|
* [Radius 템플릿](#radius-템플릿)
|
58
59
|
* [Markaby 템플릿](#markaby-템플릿)
|
59
60
|
* [RABL 템플릿](#rabl-템플릿)
|
60
61
|
* [Slim 템플릿](#slim-템플릿)
|
61
62
|
* [Creole 템플릿](#creole-템플릿)
|
63
|
+
* [MediaWiki 템플릿](#mediawiki-템플릿)
|
62
64
|
* [CoffeeScript 템플릿](#coffeescript-템플릿)
|
63
65
|
* [Stylus 템플릿](#stylus-템플릿)
|
64
66
|
* [Yajl 템플릿](#yajl-템플릿)
|
@@ -69,6 +71,7 @@ thin이 설치되어 있을 경우 Sinatra는 thin을 통해 실행합니다.
|
|
69
71
|
* [이름을 가지는 템플릿(Named Templates)](#이름을-가지는-템플릿named-templates)
|
70
72
|
* [파일 확장자 연결하기](#파일-확장자-연결하기)
|
71
73
|
* [나만의 고유한 템플릿 엔진 추가하기](#나만의-고유한-템플릿-엔진-추가하기)
|
74
|
+
* [템플릿 검사를 위한 커스텀 로직 사용하기](#템플릿-검사를-위한-커스텀-로직-사용하기)
|
72
75
|
* [필터(Filters)](#필터filters)
|
73
76
|
* [헬퍼(Helpers)](#헬퍼helpers)
|
74
77
|
* [세션(Sessions) 사용하기](#세션sessions-사용하기)
|
@@ -162,8 +165,8 @@ end
|
|
162
165
|
``` ruby
|
163
166
|
get '/hello/:name' do
|
164
167
|
# "GET /hello/foo" 및 "GET /hello/bar"와 매치
|
165
|
-
# params[
|
166
|
-
"Hello #{params[
|
168
|
+
# params['name']은 'foo' 또는 'bar'
|
169
|
+
"Hello #{params['name']}!"
|
167
170
|
end
|
168
171
|
```
|
169
172
|
|
@@ -172,22 +175,23 @@ end
|
|
172
175
|
``` ruby
|
173
176
|
get '/hello/:name' do |n|
|
174
177
|
# "GET /hello/foo" 및 "GET /hello/bar"와 매치
|
175
|
-
# params[
|
178
|
+
# params['name']은 'foo' 또는 'bar'
|
179
|
+
# n 에는 params['name']가 저장
|
176
180
|
"Hello #{n}!"
|
177
181
|
end
|
178
182
|
```
|
179
183
|
|
180
|
-
라우터 패턴에는 스플랫(splat, 또는 와일드카드)도 매개변수도 포함될 수 있으며, 이럴 경우 `params[
|
184
|
+
라우터 패턴에는 스플랫(splat, 또는 와일드카드)도 매개변수도 포함될 수 있으며, 이럴 경우 `params['splat']` 배열을 통해 접근할 수 있습니다.
|
181
185
|
|
182
186
|
``` ruby
|
183
187
|
get '/say/*/to/*' do
|
184
188
|
# /say/hello/to/world와 매치
|
185
|
-
params[
|
189
|
+
params['splat'] # => ["hello", "world"]
|
186
190
|
end
|
187
191
|
|
188
192
|
get '/download/*.*' do
|
189
193
|
# /download/path/to/file.xml과 매치
|
190
|
-
params[
|
194
|
+
params['splat'] # => ["path/to/file", "xml"]
|
191
195
|
end
|
192
196
|
```
|
193
197
|
|
@@ -202,8 +206,8 @@ end
|
|
202
206
|
라우터는 정규표현식으로 매치할 수 있습니다.
|
203
207
|
|
204
208
|
``` ruby
|
205
|
-
get
|
206
|
-
"Hello, #{params[
|
209
|
+
get /\A\/hello\/([\w]+)\z/ do
|
210
|
+
"Hello, #{params['captures'].first}!"
|
207
211
|
end
|
208
212
|
```
|
209
213
|
|
@@ -211,6 +215,7 @@ end
|
|
211
215
|
|
212
216
|
``` ruby
|
213
217
|
get %r{/hello/([\w]+)} do |c|
|
218
|
+
# "GET /meta/hello/world", "GET /hello/world/1234" 등과 매치
|
214
219
|
"Hello, #{c}!"
|
215
220
|
end
|
216
221
|
```
|
@@ -223,6 +228,17 @@ get '/posts.?:format?' do
|
|
223
228
|
end
|
224
229
|
```
|
225
230
|
|
231
|
+
쿼리 파라메터로도 이용가능 합니다.
|
232
|
+
|
233
|
+
``` ruby
|
234
|
+
get '/posts' do
|
235
|
+
# matches "GET /posts?title=foo&author=bar"
|
236
|
+
title = params['title']
|
237
|
+
author = params['author']
|
238
|
+
# uses title and author variables; query is optional to the /posts route
|
239
|
+
end
|
240
|
+
```
|
241
|
+
|
226
242
|
한편, 경로 탐색 공격 방지(path traversal attack protection, 아래 참조)를 비활성화시키지 않았다면,
|
227
243
|
요청 경로는 라우터와 매칭되기 이전에 수정될 수 있습니다.
|
228
244
|
|
@@ -232,7 +248,7 @@ end
|
|
232
248
|
|
233
249
|
``` ruby
|
234
250
|
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
|
235
|
-
"Songbird 버전 #{params[
|
251
|
+
"Songbird 버전 #{params['agent'][0]}을 사용하는군요!"
|
236
252
|
end
|
237
253
|
|
238
254
|
get '/foo' do
|
@@ -255,6 +271,7 @@ get '/', :provides => ['rss', 'atom', 'xml'] do
|
|
255
271
|
builder :feed
|
256
272
|
end
|
257
273
|
```
|
274
|
+
`provides`는 request의 허용된 해더를 검색합니다.
|
258
275
|
|
259
276
|
사용자 정의 조건도 쉽게 만들 수 있습니다.
|
260
277
|
|
@@ -451,8 +468,9 @@ render 메서드에서 전달된 옵션값들은 `set`을 통해 설정한 옵
|
|
451
468
|
|
452
469
|
<dt>layout</dt>
|
453
470
|
<dd>
|
454
|
-
레이아웃을 사용할지 여부 (<tt>true</tt> 또는 <tt>false</tt>), 만약
|
455
|
-
사용할 템플릿을 지정. 예제:
|
471
|
+
레이아웃을 사용할지 여부 (<tt>true</tt> 또는 <tt>false</tt>), 만약
|
472
|
+
이 값이 심볼일 경우, 사용할 템플릿을 지정. 예제:
|
473
|
+
<tt>erb :index, :layout => !request.xhr?</tt>
|
456
474
|
</dd>
|
457
475
|
|
458
476
|
<dt>content_type</dt>
|
@@ -545,7 +563,7 @@ get('/') { markdown :index }
|
|
545
563
|
<table>
|
546
564
|
<tr>
|
547
565
|
<td>의존성</td>
|
548
|
-
<td><a href="
|
566
|
+
<td><a href="https://github.com/jimweirich/builder">builder</a></td>
|
549
567
|
</tr>
|
550
568
|
<tr>
|
551
569
|
<td>파일 확장자</td>
|
@@ -658,8 +676,8 @@ Liquid 템플릿에서는 루비 메서드(`yield` 제외)를 호출할 수 없
|
|
658
676
|
<a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
|
659
677
|
<a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
|
660
678
|
<a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
|
661
|
-
<a href="http://kramdown.
|
662
|
-
<a href="
|
679
|
+
<a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
|
680
|
+
<a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
|
663
681
|
중 아무거나
|
664
682
|
</td>
|
665
683
|
</tr>
|
@@ -731,7 +749,7 @@ Textile에서 루비를 호출할 수 없기 때문에, Textile으로 작성된
|
|
731
749
|
<table>
|
732
750
|
<tr>
|
733
751
|
<td>의존성</td>
|
734
|
-
<td><a href="http://rdoc.
|
752
|
+
<td><a href="http://rdoc.sourceforge.net/" title="RDoc">rdoc</a></td>
|
735
753
|
</tr>
|
736
754
|
<tr>
|
737
755
|
<td>파일 확장자</td>
|
@@ -761,12 +779,32 @@ RDoc에서 루비를 호출할 수 없기 때문에, RDoc으로 작성된 레이
|
|
761
779
|
사용할 수 없습니다. 하지만, `:layout_engine` 옵션으로 레이아웃의 템플릿을
|
762
780
|
다른 렌더링 엔진으로 렌더링 할 수는 있습니다.
|
763
781
|
|
782
|
+
#### AsciiDoc 템플릿
|
783
|
+
|
784
|
+
<table>
|
785
|
+
<tr>
|
786
|
+
<td>의존성</td>
|
787
|
+
<td><a href="http://asciidoctor.org/" title="Asciidoctor">Asciidoctor</a></td>
|
788
|
+
</tr>
|
789
|
+
<tr>
|
790
|
+
<td>파일 확장자</td>
|
791
|
+
<td><tt>.asciidoc</tt>, <tt>.adoc</tt> and <tt>.ad</tt></td>
|
792
|
+
</tr>
|
793
|
+
<tr>
|
794
|
+
<td>예제</td>
|
795
|
+
<td><tt>asciidoc :README, :layout_engine => :erb</tt></td>
|
796
|
+
</tr>
|
797
|
+
</table>
|
798
|
+
|
799
|
+
AsciiDoc 템플릿에서는 루비 메서드를 호출할 수 없기
|
800
|
+
때문에, 거의 대부분의 경우 locals를 전달해야 합니다.
|
801
|
+
|
764
802
|
#### Radius 템플릿
|
765
803
|
|
766
804
|
<table>
|
767
805
|
<tr>
|
768
806
|
<td>의존성</td>
|
769
|
-
<td><a href="
|
807
|
+
<td><a href="https://github.com/jlong/radius" title="Radius">radius</a></td>
|
770
808
|
</tr>
|
771
809
|
<tr>
|
772
810
|
<td>파일 확장자</td>
|
@@ -869,6 +907,41 @@ Creole에서 루비를 호출할 수 없기 때문에, Creole으로 작성된
|
|
869
907
|
사용할 수 없습니다. 하지만, `:layout_engine` 옵션으로 레이아웃의 템플릿을
|
870
908
|
다른 렌더링 엔진으로 렌더링 할 수는 있습니다.
|
871
909
|
|
910
|
+
#### MediaWiki 템플릿
|
911
|
+
|
912
|
+
<table>
|
913
|
+
<tr>
|
914
|
+
<td>의존성</td>
|
915
|
+
<td><a href="https://github.com/nricciar/wikicloth" title="WikiCloth">WikiCloth</a></td>
|
916
|
+
</tr>
|
917
|
+
<tr>
|
918
|
+
<td>파일 확장자</td>
|
919
|
+
<td><tt>.mediawiki</tt> and <tt>.mw</tt></td>
|
920
|
+
</tr>
|
921
|
+
<tr>
|
922
|
+
<td>예제</td>
|
923
|
+
<td><tt>mediawiki :wiki, :layout_engine => :erb</tt></td>
|
924
|
+
</tr>
|
925
|
+
</table>
|
926
|
+
|
927
|
+
MediaWiki 마크업에서는 메서드 호출 뿐 아니라 locals 전달도 불가능합니다.
|
928
|
+
따라서 일반적으로는 다른 렌더링 엔진과 함께 사용하게 됩니다.
|
929
|
+
|
930
|
+
``` ruby
|
931
|
+
erb :overview, :locals => { :text => mediawiki(:introduction) }
|
932
|
+
```
|
933
|
+
|
934
|
+
다른 템플릿 속에서 `mediawiki` 메서드를 호출할 수도 있습니다.
|
935
|
+
|
936
|
+
``` ruby
|
937
|
+
%h1 Hello From Haml!
|
938
|
+
%p= mediawiki(:greetings)
|
939
|
+
```
|
940
|
+
|
941
|
+
MediaWiki에서 루비를 호출할 수 없기 때문에, MediaWiki으로 작성된 레이아웃은
|
942
|
+
사용할 수 없습니다. 하지만, `:layout_engine` 옵션으로 레이아웃의 템플릿을
|
943
|
+
다른 렌더링 엔진으로 렌더링 할 수는 있습니다.
|
944
|
+
|
872
945
|
#### CoffeeScript 템플릿
|
873
946
|
|
874
947
|
<table>
|
@@ -985,8 +1058,8 @@ present(resource);
|
|
985
1058
|
</tr>
|
986
1059
|
</table>
|
987
1060
|
|
988
|
-
WLang 템플릿에서는 루비
|
989
|
-
때문에, 거의 대부분의 경우 locals를
|
1061
|
+
WLang 템플릿에서는 루비 메서드를 사용하는게 일반적이지 않기
|
1062
|
+
때문에, 거의 대부분의 경우 locals를 전달합니다. 그래도
|
990
1063
|
WLang으로 쓰여진 레이아웃과 `yield`는 지원합니다.
|
991
1064
|
|
992
1065
|
### 템플릿에서 변수에 접근하기
|
@@ -996,7 +1069,7 @@ WLang으로 쓰여진 레이아웃과 `yield`는 지원합니다.
|
|
996
1069
|
|
997
1070
|
``` ruby
|
998
1071
|
get '/:id' do
|
999
|
-
@foo = Foo.find(params[
|
1072
|
+
@foo = Foo.find(params['id'])
|
1000
1073
|
haml '%h1= @foo.name'
|
1001
1074
|
end
|
1002
1075
|
```
|
@@ -1005,7 +1078,7 @@ end
|
|
1005
1078
|
|
1006
1079
|
``` ruby
|
1007
1080
|
get '/:id' do
|
1008
|
-
foo = Foo.find(params[
|
1081
|
+
foo = Foo.find(params['id'])
|
1009
1082
|
haml '%h1= bar.name', :locals => { :bar => foo }
|
1010
1083
|
end
|
1011
1084
|
```
|
@@ -1131,6 +1204,22 @@ end
|
|
1131
1204
|
위 코드는 `./views/index.myat` 를 렌더합니다.
|
1132
1205
|
Tilt에 대한 더 자세한 내용은 https://github.com/rtomayko/tilt 참조하세요.
|
1133
1206
|
|
1207
|
+
### 템플릿 검사를 위한 커스텀 로직 사용하기
|
1208
|
+
|
1209
|
+
고유한 템플릿 룩업을 구현하기 위해서는 `#find_template` 메서드를 만드셔야 합니다.
|
1210
|
+
|
1211
|
+
``` ruby
|
1212
|
+
configure do
|
1213
|
+
set :views [ './views/a', './views/b' ]
|
1214
|
+
end
|
1215
|
+
|
1216
|
+
def find_template(views, name, engine, &block)
|
1217
|
+
Array(views).each do |v|
|
1218
|
+
super(v, name, engine, &block)
|
1219
|
+
end
|
1220
|
+
end
|
1221
|
+
```
|
1222
|
+
|
1134
1223
|
## 필터(Filters)
|
1135
1224
|
|
1136
1225
|
사전 필터(before filter)는 라우터와 동일한 맥락에서 매 요청 전에 평가되며
|
@@ -1145,7 +1234,7 @@ end
|
|
1145
1234
|
|
1146
1235
|
get '/foo/*' do
|
1147
1236
|
@note #=> 'Hi!'
|
1148
|
-
params[
|
1237
|
+
params['splat'] #=> 'bar/baz'
|
1149
1238
|
end
|
1150
1239
|
```
|
1151
1240
|
|
@@ -1172,7 +1261,7 @@ before '/protected/*' do
|
|
1172
1261
|
end
|
1173
1262
|
|
1174
1263
|
after '/create/:slug' do |slug|
|
1175
|
-
session[
|
1264
|
+
session['last_slug'] = slug
|
1176
1265
|
end
|
1177
1266
|
```
|
1178
1267
|
|
@@ -1201,7 +1290,7 @@ helpers do
|
|
1201
1290
|
end
|
1202
1291
|
|
1203
1292
|
get '/:name' do
|
1204
|
-
bar(params[
|
1293
|
+
bar(params['name'])
|
1205
1294
|
end
|
1206
1295
|
```
|
1207
1296
|
|
@@ -1230,11 +1319,11 @@ helpers FooUtils, BarUtils
|
|
1230
1319
|
enable :sessions
|
1231
1320
|
|
1232
1321
|
get '/' do
|
1233
|
-
"value = " << session[
|
1322
|
+
"value = " << session['value'].inspect
|
1234
1323
|
end
|
1235
1324
|
|
1236
1325
|
get '/:value' do
|
1237
|
-
session[
|
1326
|
+
session['value'] = params['value']
|
1238
1327
|
end
|
1239
1328
|
```
|
1240
1329
|
|
@@ -1249,11 +1338,11 @@ end
|
|
1249
1338
|
use Rack::Session::Pool, :expire_after => 2592000
|
1250
1339
|
|
1251
1340
|
get '/' do
|
1252
|
-
"value = " << session[
|
1341
|
+
"value = " << session['value'].inspect
|
1253
1342
|
end
|
1254
1343
|
|
1255
1344
|
get '/:value' do
|
1256
|
-
session[
|
1345
|
+
session['value'] = params['value']
|
1257
1346
|
end
|
1258
1347
|
```
|
1259
1348
|
|
@@ -1324,7 +1413,7 @@ halt erb(:error)
|
|
1324
1413
|
|
1325
1414
|
``` ruby
|
1326
1415
|
get '/guess/:who' do
|
1327
|
-
pass unless params[
|
1416
|
+
pass unless params['who'] == 'Frank'
|
1328
1417
|
'You got me!'
|
1329
1418
|
end
|
1330
1419
|
|
@@ -1440,19 +1529,17 @@ connections = []
|
|
1440
1529
|
|
1441
1530
|
get '/subscribe' do
|
1442
1531
|
# register a client's interest in server events
|
1443
|
-
stream(:keep_open)
|
1444
|
-
|
1445
|
-
|
1446
|
-
|
1447
|
-
|
1448
|
-
# acknowledge
|
1449
|
-
"subscribed"
|
1532
|
+
stream(:keep_open) do |out|
|
1533
|
+
connections << out
|
1534
|
+
# purge dead connections
|
1535
|
+
connections.reject!(&:closed?)
|
1536
|
+
end
|
1450
1537
|
end
|
1451
1538
|
|
1452
|
-
post '
|
1539
|
+
post '/:message' do
|
1453
1540
|
connections.each do |out|
|
1454
1541
|
# notify client that a new message has arrived
|
1455
|
-
out << params[
|
1542
|
+
out << params['message'] << "\n"
|
1456
1543
|
|
1457
1544
|
# indicate client to connect again
|
1458
1545
|
out.close
|
@@ -1572,12 +1659,12 @@ redirect to('/bar?sum=42')
|
|
1572
1659
|
enable :sessions
|
1573
1660
|
|
1574
1661
|
get '/foo' do
|
1575
|
-
session[
|
1662
|
+
session['secret'] = 'foo'
|
1576
1663
|
redirect to('/bar')
|
1577
1664
|
end
|
1578
1665
|
|
1579
1666
|
get '/bar' do
|
1580
|
-
session[
|
1667
|
+
session['secret']
|
1581
1668
|
end
|
1582
1669
|
```
|
1583
1670
|
|
@@ -1611,14 +1698,14 @@ before do
|
|
1611
1698
|
end
|
1612
1699
|
```
|
1613
1700
|
|
1614
|
-
캐시를 잘 사용하려면, `etag` 또는 `last_modified
|
1701
|
+
캐시를 잘 사용하려면, `etag` 또는 `last_modified`을 사용해 보세요.
|
1615
1702
|
무거운 작업을 하기 *전*에 이들 헬퍼를 호출하길 권장합니다. 이렇게 하면,
|
1616
1703
|
클라이언트 캐시에 현재 버전이 이미 들어 있을 경우엔 즉각 응답을
|
1617
1704
|
뿌릴(flush) 것입니다.
|
1618
1705
|
|
1619
1706
|
``` ruby
|
1620
|
-
get
|
1621
|
-
@article = Article.find params[
|
1707
|
+
get "/article/:id" do
|
1708
|
+
@article = Article.find params['id']
|
1622
1709
|
last_modified @article.updated_at
|
1623
1710
|
etag @article.sha1
|
1624
1711
|
erb :article
|
@@ -1674,7 +1761,7 @@ etag '', :new_resource => true, :kind => :weak
|
|
1674
1761
|
|
1675
1762
|
### 파일 전송하기(Sending Files)
|
1676
1763
|
|
1677
|
-
|
1764
|
+
응답(response)으로 파일의 컨탠츠를 리턴하려면, `send_file` 헬퍼 메서드를 사용하면 됩니다.
|
1678
1765
|
|
1679
1766
|
``` ruby
|
1680
1767
|
get '/' do
|
@@ -1692,22 +1779,22 @@ send_file 'foo.png', :type => :jpg
|
|
1692
1779
|
|
1693
1780
|
<dl>
|
1694
1781
|
<dt>filename</dt>
|
1695
|
-
<dd
|
1782
|
+
<dd>응답에서 사용되는 파일명. 기본값은 실제 파일명.</dd>
|
1696
1783
|
|
1697
1784
|
<dt>last_modified</dt>
|
1698
1785
|
<dd>Last-Modified 헤더값. 기본값은 파일의 mtime.</dd>
|
1699
1786
|
|
1700
1787
|
<dt>type</dt>
|
1701
|
-
<dd
|
1788
|
+
<dd>Content-Type 헤더값. 없으면 파일 확장자로부터 유추.</dd>
|
1702
1789
|
|
1703
1790
|
<dt>disposition</dt>
|
1704
1791
|
<dd>
|
1705
|
-
Content-Disposition
|
1792
|
+
Content-Disposition 헤더값. 가능한 값들: <tt>nil</tt> (기본값),
|
1706
1793
|
<tt>:attachment</tt> 및 <tt>:inline</tt>
|
1707
1794
|
</dd>
|
1708
1795
|
|
1709
1796
|
<dt>length</dt>
|
1710
|
-
<dd>Content-Length
|
1797
|
+
<dd>Content-Length 헤더값, 기본값은 파일 크기.</dd>
|
1711
1798
|
|
1712
1799
|
<dt>status</dt>
|
1713
1800
|
<dd>
|
@@ -1980,11 +2067,11 @@ set :protection, :session => true
|
|
1980
2067
|
</dd>
|
1981
2068
|
<dd>기본값은 비활성.</dd>
|
1982
2069
|
|
1983
|
-
<dt>
|
2070
|
+
<dt>add_charset</dt>
|
1984
2071
|
<dd>
|
1985
2072
|
<tt>content_type</tt>가 문자셋 정보에 자동으로 추가하게 될 마임(mime) 타입.
|
1986
2073
|
이 옵션은 오버라이딩하지 말고 추가해야 함.
|
1987
|
-
<tt>settings.
|
2074
|
+
<tt>settings.add_charset << "application/foobar"</tt>
|
1988
2075
|
</dd>
|
1989
2076
|
|
1990
2077
|
<dt>app_file</dt>
|
@@ -1994,7 +2081,9 @@ set :protection, :session => true
|
|
1994
2081
|
</dd>
|
1995
2082
|
|
1996
2083
|
<dt>bind</dt>
|
1997
|
-
<dd>바인드할 IP 주소(기본값: <tt>0.0.0.0</tt> <em>이나</em>
|
2084
|
+
<dd>바인드할 IP 주소(기본값: <tt>0.0.0.0</tt> <em>이나</em>
|
2085
|
+
`environment`가 개발로 설정 되어있으면 <tt>localhost</tt>). 오직
|
2086
|
+
빌트인(built-in) 서버에서만 사용됨.</dd>
|
1998
2087
|
|
1999
2088
|
<dt>default_encoding</dt>
|
2000
2089
|
<dd>인코딩을 알 수 없을 때 인코딩(기본값은 <tt>"utf-8"</tt>).</dd>
|
@@ -2180,15 +2269,22 @@ end
|
|
2180
2269
|
### 에러
|
2181
2270
|
|
2182
2271
|
`error` 핸들러는 라우터 또는 필터에서 뭐든 오류가 발생할 경우에 호출됩니다.
|
2272
|
+
하지만 개발 환경에서는 예외 확인 옵션을 `:after_handler`로 설정되어 있을 경우에만
|
2273
|
+
실행됨을 주의하세요.
|
2274
|
+
|
2275
|
+
``` ruby
|
2276
|
+
set :show_exceptions, :after_handler
|
2277
|
+
```
|
2278
|
+
|
2183
2279
|
예외 객체는 Rack 변수 `sinatra.error`로부터 얻을 수 있습니다.
|
2184
2280
|
|
2185
2281
|
``` ruby
|
2186
2282
|
error do
|
2187
|
-
'고약한 오류가 발생했군요 - ' + env['sinatra.error'].
|
2283
|
+
'고약한 오류가 발생했군요 - ' + env['sinatra.error'].message
|
2188
2284
|
end
|
2189
2285
|
```
|
2190
2286
|
|
2191
|
-
사용자 정의 오류는 이렇게
|
2287
|
+
사용자 정의 오류는 이렇게 정의합니다.
|
2192
2288
|
|
2193
2289
|
``` ruby
|
2194
2290
|
error MyCustomError do
|
@@ -2196,7 +2292,7 @@ error MyCustomError do
|
|
2196
2292
|
end
|
2197
2293
|
```
|
2198
2294
|
|
2199
|
-
그런 다음, 이 오류가 발생하면 이렇게
|
2295
|
+
그런 다음, 이 오류가 발생하면 이렇게 처리합니다.
|
2200
2296
|
|
2201
2297
|
``` ruby
|
2202
2298
|
get '/' do
|
@@ -2233,9 +2329,9 @@ end
|
|
2233
2329
|
Sinatra는 개발 환경에서 동작할 때 브라우저에 괜찮은 스택 트레이스와 추가적인
|
2234
2330
|
디버그 정보를 보여주기 위해 특별한 `not_found` 와 `error` 핸들러를 설치합니다.
|
2235
2331
|
|
2236
|
-
## Rack 미들웨어(
|
2332
|
+
## Rack 미들웨어(Middleware)
|
2237
2333
|
|
2238
|
-
Sinatra는 [Rack](http://rack.
|
2334
|
+
Sinatra는 [Rack](http://rack.github.io/) 위에서 동작하며, Rack은 루비 웹
|
2239
2335
|
프레임워크를 위한 최소한의 표준 인터페이스입니다. Rack이 애플리케이션 개발자들에게
|
2240
2336
|
제공하는 가장 흥미로운 기능은 "미들웨어(middleware)"에 대한 지원입니다.
|
2241
2337
|
여기서 미들웨어란 서버와 여러분의 애플리케이션 사이에 위치하면서 HTTP 요청/응답을
|
@@ -2256,7 +2352,7 @@ get '/hello' do
|
|
2256
2352
|
end
|
2257
2353
|
```
|
2258
2354
|
|
2259
|
-
`use`문법은 [Rack::Builder](http://
|
2355
|
+
`use`문법은 [Rack::Builder](http://rubydoc.info/github/rack/rack/master/Rack/Builder) DSL
|
2260
2356
|
(rackup 파일에서 가장 많이 사용)에서 정의한 것과 동일합니다. 예를 들어, `use` 메서드는
|
2261
2357
|
블록이나 여러 개의/가변적인 인자도 받을 수 있습니다.
|
2262
2358
|
|
@@ -2283,10 +2379,10 @@ Sinatra 테스트는 많은 Rack 기반 테스팅 라이브러리, 프레임워
|
|
2283
2379
|
|
2284
2380
|
``` ruby
|
2285
2381
|
require 'my_sinatra_app'
|
2286
|
-
require '
|
2382
|
+
require 'minitest/autorun'
|
2287
2383
|
require 'rack/test'
|
2288
2384
|
|
2289
|
-
class MyAppTest < Test
|
2385
|
+
class MyAppTest < Minitest::Test
|
2290
2386
|
include Rack::Test::Methods
|
2291
2387
|
|
2292
2388
|
def app
|
@@ -2485,8 +2581,8 @@ class LoginScreen < Sinatra::Base
|
|
2485
2581
|
get('/login') { haml :login }
|
2486
2582
|
|
2487
2583
|
post('/login') do
|
2488
|
-
if params[
|
2489
|
-
session['user_name'] = params[
|
2584
|
+
if params['name'] == 'admin' && params['password'] == 'admin'
|
2585
|
+
session['user_name'] = params['name']
|
2490
2586
|
else
|
2491
2587
|
redirect '/login'
|
2492
2588
|
end
|
@@ -2607,8 +2703,8 @@ class MyApp < Sinatra::Base
|
|
2607
2703
|
# '/define_route/:name'의 요청 범위
|
2608
2704
|
@value = 42
|
2609
2705
|
|
2610
|
-
settings.get("/#{params[
|
2611
|
-
# "/#{params[
|
2706
|
+
settings.get("/#{params['name']}") do
|
2707
|
+
# "/#{params['name']}"의 요청 범위
|
2612
2708
|
@value # => nil (동일한 요청이 아님)
|
2613
2709
|
end
|
2614
2710
|
|
@@ -2687,9 +2783,9 @@ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
|
|
2687
2783
|
중단되지 않을 것입니다.
|
2688
2784
|
</dd>
|
2689
2785
|
|
2690
|
-
<dt>Ruby 2.
|
2786
|
+
<dt>Ruby 2.x</dt>
|
2691
2787
|
<dd>
|
2692
|
-
2.
|
2788
|
+
2.x은 완전하게 지원되고 권장합니다. 현재 공식 지원 중지 계획은 없습니다.
|
2693
2789
|
</dd>
|
2694
2790
|
|
2695
2791
|
<dt>Rubinius</dt>
|
@@ -2720,9 +2816,9 @@ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
|
|
2720
2816
|
지원되는 플랫폼에서는 그러지 않을 경우, 우리의 문제가 아니라 그 플랫폼의 문제로
|
2721
2817
|
간주한다는 뜻입니다.
|
2722
2818
|
|
2723
|
-
또한 우리는 CI를 ruby-head (
|
2819
|
+
또한 우리는 CI를 ruby-head (MRI의 이후 릴리즈) 브랜치에 맞춰 실행하지만,
|
2724
2820
|
계속해서 변하고 있기 때문에 아무 것도 보장할 수는 없습니다.
|
2725
|
-
2.
|
2821
|
+
앞으로 나올 2.x가 완전히 지원되길 기대합시다.
|
2726
2822
|
|
2727
2823
|
Sinatra는 선택한 루비 구현체가 지원하는 어떠한 운영체제에서도 작동해야
|
2728
2824
|
합니다.
|
@@ -2825,7 +2921,7 @@ SemVerTag를 준수합니다.
|
|
2825
2921
|
* [트위터](http://twitter.com/sinatra)
|
2826
2922
|
* [메일링 리스트](http://groups.google.com/group/sinatrarb/topics)
|
2827
2923
|
* IRC: [#sinatra](irc://chat.freenode.net/#sinatra) http://freenode.net
|
2828
|
-
* [Sinatra Book](
|
2924
|
+
* [Sinatra Book](https://github.com/sinatra/sinatra-book/) Cookbook 튜토리얼
|
2829
2925
|
* [Sinatra Recipes](http://recipes.sinatrarb.com/) 커뮤니티가 만드는 레시피
|
2830
2926
|
* http://rubydoc.info에 있는 [최종 릴리스](http://rubydoc.info/gems/sinatra)
|
2831
2927
|
또는 [current HEAD](http://rubydoc.info/github/sinatra/sinatra)에 대한 API 문서
|