Skip to content
This repository
Newer
Older
100644 1025 lines (705 sloc) 26.359 kb
df800b5c »
2008-03-24 Docs are started
1 = Sinatra
2
4c91e540 »
2009-04-20 Web applications should not be hyphenated
3 Sinatra is a DSL for quickly creating web applications in Ruby with minimal
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
4 effort:
df800b5c »
2008-03-24 Docs are started
5
6 # myapp.rb
7 require 'sinatra'
c37db5cd »
2010-09-07 minor adjustments and fixes for the readme examples
8
df800b5c »
2008-03-24 Docs are started
9 get '/' do
10 'Hello world!'
11 end
12
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
13 Install the gem and run with:
df800b5c »
2008-03-24 Docs are started
14
8465d492 »
2010-09-07 Avoid `require "rubygems"` and `sudo` in README.
15 gem install sinatra
16 ruby -rubygems myapp.rb
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
17
18 View at: http://localhost:4567
19
20 == Routes
21
22 In Sinatra, a route is an HTTP method paired with an URL matching pattern.
23 Each route is associated with a block:
df800b5c »
2008-03-24 Docs are started
24
25 get '/' do
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
26 .. show something ..
df800b5c »
2008-03-24 Docs are started
27 end
f44fb6aa »
2008-08-31 grammar/formatting pass over README
28
df800b5c »
2008-03-24 Docs are started
29 post '/' do
30 .. create something ..
31 end
f44fb6aa »
2008-08-31 grammar/formatting pass over README
32
df800b5c »
2008-03-24 Docs are started
33 put '/' do
34 .. update something ..
35 end
f44fb6aa »
2008-08-31 grammar/formatting pass over README
36
df800b5c »
2008-03-24 Docs are started
37 delete '/' do
38 .. annihilate something ..
39 end
f44fb6aa »
2008-08-31 grammar/formatting pass over README
40
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
41 Routes are matched in the order they are defined. The first route that
f44fb6aa »
2008-08-31 grammar/formatting pass over README
42 matches the request is invoked.
1776a80d »
2008-03-24 Added Version and Docs
43
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
44 Route patterns may include named parameters, accessible via the
45 <tt>params</tt> hash:
1776a80d »
2008-03-24 Added Version and Docs
46
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
47 get '/hello/:name' do
ce0fe87a »
2009-05-20 fix inaccurate comment in README
48 # matches "GET /hello/foo" and "GET /hello/bar"
a734cf38 »
2008-12-13 I knew I shoulda taken that left turn at Hoboken
49 # params[:name] is 'foo' or 'bar'
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
50 "Hello #{params[:name]}!"
1776a80d »
2008-03-24 Added Version and Docs
51 end
f44fb6aa »
2008-08-31 grammar/formatting pass over README
52
6569d1b0 »
2009-01-28 Added route block params in routing statements [#140]
53 You can also access named parameters via block parameters:
54
55 get '/hello/:name' do |n|
56 "Hello #{n}!"
57 end
58
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
59 Route patterns may also include splat (or wildcard) parameters, accessible
60 via the <tt>params[:splat]</tt> array.
1776a80d »
2008-03-24 Added Version and Docs
61
9c85e99c »
2008-04-24 Specs, documentation and fixes for splat'n routes
62 get '/say/*/to/*' do
63 # matches /say/hello/to/world
a734cf38 »
2008-12-13 I knew I shoulda taken that left turn at Hoboken
64 params[:splat] # => ["hello", "world"]
9c85e99c »
2008-04-24 Specs, documentation and fixes for splat'n routes
65 end
66
67 get '/download/*.*' do
68 # matches /download/path/to/file.xml
a734cf38 »
2008-12-13 I knew I shoulda taken that left turn at Hoboken
69 params[:splat] # => ["path/to/file", "xml"]
1776a80d »
2008-03-24 Added Version and Docs
70 end
f44fb6aa »
2008-08-31 grammar/formatting pass over README
71
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
72 Route matching with Regular Expressions:
73
74 get %r{/hello/([\w]+)} do
75 "Hello, #{params[:captures].first}!"
76 end
77
6569d1b0 »
2009-01-28 Added route block params in routing statements [#140]
78 Or with a block parameter:
79
80 get %r{/hello/([\w]+)} do |c|
81 "Hello, #{c}!"
82 end
83
726feeb4 »
2010-09-02 Documentation for condition. Fixes GH #15.
84 === Conditions
85
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
86 Routes may include a variety of matching conditions, such as the user agent:
f44fb6aa »
2008-08-31 grammar/formatting pass over README
87
1776a80d »
2008-03-24 Added Version and Docs
88 get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
89 "You're using Songbird version #{params[:agent][0]}"
90 end
91
92 get '/foo' do
a734cf38 »
2008-12-13 I knew I shoulda taken that left turn at Hoboken
93 # Matches non-songbird browsers
1776a80d »
2008-03-24 Added Version and Docs
94 end
df800b5c »
2008-03-24 Docs are started
95
fa527095 »
2010-09-03 fix markup for inline code in README
96 Other available conditions are +host_name+ and +provides+:
726feeb4 »
2010-09-02 Documentation for condition. Fixes GH #15.
97
98 get '/', :host_name => /^admin\./ do
99 "Admin Area, Access denied!"
100 end
101
102 get '/', :provides => 'html' do
103 haml :index
104 end
105
106 get '/', :provides => ['rss', 'atom', 'xml'] do
107 builder :feed
108 end
109
110 You can easily define your own conditions:
111
112 set(:probability) { |value| condition { rand <= value } }
113
114 get '/win_a_car', :probability => 0.1 do
115 "You won!"
116 end
117
118 get '/win_a_car' do
119 "Sorry, you lost."
120 end
121
aaeb564a »
2010-09-02 document route return values, fixes GH #23
122 === Return values
123
124 The return value of a route block determines at least the response body passed
125 on to the HTTP client, or at least the next middleware in the Rack stack.
126 Most commonly this is a string, as in the above examples. But other values are
127 also accepted.
128
c6d06148 »
2010-09-10 Minor README improvements.
129 You can return any object that would either be a valid Rack response, Rack
130 body object or HTTP status code:
aaeb564a »
2010-09-02 document route return values, fixes GH #23
131
626f6890 »
2010-09-03 fix markup for multi word inline code in README
132 * An Array with three elements: <tt>[status (Fixnum), headers (Hash), response body (responds to #each)]</tt>
133 * An Array with two elements: <tt>[status (Fixnum), response body (responds to #each)]</tt>
9c73cf7d »
2010-09-03 fix markup for multi word inline code in README, take two (apparently…
134 * An object that responds to <tt>#each</tt> and passes nothing but strings to the given block
aaeb564a »
2010-09-02 document route return values, fixes GH #23
135 * A Fixnum representing the status code
136
137 That way we can for instance easily implement a streaming example:
138
139 class Stream
140 def each
141 100.times { |i| yield "#{i}\n" }
142 end
143 end
144
8fbd9c21 »
2010-09-07 Simplify streaming example.
145 get('/') { Stream.new }
aaeb564a »
2010-09-02 document route return values, fixes GH #23
146
a734cf38 »
2008-12-13 I knew I shoulda taken that left turn at Hoboken
147 == Static Files
047edc6a »
2008-03-26 update README with Static help
148
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
149 Static files are served from the <tt>./public</tt> directory. You can specify
150 a different location by setting the <tt>:public</tt> option:
a734cf38 »
2008-12-13 I knew I shoulda taken that left turn at Hoboken
151
152 set :public, File.dirname(__FILE__) + '/static'
df800b5c »
2008-03-24 Docs are started
153
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
154 Note that the public directory name is not included in the URL. A file
85b4462b »
2009-01-24 README: fix formatting on static file note
155 <tt>./public/css/style.css</tt> is made available as
156 <tt>http://example.com/css/style.css</tt>.
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
157
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
158 == Views / Templates
df800b5c »
2008-03-24 Docs are started
159
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
160 Templates are assumed to be located directly under the <tt>./views</tt>
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
161 directory. To use a different views directory:
a734cf38 »
2008-12-13 I knew I shoulda taken that left turn at Hoboken
162
163 set :views, File.dirname(__FILE__) + '/templates'
164
06161bf7 »
2009-03-25 Note on passing template symbols vs. strings in README
165 One important thing to remember is that you always have to reference
166 templates with symbols, even if they're in a subdirectory (in this
12557377 »
2010-09-23 Added a transition to better explain that templates must be defined w…
167 case use <tt>:'subdir/template'</tt>). You must use a symbol because
168 otherwise rendering methods will render any strings passed to them
169 directly.
06161bf7 »
2009-03-25 Note on passing template symbols vs. strings in README
170
f44fb6aa »
2008-08-31 grammar/formatting pass over README
171 === Haml Templates
df800b5c »
2008-03-24 Docs are started
172
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
173 The haml gem/library is required to render HAML templates:
174
801163e9 »
2009-04-24 closes #9779 Auto-require haml/erb/builder/sass
175 ## You'll need to require haml in your app
176 require 'haml'
177
df800b5c »
2008-03-24 Docs are started
178 get '/' do
179 haml :index
180 end
f44fb6aa »
2008-08-31 grammar/formatting pass over README
181
182 Renders <tt>./views/index.haml</tt>.
183
0321ada6 »
2010-05-26 In README docs, fix links to HAML and SASS Options pages.
184 {Haml's options}[http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#options]
d359dc9c »
2009-03-15 Merge app-level haml/sass options with call options [#184]
185 can be set globally through Sinatra's configurations,
186 see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
187 and overridden on an individual basis.
188
c37db5cd »
2010-09-07 minor adjustments and fixes for the readme examples
189 set :haml, :format => :html5 # default Haml format is :xhtml
d359dc9c »
2009-03-15 Merge app-level haml/sass options with call options [#184]
190
191 get '/' do
c37db5cd »
2010-09-07 minor adjustments and fixes for the readme examples
192 haml :index, :format => :html4 # overridden
d359dc9c »
2009-03-15 Merge app-level haml/sass options with call options [#184]
193 end
194
195
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
196 === Erb Templates
f44fb6aa »
2008-08-31 grammar/formatting pass over README
197
801163e9 »
2009-04-24 closes #9779 Auto-require haml/erb/builder/sass
198 ## You'll need to require erb in your app
199 require 'erb'
200
f44fb6aa »
2008-08-31 grammar/formatting pass over README
201 get '/' do
202 erb :index
203 end
204
205 Renders <tt>./views/index.erb</tt>
206
7c5d6937 »
2009-12-23 Doc for erubis
207 === Erubis
208
84f2e0c1 »
2010-06-27 Correction to erubis template rendering instructions
209 The erubis gem/library is required to render erubis templates:
7c5d6937 »
2009-12-23 Doc for erubis
210
211 ## You'll need to require erubis in your app
212 require 'erubis'
213
214 get '/' do
215 erubis :index
216 end
217
218 Renders <tt>./views/index.erubis</tt>
219
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
220 === Builder Templates
f44fb6aa »
2008-08-31 grammar/formatting pass over README
221
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
222 The builder gem/library is required to render builder templates:
df800b5c »
2008-03-24 Docs are started
223
801163e9 »
2009-04-24 closes #9779 Auto-require haml/erb/builder/sass
224 ## You'll need to require builder in your app
225 require 'builder'
226
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
227 get '/' do
228 builder :index
229 end
230
231 Renders <tt>./views/index.builder</tt>.
232
dd81da11 »
2010-10-10 Add nokogiri helper method. Tilt supports Nokogiri for quite some tim…
233 === Nokogiri Templates
234
235 The nokogiri gem/library is required to render nokogiri templates:
236
237 ## You'll need to require nokogiri in your app
238 require 'nokogiri'
239
240 get '/' do
241 nokogiri :index
242 end
243
244 Renders <tt>./views/index.nokogiri</tt>.
245
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
246 === Sass Templates
247
e93951e3 »
2010-10-19 You still need the haml gem for sass/scss. However, this will change …
248 The haml gem/library is required to render Sass templates:
f44fb6aa »
2008-08-31 grammar/formatting pass over README
249
801163e9 »
2009-04-24 closes #9779 Auto-require haml/erb/builder/sass
250 ## You'll need to require haml or sass in your app
251 require 'sass'
252
4144ac1a »
2008-04-08 Added Sass information to documentation.
253 get '/stylesheet.css' do
254 sass :stylesheet
255 end
256
f44fb6aa »
2008-08-31 grammar/formatting pass over README
257 Renders <tt>./views/stylesheet.sass</tt>.
258
0321ada6 »
2010-05-26 In README docs, fix links to HAML and SASS Options pages.
259 {Sass' options}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
d359dc9c »
2009-03-15 Merge app-level haml/sass options with call options [#184]
260 can be set globally through Sinatra's configurations,
261 see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
262 and overridden on an individual basis.
263
c37db5cd »
2010-09-07 minor adjustments and fixes for the readme examples
264 set :sass, :style => :compact # default Sass style is :nested
d359dc9c »
2009-03-15 Merge app-level haml/sass options with call options [#184]
265
266 get '/stylesheet.css' do
b90d00c8 »
2009-12-19 Update sass example re. options
267 sass :stylesheet, :style => :expanded # overridden
d359dc9c »
2009-03-15 Merge app-level haml/sass options with call options [#184]
268 end
269
cf3c218a »
2010-08-29 Adding scss support through specific command
270 === Scss Templates
271
e93951e3 »
2010-10-19 You still need the haml gem for sass/scss. However, this will change …
272 The haml gem/library is required to render Scss templates:
cf3c218a »
2010-08-29 Adding scss support through specific command
273
274 ## You'll need to require haml or sass in your app
275 require 'sass'
276
277 get '/stylesheet.css' do
278 scss :stylesheet
279 end
280
281 Renders <tt>./views/stylesheet.scss</tt>.
282
283 {Scss' options}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
284 can be set globally through Sinatra's configurations,
285 see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
286 and overridden on an individual basis.
287
c37db5cd »
2010-09-07 minor adjustments and fixes for the readme examples
288 set :scss, :style => :compact # default Scss style is :nested
cf3c218a »
2010-08-29 Adding scss support through specific command
289
290 get '/stylesheet.css' do
291 scss :stylesheet, :style => :expanded # overridden
292 end
293
621bfcbd »
2010-03-01 Added Less support
294 === Less Templates
295
296 The less gem/library is required to render Less templates:
297
298 ## You'll need to require less in your app
299 require 'less'
300
301 get '/stylesheet.css' do
302 less :stylesheet
303 end
304
305 Renders <tt>./views/stylesheet.less</tt>.
306
28a3a350 »
2010-09-11 Add liquid helper method. Tilt supports liquid for quite some time no…
307 === Liquid Templates
308
309 The liquid gem/library is required to render Liquid templates:
310
311 ## You'll need to require liquid in your app
312 require 'liquid'
313
314 get '/' do
315 liquid :index
316 end
317
318 Renders <tt>./views/index.liquid</tt>.
319
320 Since you cannot call Ruby methods (except for +yield+) from a Liquid
321 template, you almost always want to pass locals to it:
322
323 liquid :index, :locals => { :key => 'value' }
324
970169b1 »
2010-09-11 Add markdown helper method. Tilt supports markdown for quite some tim…
325 === Markdown Templates
326
327 The rdiscount gem/library is required to render Markdown templates:
328
329 ## You'll need to require rdiscount in your app
330 require "rdiscount"
331
332 get '/' do
333 markdown :index
334 end
335
336 Renders <tt>./views/index.markdown</tt> (+md+ and +mkd+ are also valid file
337 extensions).
338
339 It is not possible to call methods from markdown, nor to pass locals to it. You therefore will usually use it in combination with another rendering engine:
340
341 erb :overview, :locals => { :text => markdown(:introduction) }
342
343 Note that you may also call the markdown method from within other templates:
344
345 %h1 Hello From Haml!
346 %p= markdown(:greetings)
347
b464e024 »
2010-09-11 Add textile helper method. Tilt supports textile for quite some time …
348 === Textile Templates
349
350 The RedCloth gem/library is required to render Textile templates:
351
64488d5a »
2010-09-30 fixes a few copy/paste errors in the README
352 ## You'll need to require redcloth in your app
b464e024 »
2010-09-11 Add textile helper method. Tilt supports textile for quite some time …
353 require "redcloth"
354
355 get '/' do
356 textile :index
357 end
358
359 Renders <tt>./views/index.textile</tt>.
360
361 It is not possible to call methods from textile, nor to pass locals to it. You therefore will usually use it in combination with another rendering engine:
362
363 erb :overview, :locals => { :text => textile(:introduction) }
364
365 Note that you may also call the textile method from within other templates:
366
367 %h1 Hello From Haml!
368 %p= textile(:greetings)
369
c248dbac »
2010-09-12 Add rdoc helper method. Tilt supports RDoc for quite some time now, b…
370 === RDoc Templates
371
372 The RDoc gem/library is required to render RDoc templates:
373
64488d5a »
2010-09-30 fixes a few copy/paste errors in the README
374 ## You'll need to require rdoc in your app
c248dbac »
2010-09-12 Add rdoc helper method. Tilt supports RDoc for quite some time now, b…
375 require "rdoc"
376
377 get '/' do
378 rdoc :index
379 end
380
381 Renders <tt>./views/index.rdoc</tt>.
382
383 It is not possible to call methods from rdoc, nor to pass locals to it. You therefore will usually use it in combination with another rendering engine:
384
385 erb :overview, :locals => { :text => rdoc(:introduction) }
386
387 Note that you may also call the rdoc method from within other templates:
388
389 %h1 Hello From Haml!
390 %p= rdoc(:greetings)
391
7cb94f2d »
2010-09-12 Add radius helper method. Tilt supports radius for quite some time no…
392 === Radius Templates
393
394 The radius gem/library is required to render Radius templates:
395
396 ## You'll need to require radius in your app
397 require 'radius'
398
399 get '/' do
400 radius :index
401 end
402
403 Renders <tt>./views/index.radius</tt>.
404
405 Since you cannot call Ruby methods (except for +yield+) from a Radius
406 template, you almost always want to pass locals to it:
407
408 radius :index, :locals => { :key => 'value' }
409
8ce74b3a »
2010-09-12 Add markaby helper method. Tilt supports Markaby for quite some time …
410 === Markaby Templates
411
412 The markaby gem/library is required to render Markaby templates:
413
414 ## You'll need to require markaby in your app
415 require 'markaby'
416
417 get '/' do
418 markaby :index
419 end
420
421 Renders <tt>./views/index.mab</tt>.
422
f58d015b »
2010-09-12 Add coffee helper method. Tilt supports CoffeeScript again, but it wa…
423 === CoffeeScript Templates
424
425 The coffee-script gem/library and the `coffee` binary are required to render
426 CoffeeScript templates:
427
428 ## You'll need to require coffee-script in your app
429 require 'coffee-script'
430
431 get '/application.js' do
432 coffee :application
433 end
434
435 Renders <tt>./views/application.coffee</tt>.
436
f44fb6aa »
2008-08-31 grammar/formatting pass over README
437 === Inline Templates
df800b5c »
2008-03-24 Docs are started
438
439 get '/' do
440 haml '%div.title Hello World'
441 end
f44fb6aa »
2008-08-31 grammar/formatting pass over README
442
443 Renders the inlined template string.
df800b5c »
2008-03-24 Docs are started
444
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
445 === Accessing Variables in Templates
df800b5c »
2008-03-24 Docs are started
446
5018264d »
2009-03-01 Tidy up README a bit; link to @sinatra on Twitter
447 Templates are evaluated within the same context as route handlers. Instance
448 variables set in route handlers are direcly accessible by templates:
df800b5c »
2008-03-24 Docs are started
449
450 get '/:id' do
451 @foo = Foo.find(params[:id])
95aca761 »
2008-11-30 fix documentation of variable interpolation into templates
452 haml '%h1= @foo.name'
df800b5c »
2008-03-24 Docs are started
453 end
454
f44fb6aa »
2008-08-31 grammar/formatting pass over README
455 Or, specify an explicit Hash of local variables:
df800b5c »
2008-03-24 Docs are started
456
457 get '/:id' do
f44fb6aa »
2008-08-31 grammar/formatting pass over README
458 foo = Foo.find(params[:id])
95aca761 »
2008-11-30 fix documentation of variable interpolation into templates
459 haml '%h1= foo.name', :locals => { :foo => foo }
df800b5c »
2008-03-24 Docs are started
460 end
461
f44fb6aa »
2008-08-31 grammar/formatting pass over README
462 This is typically used when rendering templates as partials from within
463 other templates.
464
3ef8eede »
2009-12-19 Deprecate use_in_file_templates!
465 === Inline Templates
83cba9cf »
2008-03-29 updated README with helpful tidbits
466
f44fb6aa »
2008-08-31 grammar/formatting pass over README
467 Templates may be defined at the end of the source file:
83cba9cf »
2008-03-29 updated README with helpful tidbits
468
eec7d214 »
2009-01-16 In-file-templates are automaticly loaded for you.
469 require 'sinatra'
470
83cba9cf »
2008-03-29 updated README with helpful tidbits
471 get '/' do
472 haml :index
473 end
f44fb6aa »
2008-08-31 grammar/formatting pass over README
474
83cba9cf »
2008-03-29 updated README with helpful tidbits
475 __END__
f44fb6aa »
2008-08-31 grammar/formatting pass over README
476
f71330e6 »
2008-05-07 quick doc fix
477 @@ layout
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
478 %html
479 = yield
f44fb6aa »
2008-08-31 grammar/formatting pass over README
480
f71330e6 »
2008-05-07 quick doc fix
481 @@ index
83cba9cf »
2008-03-29 updated README with helpful tidbits
482 %div.title Hello world!!!!!
483
65847111 »
2010-10-12 Minor markup fix in README.
484 NOTE: Inline templates defined in the source file that requires sinatra are
ca624fd1 »
2010-10-12 Fix the minor markup fix in README.
485 automatically loaded. Call <tt>enable :inline_templates</tt> explicitly if you
3ef8eede »
2009-12-19 Deprecate use_in_file_templates!
486 have inline templates in other source files.
eec7d214 »
2009-01-16 In-file-templates are automaticly loaded for you.
487
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
488 === Named Templates
489
5018264d »
2009-03-01 Tidy up README a bit; link to @sinatra on Twitter
490 Templates may also be defined using the top-level <tt>template</tt> method:
83cba9cf »
2008-03-29 updated README with helpful tidbits
491
492 template :layout do
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
493 "%html\n =yield\n"
83cba9cf »
2008-03-29 updated README with helpful tidbits
494 end
495
496 template :index do
497 '%div.title Hello World!'
498 end
499
500 get '/' do
501 haml :index
502 end
503
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
504 If a template named "layout" exists, it will be used each time a template
505 is rendered. You can disable layouts by passing <tt>:layout => false</tt>.
578bbabd »
2009-01-09 Updating README for :layout => true.
506
507 get '/' do
508 haml :index, :layout => !request.xhr?
509 end
510
f44fb6aa »
2008-08-31 grammar/formatting pass over README
511 == Helpers
df800b5c »
2008-03-24 Docs are started
512
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
513 Use the top-level <tt>helpers</tt> method to define helper methods for use in
5018264d »
2009-03-01 Tidy up README a bit; link to @sinatra on Twitter
514 route handlers and templates:
df800b5c »
2008-03-24 Docs are started
515
516 helpers do
517 def bar(name)
518 "#{name}bar"
519 end
520 end
f44fb6aa »
2008-08-31 grammar/formatting pass over README
521
1776a80d »
2008-03-24 Added Version and Docs
522 get '/:name' do
523 bar(params[:name])
524 end
df800b5c »
2008-03-24 Docs are started
525
f44fb6aa »
2008-08-31 grammar/formatting pass over README
526 == Filters
df800b5c »
2008-03-24 Docs are started
527
c6d06148 »
2010-09-10 Minor README improvements.
528 Before filters are evaluated before each request within the same context as
529 the routes will be and can modify the request and response. Instance variables
530 set in filters are accessible by routes and templates:
1776a80d »
2008-03-24 Added Version and Docs
531
df800b5c »
2008-03-24 Docs are started
532 before do
a734cf38 »
2008-12-13 I knew I shoulda taken that left turn at Hoboken
533 @note = 'Hi!'
534 request.path_info = '/foo/bar/baz'
535 end
536
537 get '/foo/*' do
538 @note #=> 'Hi!'
539 params[:splat] #=> 'bar/baz'
df800b5c »
2008-03-24 Docs are started
540 end
f44fb6aa »
2008-08-31 grammar/formatting pass over README
541
c6d06148 »
2010-09-10 Minor README improvements.
542 After filter are evaluated after each request within the same context and can
543 also modify the request and response. Instance variables set in before filters
544 and routes are accessible by after filters:
4e50ddbc »
2008-12-21 Adds after filters
545
546 after do
547 puts response.status
548 end
549
c6d06148 »
2010-09-10 Minor README improvements.
550 Filters optionally taking a pattern, causing them to be evaluated only if the
551 request path matches that pattern:
da047d3d »
2010-04-27 add pattern matching to before/after filters.
552
553 before '/protected/*' do
554 authenticate!
555 end
556
557 after '/create/:slug' do |slug|
558 session[:last_slug] = slug
559 end
560
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
561 == Halting
a734cf38 »
2008-12-13 I knew I shoulda taken that left turn at Hoboken
562
4e50ddbc »
2008-12-21 Adds after filters
563 To immediately stop a request within a filter or route use:
df800b5c »
2008-03-24 Docs are started
564
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
565 halt
f44fb6aa »
2008-08-31 grammar/formatting pass over README
566
c6d06148 »
2010-09-10 Minor README improvements.
567 You can also specify the status when halting:
fbbd8227 »
2009-12-19 More 'halt' doc
568
569 halt 410
570
c6d06148 »
2010-09-10 Minor README improvements.
571 Or the body:
df800b5c »
2008-03-24 Docs are started
572
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
573 halt 'this will be the body'
df800b5c »
2008-03-24 Docs are started
574
c6d06148 »
2010-09-10 Minor README improvements.
575 Or both:
f44fb6aa »
2008-08-31 grammar/formatting pass over README
576
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
577 halt 401, 'go away!'
df800b5c »
2008-03-24 Docs are started
578
c6d06148 »
2010-09-10 Minor README improvements.
579 With headers:
fbbd8227 »
2009-12-19 More 'halt' doc
580
581 halt 402, {'Content-Type' => 'text/plain'}, 'revenge'
582
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
583 == Passing
f44fb6aa »
2008-08-31 grammar/formatting pass over README
584
5018264d »
2009-03-01 Tidy up README a bit; link to @sinatra on Twitter
585 A route can punt processing to the next matching route using <tt>pass</tt>:
df800b5c »
2008-03-24 Docs are started
586
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
587 get '/guess/:who' do
588 pass unless params[:who] == 'Frank'
6c9488e2 »
2009-12-23 Stick to single quote; kill a blank line
589 'You got me!'
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
590 end
591
592 get '/guess/*' do
6c9488e2 »
2009-12-23 Stick to single quote; kill a blank line
593 'You missed!'
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
594 end
595
596 The route block is immediately exited and control continues with the next
597 matching route. If no matching route is found, a 404 is returned.
df800b5c »
2008-03-24 Docs are started
598
df0e5349 »
2010-10-11 Document request object. Fixes GH #60.
599 == Accessing the Request Object
600
3297a61e »
2010-10-11 Fix typo in README.
601 The incoming request object can be accessed from request level (filter, routes, error handlers) through the `request` method:
df0e5349 »
2010-10-11 Document request object. Fixes GH #60.
602
603 # app running on http://example.com/example
604 get '/foo' do
605 request.body # request body sent by the client (see below)
606 request.scheme # "http"
607 request.script_name # "/example"
608 request.path_info # "/foo"
609 request.port # 80
610 request.request_method # "GET"
611 request.query_string # ""
612 request.content_length # length of request.body
613 request.media_type # media type of request.body
614 request.host # "example.com"
615 request.get? # true (similar methods for other verbs)
616 request.form_data? # false
617 request["SOME_HEADER"] # value of SOME_HEADER header
618 request.referer # the referer of the client or '/'
619 request.user_agent # user agent (used by :agent condition)
620 request.cookies # hash of browser cookies
621 request.xhr? # is this an ajax request?
622 request.url # "http://example.com/example/foo"
623 request.path # "/example/foo"
624 request.ip # client IP address
625 request.secure? # false
df7cc200 »
2010-10-24 fix a minor spell mistake
626 request.env # raw env hash handed in by Rack
df0e5349 »
2010-10-11 Document request object. Fixes GH #60.
627 end
628
1fd52d1f »
2010-10-11 Fix markup
629 Some options, like <tt>script_name</tt> or <tt>path_info</tt> can also be
630 written:
df0e5349 »
2010-10-11 Document request object. Fixes GH #60.
631
632 before { request.path_info = "/" }
633
634 get "/" do
635 "all requests end up here"
636 end
637
638 The <tt>request.body</tt> is an IO or StringIO object:
639
640 post "/api" do
641 request.body.rewind # in case someone already read it
642 data = JSON.parse request.body.read
643 "Hello #{data['name']}!"
644 end
645
13fc79d3 »
2009-03-24 Remove support for source file reloading [#166]
646 == Configuration
1776a80d »
2008-03-24 Added Version and Docs
647
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
648 Run once, at startup, in any environment:
1776a80d »
2008-03-24 Added Version and Docs
649
650 configure do
e75f4b3f »
2008-09-09 misc README formatting tweaks
651 ...
1776a80d »
2008-03-24 Added Version and Docs
652 end
f44fb6aa »
2008-08-31 grammar/formatting pass over README
653
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
654 Run only when the environment (RACK_ENV environment variable) is set to
13fc79d3 »
2009-03-24 Remove support for source file reloading [#166]
655 <tt>:production</tt>:
1776a80d »
2008-03-24 Added Version and Docs
656
657 configure :production do
e75f4b3f »
2008-09-09 misc README formatting tweaks
658 ...
1776a80d »
2008-03-24 Added Version and Docs
659 end
f44fb6aa »
2008-08-31 grammar/formatting pass over README
660
13fc79d3 »
2009-03-24 Remove support for source file reloading [#166]
661 Run when the environment is set to either <tt>:production</tt> or
662 <tt>:test</tt>:
1776a80d »
2008-03-24 Added Version and Docs
663
664 configure :production, :test do
e75f4b3f »
2008-09-09 misc README formatting tweaks
665 ...
1776a80d »
2008-03-24 Added Version and Docs
666 end
f44fb6aa »
2008-08-31 grammar/formatting pass over README
667
e75f4b3f »
2008-09-09 misc README formatting tweaks
668 == Error handling
1776a80d »
2008-03-24 Added Version and Docs
669
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
670 Error handlers run within the same context as routes and before filters, which
c6d06148 »
2010-09-10 Minor README improvements.
671 means you get all the goodies it has to offer, like <tt>haml</tt>,
672 <tt>erb</tt>, <tt>halt</tt>, etc.
1776a80d »
2008-03-24 Added Version and Docs
673
e75f4b3f »
2008-09-09 misc README formatting tweaks
674 === Not Found
1776a80d »
2008-03-24 Added Version and Docs
675
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
676 When a <tt>Sinatra::NotFound</tt> exception is raised, or the response's status
677 code is 404, the <tt>not_found</tt> handler is invoked:
1776a80d »
2008-03-24 Added Version and Docs
678
679 not_found do
c6d06148 »
2010-09-10 Minor README improvements.
680 'This is nowhere to be found.'
1776a80d »
2008-03-24 Added Version and Docs
681 end
f44fb6aa »
2008-08-31 grammar/formatting pass over README
682
e75f4b3f »
2008-09-09 misc README formatting tweaks
683 === Error
83cba9cf »
2008-03-29 updated README with helpful tidbits
684
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
685 The +error+ handler is invoked any time an exception is raised from a route
63fd7734 »
2009-12-19 Small doc fix re. after filter
686 block or a filter. The exception object can be obtained from the
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
687 <tt>sinatra.error</tt> Rack variable:
83cba9cf »
2008-03-29 updated README with helpful tidbits
688
1776a80d »
2008-03-24 Added Version and Docs
689 error do
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
690 'Sorry there was a nasty error - ' + env['sinatra.error'].name
83cba9cf »
2008-03-29 updated README with helpful tidbits
691 end
692
e75f4b3f »
2008-09-09 misc README formatting tweaks
693 Custom errors:
83cba9cf »
2008-03-29 updated README with helpful tidbits
694
695 error MyCustomError do
e7e0e558 »
2008-04-14 Minor docfixes in README.rdoc
696 'So what happened was...' + request.env['sinatra.error'].message
1776a80d »
2008-03-24 Added Version and Docs
697 end
83cba9cf »
2008-03-29 updated README with helpful tidbits
698
e75f4b3f »
2008-09-09 misc README formatting tweaks
699 Then, if this happens:
83cba9cf »
2008-03-29 updated README with helpful tidbits
700
701 get '/' do
702 raise MyCustomError, 'something bad'
703 end
704
e75f4b3f »
2008-09-09 misc README formatting tweaks
705 You get this:
83cba9cf »
2008-03-29 updated README with helpful tidbits
706
707 So what happened was... something bad
f44fb6aa »
2008-08-31 grammar/formatting pass over README
708
59e797e9 »
2009-12-23 Doc for error(500) { }
709 Alternatively, you can install error handler for a status code:
710
711 error 403 do
712 'Access forbidden'
713 end
714
715 get '/secret' do
716 403
717 end
718
719 Or a range:
720
721 error 400..510 do
722 'Boom'
723 end
724
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
725 Sinatra installs special <tt>not_found</tt> and <tt>error</tt> handlers when
726 running under the development environment.
83cba9cf »
2008-03-29 updated README with helpful tidbits
727
f44fb6aa »
2008-08-31 grammar/formatting pass over README
728 == Mime types
729
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
730 When using <tt>send_file</tt> or static files you may have mime types Sinatra
6d8b333a »
2009-10-18 Update README re. mime_type
731 doesn't understand. Use +mime_type+ to register them by file extension:
83cba9cf »
2008-03-29 updated README with helpful tidbits
732
6d8b333a »
2009-10-18 Update README re. mime_type
733 mime_type :foo, 'text/foo'
1776a80d »
2008-03-24 Added Version and Docs
734
cb8fcb63 »
2009-12-23 Doc for content_type :foo
735 You can also use it with the +content_type+ helper:
736
737 content_type :foo
738
f44fb6aa »
2008-08-31 grammar/formatting pass over README
739 == Rack Middleware
bda21f1f »
2008-05-19 add doc on using Rack middleware to README
740
f44fb6aa »
2008-08-31 grammar/formatting pass over README
741 Sinatra rides on Rack[http://rack.rubyforge.org/], a minimal standard
742 interface for Ruby web frameworks. One of Rack's most interesting capabilities
743 for application developers is support for "middleware" -- components that sit
744 between the server and your application monitoring and/or manipulating the
745 HTTP request/response to provide various types of common functionality.
bda21f1f »
2008-05-19 add doc on using Rack middleware to README
746
e75f4b3f »
2008-09-09 misc README formatting tweaks
747 Sinatra makes building Rack middleware pipelines a cinch via a top-level
748 +use+ method:
bda21f1f »
2008-05-19 add doc on using Rack middleware to README
749
750 require 'sinatra'
751 require 'my_custom_middleware'
752
753 use Rack::Lint
754 use MyCustomMiddleware
755
756 get '/hello' do
757 'Hello World'
758 end
759
f44fb6aa »
2008-08-31 grammar/formatting pass over README
760 The semantics of +use+ are identical to those defined for the
761 Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html] DSL
762 (most frequently used from rackup files). For example, the +use+ method
763 accepts multiple/variable args as well as blocks:
bda21f1f »
2008-05-19 add doc on using Rack middleware to README
764
765 use Rack::Auth::Basic do |username, password|
766 username == 'admin' && password == 'secret'
767 end
768
f44fb6aa »
2008-08-31 grammar/formatting pass over README
769 Rack is distributed with a variety of standard middleware for logging,
770 debugging, URL routing, authentication, and session handling. Sinatra uses
771 many of of these components automatically based on configuration so you
772 typically don't have to +use+ them explicitly.
bda21f1f »
2008-05-19 add doc on using Rack middleware to README
773
f44fb6aa »
2008-08-31 grammar/formatting pass over README
774 == Testing
1776a80d »
2008-03-24 Added Version and Docs
775
c831278a »
2009-05-18 Recommend Rack::Test in README / note Sinatra::Test deprecation
776 Sinatra tests can be written using any Rack-based testing library
777 or framework. {Rack::Test}[http://gitrdoc.com/brynary/rack-test] is
778 recommended:
c00a25ee »
2009-01-13 Test framework refactoring
779
7cfe04a9 »
2008-09-24 Fix for test/unit and test/spec docs
780 require 'my_sinatra_app'
c3f167f7 »
2010-07-26 MOD: docs for testing forgot to require test/unit
781 require 'test/unit'
c831278a »
2009-05-18 Recommend Rack::Test in README / note Sinatra::Test deprecation
782 require 'rack/test'
f44fb6aa »
2008-08-31 grammar/formatting pass over README
783
1776a80d »
2008-03-24 Added Version and Docs
784 class MyAppTest < Test::Unit::TestCase
c831278a »
2009-05-18 Recommend Rack::Test in README / note Sinatra::Test deprecation
785 include Rack::Test::Methods
786
787 def app
788 Sinatra::Application
789 end
f44fb6aa »
2008-08-31 grammar/formatting pass over README
790
2f377e26 »
2009-03-01 Trim down Testing section in the README; link to doc site instead
791 def test_my_default
c00a25ee »
2009-01-13 Test framework refactoring
792 get '/'
c831278a »
2009-05-18 Recommend Rack::Test in README / note Sinatra::Test deprecation
793 assert_equal 'Hello World!', last_response.body
1776a80d »
2008-03-24 Added Version and Docs
794 end
10c90d5f »
2008-09-27 document testing with rspec
795
2f377e26 »
2009-03-01 Trim down Testing section in the README; link to doc site instead
796 def test_with_params
c831278a »
2009-05-18 Recommend Rack::Test in README / note Sinatra::Test deprecation
797 get '/meet', :name => 'Frank'
798 assert_equal 'Hello Frank!', last_response.body
10c90d5f »
2008-09-27 document testing with rspec
799 end
800
2f377e26 »
2009-03-01 Trim down Testing section in the README; link to doc site instead
801 def test_with_rack_env
c831278a »
2009-05-18 Recommend Rack::Test in README / note Sinatra::Test deprecation
802 get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
803 assert_equal "You're using Songbird!", last_response.body
1fb5b99d »
2009-01-09 Bacon support
804 end
805 end
806
c831278a »
2009-05-18 Recommend Rack::Test in README / note Sinatra::Test deprecation
807 NOTE: The built-in Sinatra::Test module and Sinatra::TestHarness class
808 are deprecated as of the 0.9.2 release.
1776a80d »
2008-03-24 Added Version and Docs
809
53603333 »
2009-06-06 Add a note about Sinatra::Base to the README
810 == Sinatra::Base - Middleware, Libraries, and Modular Apps
811
812 Defining your app at the top-level works well for micro-apps but has
69791f71 »
2010-09-24 Minor README adjustments.
813 considerable drawbacks when building reusable components such as Rack
53603333 »
2009-06-06 Add a note about Sinatra::Base to the README
814 middleware, Rails metal, simple libraries with a server component, or
815 even Sinatra extensions. The top-level DSL pollutes the Object namespace
816 and assumes a micro-app style configuration (e.g., a single application
817 file, ./public and ./views directories, logging, exception detail page,
818 etc.). That's where Sinatra::Base comes into play:
819
820 require 'sinatra/base'
821
822 class MyApp < Sinatra::Base
823 set :sessions, true
824 set :foo, 'bar'
825
826 get '/' do
827 'Hello world!'
828 end
829 end
830
831 The MyApp class is an independent Rack component that can act as
832 Rack middleware, a Rack application, or Rails metal. You can +use+ or
833 +run+ this class from a rackup +config.ru+ file; or, control a server
834 component shipped as a library:
835
836 MyApp.run! :host => 'localhost', :port => 9090
837
838 The methods available to Sinatra::Base subclasses are exactly as those
839 available via the top-level DSL. Most top-level apps can be converted to
840 Sinatra::Base components with two modifications:
841
842 * Your file should require +sinatra/base+ instead of +sinatra+;
843 otherwise, all of Sinatra's DSL methods are imported into the main
844 namespace.
845 * Put your app's routes, error handlers, filters, and options in a subclass
846 of Sinatra::Base.
847
c4b9fdc4 »
2010-10-12 Yet another markup fix for the README.
848 <tt>Sinatra::Base</tt> is a blank slate. Most options are disabled by default,
53603333 »
2009-06-06 Add a note about Sinatra::Base to the README
849 including the built-in server. See {Options and Configuration}[http://sinatra.github.com/configuration.html]
850 for details on available options and their behavior.
851
69791f71 »
2010-09-24 Minor README adjustments.
852 === Using Sinatra as Middleware
5e8d5015 »
2010-09-24 Added "Using Sinatra as middleware" section, fixes GH #19.
853
854 Not only is Sinatra able to use other Rack middleware, any Sinatra application
855 can in turn be added in front of any Rack endpoint as middleware itself. This
856 endpoint could be another Sinatra application, or any other Rack-based
857 application (Rails/Ramaze/Camping/...).
858
859 require 'sinatra/base'
860
861 class LoginScreen < Sinatra::Base
862 enable :session
863
864 get('/login') { haml :login }
865
866 post('/login') do
867 if params[:name] = 'admin' and params[:password] = 'admin'
868 session['user_name'] = params[:name]
869 else
870 redirect '/login'
871 end
872 end
873 end
874
875 class MyApp < Sinatra::Base
876 # middleware will run before filters
877 use LoginScreen
878
879 before do
880 unless session['user_name']
881 halt "Access denied, please <a href='/login'>login</a>."
882 end
883 end
884
885 get('/') { "Hello #{session['user_name']}." }
886 end
887
3f21c3f4 »
2010-09-24 Document different scopes/bindings.
888 == Scopes and Binding
889
6233ce43 »
2010-09-24 Proof-reading Scopes section
890 The scope you are currently in determines what methods and variables are
891 available.
3f21c3f4 »
2010-09-24 Document different scopes/bindings.
892
893 === Application/Class Scope
894
895 Every Sinatra application corresponds to a subclass of Sinatra::Base. If you
896 are using the top level DSL (<tt>require 'sinatra'</tt>), then this class is
897 Sinatra::Application, otherwise it is the subclass you created explicitly. At
898 class level you have methods like `get` or `before`, but you cannot access the
899 `request` object or the `session`, as there only is a single application class
900 for all requests.
901
902 Options created via `set` are methods at class level:
903
904 class MyApp << Sinatra::Base
905 # Hey, I'm in the application scope!
906 set :foo, 42
907 foo # => 42
908
909 get '/foo' do
910 # Hey, I'm no longer in the application scope!
911 end
912 end
913
6233ce43 »
2010-09-24 Proof-reading Scopes section
914 You have the application scope binding inside:
3f21c3f4 »
2010-09-24 Document different scopes/bindings.
915
916 * Your application class body
917 * Methods defined by extensions
918 * The block passed to `helpers`
919 * Procs/blocks used as value for `set`
920
921 You can reach the scope object (the class) like this:
922
6233ce43 »
2010-09-24 Proof-reading Scopes section
923 * Via the object passed to configure blocks (<tt>configure { |c| ... }</tt>)
3f21c3f4 »
2010-09-24 Document different scopes/bindings.
924 * `settings` from within request scope
925
926 === Request/Instance Scope
927
6233ce43 »
2010-09-24 Proof-reading Scopes section
928 For every incoming request, a new instance of your application class is
929 created and all handler blocks run in that scope. From within this scope you
930 can access the `request` and `session` object or call rendering methods like
931 `erb` or `haml`. You can access the application scope from within the request
932 scope via the `settings` helper:
3f21c3f4 »
2010-09-24 Document different scopes/bindings.
933
934 class MyApp << Sinatra::Base
935 # Hey, I'm in the application scope!
936 get '/define_route/:name' do
937 # Request scope for '/define_route/:name'
938 @value = 42
939
940 settings.get("/#{params[:name]}") do
941 # Request scope for "/#{params[:name]}"
942 @value # => nil (not the same request)
943 end
944
945 "Route defined!"
946 end
947 end
948
6233ce43 »
2010-09-24 Proof-reading Scopes section
949 You have the request scope binding inside:
3f21c3f4 »
2010-09-24 Document different scopes/bindings.
950
951 * get/head/post/put/delete blocks
952 * before/after filters
953 * helper methods
954 * templates/views
955
956 === Delegation Scope
957
958 The delegation scope just forwards methods to the class scope. However, it
6233ce43 »
2010-09-24 Proof-reading Scopes section
959 does not behave 100% like the class scope, as you do not have the class'
960 binding: Only methods explicitly marked for delegation are available and you
961 do not share variables/state with the class scope (read: you have a different
962 `self`). You can explicitly add method delegations by calling
963 <tt>Sinatra::Delegator.delegate :method_name</tt>.
3f21c3f4 »
2010-09-24 Document different scopes/bindings.
964
6233ce43 »
2010-09-24 Proof-reading Scopes section
965 You have the delegate scope binding inside:
3f21c3f4 »
2010-09-24 Document different scopes/bindings.
966
967 * The top level binding, if you did <tt>require "sinatra"</tt>
6233ce43 »
2010-09-24 Proof-reading Scopes section
968 * An object extended with the `Sinatra::Delegator` mixin
3f21c3f4 »
2010-09-24 Document different scopes/bindings.
969
2e2e5959 »
2010-09-24 Remove Sinatra::Delegator sidebar (now covered by Scopes), keep "Have…
970 Have a look at the code for yourself: here's the
971 {Sinatra::Delegator mixin}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/base.rb#L1128]
69791f71 »
2010-09-24 Minor README adjustments.
972 being {included into the main namespace}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/main.rb#L28].
2e2e5959 »
2010-09-24 Remove Sinatra::Delegator sidebar (now covered by Scopes), keep "Have…
973
f44fb6aa »
2008-08-31 grammar/formatting pass over README
974 == Command line
1776a80d »
2008-03-24 Added Version and Docs
975
e75f4b3f »
2008-09-09 misc README formatting tweaks
976 Sinatra applications can be run directly:
f44fb6aa »
2008-08-31 grammar/formatting pass over README
977
4d616071 »
2010-03-01 update README/CHANGES re. -o
978 ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
1776a80d »
2008-03-24 Added Version and Docs
979
980 Options are:
981
982 -h # help
983 -p # set the port (default is 4567)
4d616071 »
2010-03-01 update README/CHANGES re. -o
984 -o # set the host (default is 0.0.0.0)
1776a80d »
2008-03-24 Added Version and Docs
985 -e # set the environment (default is development)
f29486ba »
2009-01-15 Note "-s" (server) command line option in README
986 -s # specify rack server/handler (default is thin)
e7e0e558 »
2008-04-14 Minor docfixes in README.rdoc
987 -x # turn on the mutex lock (default is off)
1776a80d »
2008-03-24 Added Version and Docs
988
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
989 == The Bleeding Edge
6326809e »
2008-08-31 Add a subsection about tools needed for Sinatra to the Contributing s…
990
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
991 If you would like to use Sinatra's latest bleeding code, create a local
992 clone and run your app with the <tt>sinatra/lib</tt> directory on the
993 <tt>LOAD_PATH</tt>:
6326809e »
2008-08-31 Add a subsection about tools needed for Sinatra to the Contributing s…
994
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
995 cd myapp
ba92616e »
2009-01-18 Updated README to point to github.com/sinatra/sinatra.git
996 git clone git://github.com/sinatra/sinatra.git
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
997 ruby -Isinatra/lib myapp.rb
480fbfa7 »
2008-08-31 minor formatting tweaks to cypher's README updates
998
4f30c1ce »
2009-05-12 fix unclosed <tt> in README
999 Alternatively, you can add the <tt>sinatra/lib</tt> directory to the
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
1000 <tt>LOAD_PATH</tt> in your application:
1776a80d »
2008-03-24 Added Version and Docs
1001
17cb177e »
2009-01-11 README and CHANGES tweaks for 0.9.0 release (#63)
1002 $LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
1003 require 'rubygems'
1776a80d »
2008-03-24 Added Version and Docs
1004 require 'sinatra'
1005
1006 get '/about' do
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
1007 "I'm running version " + Sinatra::VERSION
1776a80d »
2008-03-24 Added Version and Docs
1008 end
e6c5471a »
2008-08-31 Add a community section with info about the mailing list and irc channel
1009
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
1010 To update the Sinatra sources in the future:
d8fec168 »
2008-08-31 Add subsection about contributing a patch as well as a link to the is…
1011
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
1012 cd myproject/sinatra
1013 git pull
e6c5471a »
2008-08-31 Add a community section with info about the mailing list and irc channel
1014
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
1015 == More
e6c5471a »
2008-08-31 Add a community section with info about the mailing list and irc channel
1016
754f116a »
2010-03-07 README: better links to project website and mailing list
1017 * {Project Website}[http://www.sinatrarb.com/] - Additional documentation,
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
1018 news, and links to other resources.
754f116a »
2010-03-07 README: better links to project website and mailing list
1019 * {Contributing}[http://www.sinatrarb.com/contributing] - Find a bug? Need
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
1020 help? Have a patch?
60ac4490 »
2010-07-01 lighthouse => github issue
1021 * {Issue tracker}[http://github.com/sinatra/sinatra/issues]
5018264d »
2009-03-01 Tidy up README a bit; link to @sinatra on Twitter
1022 * {Twitter}[http://twitter.com/sinatra]
754f116a »
2010-03-07 README: better links to project website and mailing list
1023 * {Mailing List}[http://groups.google.com/group/sinatrarb/topics]
4298a777 »
2009-01-23 Tweak README formatting; move community/contributing to website
1024 * {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] on http://freenode.net
Something went wrong with that request. Please try again.