File: README.jp.rdoc

package info (click to toggle)
libsinatra-ruby 1.0.really1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 484 kB
  • ctags: 329
  • sloc: ruby: 4,669; makefile: 36; sh: 12
file content (552 lines) | stat: -rw-r--r-- 17,801 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
= Sinatra

SinatraはRubyで下記のような最小労力で手早くウェブアプリケーションを作成するためのDSLです。

  # myapp.rb
  require 'rubygems'
  require 'sinatra'
  get '/' do
    'Hello world!'
  end

gemをインストールして動かしてみる。

  sudo gem install sinatra
  ruby myapp.rb

http://localhost:4567 を見る。

== ルート

Sinatraでは、ルートはHTTPメソッドとURLマッチングパターンがペアになっています。
ルートはブロックに結び付けられています。

  get '/' do
    .. 何か見せる ..
  end

  post '/' do
    .. 何か生成する ..
  end

  put '/' do
    .. 何か更新する ..
  end

  delete '/' do
    .. 何か削除する ..
  end

ルートは定義された順番にマッチします。 リクエストに最初にマッチしたルートが呼び出されます。

ルートのパターンは名前付きパラメータを含むことができ、
<tt>params</tt>ハッシュで取得できます。

  get '/hello/:name' do
    # matches "GET /hello/foo" and "GET /hello/bar"
    # params[:name] is 'foo' or 'bar'
    "Hello #{params[:name]}!"
  end

また、ブロックパラメータで名前付きパラメータにアクセスすることもできます。

  get '/hello/:name' do |n|
    "Hello #{n}!"
  end

ルートパターンはsplat(またはワイルドカード)を含むこともでき、
<tt>params[:splat]</tt> で取得できます。

  get '/say/*/to/*' do
    # matches /say/hello/to/world
    params[:splat] # => ["hello", "world"]
  end

  get '/download/*.*' do
    # matches /download/path/to/file.xml
    params[:splat] # => ["path/to/file", "xml"]
  end

正規表現を使ったルート:

  get %r{/hello/([\w]+)} do
    "Hello, #{params[:captures].first}!"
  end

ブロックパラーメータを使用した場合:

  get %r{/hello/([\w]+)} do |c|
    "Hello, #{c}!"
  end

ルートにはユーザエージェントのようなさまざまな条件を含めることができます。

  get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
    "You're using Songbird version #{params[:agent][0]}"
  end

  get '/foo' do
    # Matches non-songbird browsers
  end

== 静的ファイル

静的ファイルは<tt>./public</tt>ディレクトリから配信されます。
<tt>:public</tt>オプションを指定することで別の場所を指定することができます。

  set :public, File.dirname(__FILE__) + '/static'

注意: この静的ファイル用のディレクトリ名はURL中に含まれません。
例えば、<tt>./public/css/style.css</tt>は<tt>http://example.com/css/style.css</tt>でアクセスできます。

== ビュー / テンプレート

テンプレートは<tt>./views</tt>ディレクトリ下に配置されています。
他のディレクトリを使用する場合の例:

  set :views, File.dirname(__FILE__) + '/templates'

テンプレートはシンボルを使用して参照させることを覚えておいて下さい。
サブデレクトリでもこの場合は<tt>:'subdir/template'</tt>のようにします。
レンダリングメソッドは文字列が渡されると、そのまま文字列を出力します。

=== Haml テンプレート

hamlを使うにはhamlライブラリが必要です:

  ## hamlを読み込みます
  require 'haml'

  get '/' do
    haml :index
  end

<tt>./views/index.haml</tt>を表示します。

{Haml's options}[http://haml.hamptoncatlin.com/docs/rdoc/classes/Haml.html]
はSinatraの設定でグローバルに設定することができます。
{Options and Configurations}[http://www.sinatrarb.com/configuration.html],
を参照してそれぞれ設定を上書きして下さい。

  set :haml, {:format => :html5 } # デフォルトのフォーマットは:xhtml

  get '/' do
    haml :index, :haml_options => {:format => :html4 } # 上書き
  end


=== Erb テンプレート

  ## erbを読み込みます
  require 'erb'

  get '/' do
    erb :index
  end

<tt>./views/index.erb</tt>を表示します。

=== Builder テンプレート

builderを使うにはbuilderライブラリが必要です:

  ## builderを読み込みます
  require 'builder'

  get '/' do
    content_type 'application/xml', :charset => 'utf-8'
    builder :index
  end

<tt>./views/index.builder</tt>を表示します。

=== Sass テンプレート

Sassテンプレートを使うにはsassライブラリが必要です:

  ## hamlかsassを読み込みます
  require 'sass'

  get '/stylesheet.css' do
    content_type 'text/css', :charset => 'utf-8'
    sass :stylesheet
  end

<tt>./views/stylesheet.sass</tt>を表示します。

{Sass' options}[http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html]
はSinatraの設定でグローバルに設定することができます。
see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
を参照してそれぞれ設定を上書きして下さい。

  set :sass, {:style => :compact } # デフォルトのSass styleは :nested

  get '/stylesheet.css' do
    content_type 'text/css', :charset => 'utf-8'
    sass :stylesheet, :sass_options => {:style => :expanded } # 上書き
  end


=== インラインテンプレート

  get '/' do
    haml '%div.title Hello World'
  end

文字列をテンプレートとして表示します。

=== テンプレート内で変数にアクセスする

テンプレートはルートハンドラと同じコンテキストの中で評価されます。. ルートハンドラでセットされたインスタンス変数は
テンプレート内で直接使うことができます。

  get '/:id' do
    @foo = Foo.find(params[:id])
    haml '%h1= @foo.name'
  end

ローカル変数を明示的に定義することもできます。

  get '/:id' do
    foo = Foo.find(params[:id])
    haml '%h1= foo.name', :locals => { :foo => foo }
  end

このやり方は他のテンプレート内で部分テンプレートとして表示する時に典型的に使用されます。

=== ファイル内テンプレート

テンプレートはソースファイルの最後で定義することもできます。

  require 'rubygems'
  require 'sinatra'

  get '/' do
    haml :index
  end

  __END__

  @@ layout
  %html
    = yield

  @@ index
  %div.title Hello world!!!!!

注意: sinatraをrequireするファイル内で定義されたファイル内テンプレートは自動的に読み込まれます。
他のファイルで定義されているテンプレートを使うには <tt>use_in_file_templates!</tt>メソッドで指定します。

=== 名前付きテンプレート

テンプレートはトップレベルの<tt>template</tt>メソッドで定義することができます。

  template :layout do
    "%html\n  =yield\n"
  end

  template :index do
    '%div.title Hello World!'
  end

  get '/' do
    haml :index
  end

「layout」というテンプレートが存在する場合、そのテンプレートファイルは他のテンプレートが
表示される度に使用されます。<tt>:layout => false</tt>.することでlayoutsを無効にできます。

  get '/' do
    haml :index, :layout => !request.xhr?
  end

== ヘルパー

トップレベルの<tt>helpers</tt>を使用してルートハンドラやテンプレートで使うヘルパメソッドを
定義できます。

  helpers do
    def bar(name)
      "#{name}bar"
    end
  end

  get '/:name' do
    bar(params[:name])
  end

== フィルタ

beforeフィルタはリクエストされたコンテキストを実行する前に評価され、
リクエストとレスポンスを変更することができます。フィルタ内でセットされた
インスタンス変数はルーティングとテンプレートで使用できます。

  before do
    @note = 'Hi!'
    request.path_info = '/foo/bar/baz'
  end

  get '/foo/*' do
    @note #=> 'Hi!'
    params[:splat] #=> 'bar/baz'
  end

== 強制終了

ルートかbeforeフィルタ内で直ちに実行を終了する方法:

  halt

body部を指定することもできます ...

  halt 'ここにbodyを書く'

ステータスとbody部を指定する ...

  halt 401, '立ち去れ!'

== パッシング(Passing)

ルートは<tt>pass</tt>を使って次のルートに飛ばすことができます:

  get '/guess/:who' do
    pass unless params[:who] == 'Frank'
    "見つかっちゃった!"
  end

  get '/guess/*' do
    "はずれです!"
  end

ルートブロックからすぐに抜け出し、次にマッチするルートを実行します。
マッチするルートが見当たらない場合は404が返されます。

== 設定

どの環境でも起動時に1回だけ実行されます。

  configure do
    ...
  end

環境変数<tt>:production</tt>(RACK_ENV環境変数) がセットされている時だけ実行する方法:

  configure :production do
    ...
  end

環境変数<tt>:production</tt> か<tt>:test</tt>の場合に設定する方法:

  configure :production, :test do
    ...
  end

== エラーハンドリング

エラーハンドラーはルートコンテキストとbeforeフィルタ内で実行します。
<tt>haml</tt>、<tt>erb</tt>、<tt>halt</tt>などを使うこともできます。

=== Not Found

<tt>Sinatra::NotFound</tt>が起きた時か レスポンスのステータスコードが
404の時に<tt>not_found</tt>ハンドラーが発動します。

  not_found do
    'ファイルが存在しません'
  end

=== エラー

+error+ ハンドラーはルートブロックかbeforeフィルタ内で例外が発生した時はいつでも発動します。
block or before filter. 例外オブジェクトはRack変数<tt>sinatra.error</tt>から取得されます。

  error do
    'エラーが発生しました。 - ' + env['sinatra.error'].name
  end

エラーをカスタマイズする場合は、

  error MyCustomError do
    'エラーメッセージ...' + request.env['sinatra.error'].message
  end

と書いておいて,下記のように呼び出します。

  get '/' do
    raise MyCustomError, '何かがまずかったようです'
  end

そうするとこうなります:

  エラーメッセージ... 何かがまずかったようです

開発環境として実行している場合、Sinatraは特別な<tt>not_found</tt>と<tt>error</tt>ハンドラーを
インストールしています。

== MIMEタイプ

<tt>send_file</tt>か静的ファイルを使う時、Sinatraが理解でいないMIMEタイプがある場合があります。
その時は +mime_type+ を使ってファイル拡張子毎に登録して下さい。

  mime_type :foo, 'text/foo'

== Rackミドルウェア

SinatraはRack[http://rack.rubyforge.org/]というRubyのWEBフレームワーク用の
最小限の標準インターフェース 上で動作しています。Rack中でもアプリケーションデベロッパー
向けに一番興味深い機能はミドルウェア(サーバとアプリケーション間に介在し、モニタリング、HTTPリクエストとレスポンス
の手動操作ができるなど、一般的な機能のいろいろなことを提供するもの)をサポートすることです。

Sinatraではトップレベルの+user+ メソッドを使ってRackにパイプラインを構築します。

  require 'sinatra'
  require 'my_custom_middleware'

  use Rack::Lint
  use MyCustomMiddleware

  get '/hello' do
    'Hello World'
  end

<tt>use</tt> の意味は{Rack::Builder}[http://rack.rubyforge.org/doc/classes/Rack/Builder.html] DSLで定義されていることと全て一致します。
例えば +use+ メソッドはブロック構文のように複数の引数を受け取ることができます。

  use Rack::Auth::Basic do |username, password|
    username == 'admin' && password == 'secret'
  end

Rackはログ、デバッギング、URLルーティング、認証、セッションなどいろいろな機能を備えた標準的ミドルウェアです。
Sinatraはその多くのコンポーネントを自動で使うよう基本設定されているため、+use+で明示的に指定する必要はありません。

== テスト

SinatraでのテストはRack-basedのテストライブラリかフレームワークを使って書くことができます。
{Rack::Test}[http://gitrdoc.com/brynary/rack-test] をおすすめします。やり方:

  require 'my_sinatra_app'
  require 'rack/test'

  class MyAppTest < Test::Unit::TestCase
    include Rack::Test::Methods

    def app
      Sinatra::Application
    end

    def test_my_default
      get '/'
      assert_equal 'Hello World!', last_response.body
    end

    def test_with_params
      get '/meet', :name => 'Frank'
      assert_equal 'Hello Frank!', last_response.body
    end

    def test_with_rack_env
      get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
      assert_equal "あなたはSongbirdを使ってますね!", last_response.body
    end
  end

注意: ビルトインのSinatra::TestモジュールとSinatra::TestHarnessクラスは
0.9.2リリース以降、廃止予定になっています。

== Sinatra::Base - ミドルウェア、ライブラリ、 モジュラーアプリ

トップレベル(グローバル領域)上でいろいろ定義していくのは軽量アプリならうまくいきますが、
RackミドルウェアやRails metal、サーバのコンポーネントを含んだシンプルな
ライブラリやSinatraの拡張プログラムを考慮するような場合はそうとは限りません。
トップレベルのDSLがネームスペースを汚染したり、設定を変えてしまうこと(例:./publicや./view)がありえます。
そこでSinatra::Baseの出番です。

  require 'sinatra/base'

  class MyApp < Sinatra::Base
    set :sessions, true
    set :foo, 'bar'

    get '/' do
      'Hello world!'
    end
  end

このMyAppは独立したRackコンポーネントで、RackミドルウェアやRackアプリケーション
Rails metalとして使用することができます。<tt>config.ru</tt>ファイル内で +use+ か、または
+run+ でこのクラスを指定するか、ライブラリとしてサーバコンポーネントをコントロールします。

   MyApp.run! :host => 'localhost', :port => 9090

Sinatra::Baseのサブクラスで使えるメソッドはトップレベルのDSLを経由して確実に使うことができます。
ほとんどのトップレベルで記述されたアプリは、以下の2点を修正することでSinatra::Baseコンポーネントに変えることができます。

* +sinatra+の代わりに<tt>sinatra/base</tt>を読み込む
(そうしない場合、SinatraのDSLメソッドの全てがメインネームスペースにインポートされます)
* ルート、エラーハンドラー、フィルター、オプションをSinatra::Baseのサブクラスに書く

<tt>Sinatra::Base</tt> はまっさらです。ビルトインサーバを含む、ほとんどのオプションがデフォルト
で無効になっています。オプション詳細については{Options and Configuration}[http://sinatra.github.com/configuration.html]
をご覧下さい。

補足: SinatraのトップレベルDSLはシンプルな委譲(delgation)システムで実装されています。
<tt>Sinatra::Application</tt>クラス(Sinatra::Baseの特別なサブクラス)は、トップレベルに送られる
:get、 :put、 :post、:delete、 :before、:error、:not_found、 :configure、:set messagesのこれら
全てを受け取ります。 詳細を閲覧されたい方はこちら(英語):
{Sinatra::Delegator mixin}[http://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1064]
{included into the main namespace}[http://github.com/sinatra/sinatra/blob/master/lib/sinatra/main.rb#L25].

== コマンドライン

Sinatraアプリケーションは直接実行できます。

  ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-s HANDLER]

オプション:

  -h # ヘルプ
  -p # ポート指定(デフォルトは4567)
  -e # 環境を指定 (デフォルトはdevelopment)
  -s # rackserver/handlerを指定 (デフォルトはthin)
  -x # mutex lockを付ける (デフォルトはoff)

== 最新開発版について

Sinatraの開発版を使いたい場合は、ローカルに開発版を落として、
<tt>LOAD_PATH</tt>の<tt>sinatra/lib</tt>ディレクトリを指定して実行して下さい。

  cd myapp
  git clone git://github.com/sinatra/sinatra.git
  ruby -Isinatra/lib myapp.rb

<tt>sinatra/lib</tt>ディレクトリをto the<tt>LOAD_PATH</tt>に追加する方法もあります。

  $LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
  require 'rubygems'
  require 'sinatra'

  get '/about' do
    "今使ってるバージョンは" + Sinatra::VERSION
  end

Sinatraのソースを更新する方法:

  cd myproject/sinatra
  git pull

== その他

日本語サイト

* {Greenbear Laboratory Rack日本語マニュアル}[http://mono.kmc.gr.jp/~yhara/w/?RackReferenceJa] - Rackの日本語マニュアル

英語サイト

* {プロジェクトサイト}[http://sinatra.github.com/] - ドキュメント、
  ニュース、他のリソースへのリンクがあります。
* {プロジェクトに参加(貢献)する}[http://sinatra.github.com/contributing.html] - バグレポート
  パッチの送信、サポートなど
* {Lighthouse}[http://sinatra.lighthouseapp.com] - チケット管理とリリース計画
* {Twitter}[http://twitter.com/sinatra]
* {メーリングリスト}[http://groups.google.com/group/sinatrarb]
* {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] on http://freenode.net