Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 940 lines (642 sloc) 24.071 kb
df800b5 Docs are started
Blake Mizerany authored
1 = Sinatra
2
4c91e54 @watchdogtimer Web applications should not be hyphenated
watchdogtimer authored
3 Sinatra is a DSL for quickly creating web applications in Ruby with minimal
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
4 effort:
df800b5 Docs are started
Blake Mizerany authored
5
6 # myapp.rb
7 require 'sinatra'
c37db5c @rkh minor adjustments and fixes for the readme examples
rkh authored
8
df800b5 Docs are started
Blake Mizerany authored
9 get '/' do
10 'Hello world!'
11 end
12
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
13 Install the gem and run with:
df800b5 Docs are started
Blake Mizerany authored
14
8465d49 @rkh Avoid `require "rubygems"` and `sudo` in README.
rkh authored
15 gem install sinatra
16 ruby -rubygems myapp.rb
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
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:
df800b5 Docs are started
Blake Mizerany authored
24
25 get '/' do
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
26 .. show something ..
df800b5 Docs are started
Blake Mizerany authored
27 end
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
28
df800b5 Docs are started
Blake Mizerany authored
29 post '/' do
30 .. create something ..
31 end
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
32
df800b5 Docs are started
Blake Mizerany authored
33 put '/' do
34 .. update something ..
35 end
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
36
df800b5 Docs are started
Blake Mizerany authored
37 delete '/' do
38 .. annihilate something ..
39 end
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
40
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
41 Routes are matched in the order they are defined. The first route that
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
42 matches the request is invoked.
1776a80 Added Version and Docs
Blake Mizerany authored
43
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
44 Route patterns may include named parameters, accessible via the
45 <tt>params</tt> hash:
1776a80 Added Version and Docs
Blake Mizerany authored
46
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
47 get '/hello/:name' do
ce0fe87 @scottj97 fix inaccurate comment in README
scottj97 authored
48 # matches "GET /hello/foo" and "GET /hello/bar"
a734cf3 @rtomayko I knew I shoulda taken that left turn at Hoboken
rtomayko authored
49 # params[:name] is 'foo' or 'bar'
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
50 "Hello #{params[:name]}!"
1776a80 Added Version and Docs
Blake Mizerany authored
51 end
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
52
6569d1b @bdimcheff Added route block params in routing statements [#140]
bdimcheff authored
53 You can also access named parameters via block parameters:
54
55 get '/hello/:name' do |n|
56 "Hello #{n}!"
57 end
58
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
59 Route patterns may also include splat (or wildcard) parameters, accessible
60 via the <tt>params[:splat]</tt> array.
1776a80 Added Version and Docs
Blake Mizerany authored
61
9c85e99 @vic Specs, documentation and fixes for splat'n routes
vic authored
62 get '/say/*/to/*' do
63 # matches /say/hello/to/world
a734cf3 @rtomayko I knew I shoulda taken that left turn at Hoboken
rtomayko authored
64 params[:splat] # => ["hello", "world"]
9c85e99 @vic Specs, documentation and fixes for splat'n routes
vic authored
65 end
66
67 get '/download/*.*' do
68 # matches /download/path/to/file.xml
a734cf3 @rtomayko I knew I shoulda taken that left turn at Hoboken
rtomayko authored
69 params[:splat] # => ["path/to/file", "xml"]
1776a80 Added Version and Docs
Blake Mizerany authored
70 end
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
71
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
72 Route matching with Regular Expressions:
73
74 get %r{/hello/([\w]+)} do
75 "Hello, #{params[:captures].first}!"
76 end
77
6569d1b @bdimcheff Added route block params in routing statements [#140]
bdimcheff authored
78 Or with a block parameter:
79
80 get %r{/hello/([\w]+)} do |c|
81 "Hello, #{c}!"
82 end
83
726feeb @rkh Documentation for condition. Fixes GH #15.
rkh authored
84 === Conditions
85
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
86 Routes may include a variety of matching conditions, such as the user agent:
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
87
1776a80 Added Version and Docs
Blake Mizerany authored
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
a734cf3 @rtomayko I knew I shoulda taken that left turn at Hoboken
rtomayko authored
93 # Matches non-songbird browsers
1776a80 Added Version and Docs
Blake Mizerany authored
94 end
df800b5 Docs are started
Blake Mizerany authored
95
fa52709 @rkh fix markup for inline code in README
rkh authored
96 Other available conditions are +host_name+ and +provides+:
726feeb @rkh Documentation for condition. Fixes GH #15.
rkh authored
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
aaeb564 @rkh document route return values, fixes GH #23
rkh authored
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
c6d0614 @rkh Minor README improvements.
rkh authored
129 You can return any object that would either be a valid Rack response, Rack
130 body object or HTTP status code:
aaeb564 @rkh document route return values, fixes GH #23
rkh authored
131
626f689 @rkh fix markup for multi word inline code in README
rkh authored
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>
9c73cf7 @rkh fix markup for multi word inline code in README, take two (apparently # ...
rkh authored
134 * An object that responds to <tt>#each</tt> and passes nothing but strings to the given block
aaeb564 @rkh document route return values, fixes GH #23
rkh authored
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
8fbd9c2 @rkh Simplify streaming example.
rkh authored
145 get('/') { Stream.new }
aaeb564 @rkh document route return values, fixes GH #23
rkh authored
146
a734cf3 @rtomayko I knew I shoulda taken that left turn at Hoboken
rtomayko authored
147 == Static Files
047edc6 update README with Static help
Blake Mizerany authored
148
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
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:
a734cf3 @rtomayko I knew I shoulda taken that left turn at Hoboken
rtomayko authored
151
152 set :public, File.dirname(__FILE__) + '/static'
df800b5 Docs are started
Blake Mizerany authored
153
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
154 Note that the public directory name is not included in the URL. A file
85b4462 @rtomayko README: fix formatting on static file note
rtomayko authored
155 <tt>./public/css/style.css</tt> is made available as
156 <tt>http://example.com/css/style.css</tt>.
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
157
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
158 == Views / Templates
df800b5 Docs are started
Blake Mizerany authored
159
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
160 Templates are assumed to be located directly under the <tt>./views</tt>
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
161 directory. To use a different views directory:
a734cf3 @rtomayko I knew I shoulda taken that left turn at Hoboken
rtomayko authored
162
163 set :views, File.dirname(__FILE__) + '/templates'
164
06161bf @cypher Note on passing template symbols vs. strings in README
cypher authored
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
1255737 @michelc Added a transition to better explain that templates must be defined with...
michelc authored
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.
06161bf @cypher Note on passing template symbols vs. strings in README
cypher authored
170
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
171 === Haml Templates
df800b5 Docs are started
Blake Mizerany authored
172
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
173 The haml gem/library is required to render HAML templates:
174
801163e @bmizerany closes #9779 Auto-require haml/erb/builder/sass
bmizerany authored
175 ## You'll need to require haml in your app
176 require 'haml'
177
df800b5 Docs are started
Blake Mizerany authored
178 get '/' do
179 haml :index
180 end
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
181
182 Renders <tt>./views/index.haml</tt>.
183
0321ada @dougireton In README docs, fix links to HAML and SASS Options pages.
dougireton authored
184 {Haml's options}[http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#options]
d359dc9 @kematzy Merge app-level haml/sass options with call options [#184]
kematzy authored
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
c37db5c @rkh minor adjustments and fixes for the readme examples
rkh authored
189 set :haml, :format => :html5 # default Haml format is :xhtml
d359dc9 @kematzy Merge app-level haml/sass options with call options [#184]
kematzy authored
190
191 get '/' do
c37db5c @rkh minor adjustments and fixes for the readme examples
rkh authored
192 haml :index, :format => :html4 # overridden
d359dc9 @kematzy Merge app-level haml/sass options with call options [#184]
kematzy authored
193 end
194
195
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
196 === Erb Templates
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
197
801163e @bmizerany closes #9779 Auto-require haml/erb/builder/sass
bmizerany authored
198 ## You'll need to require erb in your app
199 require 'erb'
200
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
201 get '/' do
202 erb :index
203 end
204
205 Renders <tt>./views/index.erb</tt>
206
7c5d693 @sr Doc for erubis
sr authored
207 === Erubis
208
84f2e0c @jstewart Correction to erubis template rendering instructions
jstewart authored
209 The erubis gem/library is required to render erubis templates:
7c5d693 @sr Doc for erubis
sr authored
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
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
220 === Builder Templates
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
221
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
222 The builder gem/library is required to render builder templates:
df800b5 Docs are started
Blake Mizerany authored
223
801163e @bmizerany closes #9779 Auto-require haml/erb/builder/sass
bmizerany authored
224 ## You'll need to require builder in your app
225 require 'builder'
226
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
227 get '/' do
228 content_type 'application/xml', :charset => 'utf-8'
229 builder :index
230 end
231
232 Renders <tt>./views/index.builder</tt>.
233
234 === Sass Templates
235
236 The sass gem/library is required to render Sass templates:
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
237
801163e @bmizerany closes #9779 Auto-require haml/erb/builder/sass
bmizerany authored
238 ## You'll need to require haml or sass in your app
239 require 'sass'
240
4144ac1 @nmeans Added Sass information to documentation.
nmeans authored
241 get '/stylesheet.css' do
ccc19b0 @rtomayko content_type response helper with mime type lookup and parameter support...
rtomayko authored
242 content_type 'text/css', :charset => 'utf-8'
4144ac1 @nmeans Added Sass information to documentation.
nmeans authored
243 sass :stylesheet
244 end
245
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
246 Renders <tt>./views/stylesheet.sass</tt>.
247
0321ada @dougireton In README docs, fix links to HAML and SASS Options pages.
dougireton authored
248 {Sass' options}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
d359dc9 @kematzy Merge app-level haml/sass options with call options [#184]
kematzy authored
249 can be set globally through Sinatra's configurations,
250 see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
251 and overridden on an individual basis.
252
c37db5c @rkh minor adjustments and fixes for the readme examples
rkh authored
253 set :sass, :style => :compact # default Sass style is :nested
d359dc9 @kematzy Merge app-level haml/sass options with call options [#184]
kematzy authored
254
255 get '/stylesheet.css' do
256 content_type 'text/css', :charset => 'utf-8'
b90d00c @sr Update sass example re. options
sr authored
257 sass :stylesheet, :style => :expanded # overridden
d359dc9 @kematzy Merge app-level haml/sass options with call options [#184]
kematzy authored
258 end
259
cf3c218 @pedromenezes Adding scss support through specific command
pedromenezes authored
260 === Scss Templates
261
262 The sass gem/library is required to render Scss templates:
263
264 ## You'll need to require haml or sass in your app
265 require 'sass'
266
267 get '/stylesheet.css' do
268 content_type 'text/css', :charset => 'utf-8'
269 scss :stylesheet
270 end
271
272 Renders <tt>./views/stylesheet.scss</tt>.
273
274 {Scss' options}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
275 can be set globally through Sinatra's configurations,
276 see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
277 and overridden on an individual basis.
278
c37db5c @rkh minor adjustments and fixes for the readme examples
rkh authored
279 set :scss, :style => :compact # default Scss style is :nested
cf3c218 @pedromenezes Adding scss support through specific command
pedromenezes authored
280
281 get '/stylesheet.css' do
282 content_type 'text/css', :charset => 'utf-8'
283 scss :stylesheet, :style => :expanded # overridden
284 end
285
621bfcb @Ptico Added Less support
Ptico authored
286 === Less Templates
287
288 The less gem/library is required to render Less templates:
289
290 ## You'll need to require less in your app
291 require 'less'
292
293 get '/stylesheet.css' do
294 content_type 'text/css', :charset => 'utf-8'
295 less :stylesheet
296 end
297
298 Renders <tt>./views/stylesheet.less</tt>.
299
28a3a35 @rkh Add liquid helper method. Tilt supports liquid for quite some time now, ...
rkh authored
300 === Liquid Templates
301
302 The liquid gem/library is required to render Liquid templates:
303
304 ## You'll need to require liquid in your app
305 require 'liquid'
306
307 get '/' do
308 liquid :index
309 end
310
311 Renders <tt>./views/index.liquid</tt>.
312
313 Since you cannot call Ruby methods (except for +yield+) from a Liquid
314 template, you almost always want to pass locals to it:
315
316 liquid :index, :locals => { :key => 'value' }
317
970169b @rkh Add markdown helper method. Tilt supports markdown for quite some time n...
rkh authored
318 === Markdown Templates
319
320 The rdiscount gem/library is required to render Markdown templates:
321
322 ## You'll need to require rdiscount in your app
323 require "rdiscount"
324
325 get '/' do
326 markdown :index
327 end
328
329 Renders <tt>./views/index.markdown</tt> (+md+ and +mkd+ are also valid file
330 extensions).
331
332 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:
333
334 erb :overview, :locals => { :text => markdown(:introduction) }
335
336 Note that you may also call the markdown method from within other templates:
337
338 %h1 Hello From Haml!
339 %p= markdown(:greetings)
340
b464e02 @rkh Add textile helper method. Tilt supports textile for quite some time now...
rkh authored
341 === Textile Templates
342
343 The RedCloth gem/library is required to render Textile templates:
344
345 ## You'll need to require rdiscount in your app
346 require "redcloth"
347
348 get '/' do
349 textile :index
350 end
351
352 Renders <tt>./views/index.textile</tt>.
353
354 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:
355
356 erb :overview, :locals => { :text => textile(:introduction) }
357
358 Note that you may also call the textile method from within other templates:
359
360 %h1 Hello From Haml!
361 %p= textile(:greetings)
362
c248dba @rkh Add rdoc helper method. Tilt supports RDoc for quite some time now, but ...
rkh authored
363 === RDoc Templates
364
365 The RDoc gem/library is required to render RDoc templates:
366
367 ## You'll need to require rdiscount in your app
368 require "rdoc"
369
370 get '/' do
371 rdoc :index
372 end
373
374 Renders <tt>./views/index.rdoc</tt>.
375
376 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:
377
378 erb :overview, :locals => { :text => rdoc(:introduction) }
379
380 Note that you may also call the rdoc method from within other templates:
381
382 %h1 Hello From Haml!
383 %p= rdoc(:greetings)
384
7cb94f2 @rkh Add radius helper method. Tilt supports radius for quite some time now, ...
rkh authored
385 === Radius Templates
386
387 The radius gem/library is required to render Radius templates:
388
389 ## You'll need to require radius in your app
390 require 'radius'
391
392 get '/' do
393 radius :index
394 end
395
396 Renders <tt>./views/index.radius</tt>.
397
398 Since you cannot call Ruby methods (except for +yield+) from a Radius
399 template, you almost always want to pass locals to it:
400
401 radius :index, :locals => { :key => 'value' }
402
8ce74b3 @rkh Add markaby helper method. Tilt supports Markaby for quite some time now...
rkh authored
403 === Markaby Templates
404
405 The markaby gem/library is required to render Markaby templates:
406
407 ## You'll need to require markaby in your app
408 require 'markaby'
409
410 get '/' do
411 markaby :index
412 end
413
414 Renders <tt>./views/index.mab</tt>.
415
f58d015 @rkh Add coffee helper method. Tilt supports CoffeeScript again, but it was n...
rkh authored
416 === CoffeeScript Templates
417
418 The coffee-script gem/library and the `coffee` binary are required to render
419 CoffeeScript templates:
420
421 ## You'll need to require coffee-script in your app
422 require 'coffee-script'
423
424 get '/application.js' do
425 content_type 'text/javascript', :charset => 'utf-8'
426 coffee :application
427 end
428
429 Renders <tt>./views/application.coffee</tt>.
430
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
431 === Inline Templates
df800b5 Docs are started
Blake Mizerany authored
432
433 get '/' do
434 haml '%div.title Hello World'
435 end
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
436
437 Renders the inlined template string.
df800b5 Docs are started
Blake Mizerany authored
438
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
439 === Accessing Variables in Templates
df800b5 Docs are started
Blake Mizerany authored
440
5018264 @rtomayko Tidy up README a bit; link to @sinatra on Twitter
rtomayko authored
441 Templates are evaluated within the same context as route handlers. Instance
442 variables set in route handlers are direcly accessible by templates:
df800b5 Docs are started
Blake Mizerany authored
443
444 get '/:id' do
445 @foo = Foo.find(params[:id])
95aca76 @bleything fix documentation of variable interpolation into templates
bleything authored
446 haml '%h1= @foo.name'
df800b5 Docs are started
Blake Mizerany authored
447 end
448
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
449 Or, specify an explicit Hash of local variables:
df800b5 Docs are started
Blake Mizerany authored
450
451 get '/:id' do
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
452 foo = Foo.find(params[:id])
95aca76 @bleything fix documentation of variable interpolation into templates
bleything authored
453 haml '%h1= foo.name', :locals => { :foo => foo }
df800b5 Docs are started
Blake Mizerany authored
454 end
455
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
456 This is typically used when rendering templates as partials from within
457 other templates.
458
3ef8eed @sr Deprecate use_in_file_templates!
sr authored
459 === Inline Templates
83cba9c @bmizerany updated README with helpful tidbits
bmizerany authored
460
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
461 Templates may be defined at the end of the source file:
83cba9c @bmizerany updated README with helpful tidbits
bmizerany authored
462
eec7d21 @bmizerany In-file-templates are automaticly loaded for you.
bmizerany authored
463 require 'sinatra'
464
83cba9c @bmizerany updated README with helpful tidbits
bmizerany authored
465 get '/' do
466 haml :index
467 end
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
468
83cba9c @bmizerany updated README with helpful tidbits
bmizerany authored
469 __END__
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
470
f71330e @bmizerany quick doc fix
bmizerany authored
471 @@ layout
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
472 %html
473 = yield
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
474
f71330e @bmizerany quick doc fix
bmizerany authored
475 @@ index
83cba9c @bmizerany updated README with helpful tidbits
bmizerany authored
476 %div.title Hello world!!!!!
477
3ef8eed @sr Deprecate use_in_file_templates!
sr authored
478 NOTE: Inline templates defined in the source file that requires sinatra
fa52709 @rkh fix markup for inline code in README
rkh authored
479 are automatically loaded. Call +enable :inline_templates+ explicitly if you
3ef8eed @sr Deprecate use_in_file_templates!
sr authored
480 have inline templates in other source files.
eec7d21 @bmizerany In-file-templates are automaticly loaded for you.
bmizerany authored
481
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
482 === Named Templates
483
5018264 @rtomayko Tidy up README a bit; link to @sinatra on Twitter
rtomayko authored
484 Templates may also be defined using the top-level <tt>template</tt> method:
83cba9c @bmizerany updated README with helpful tidbits
bmizerany authored
485
486 template :layout do
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
487 "%html\n =yield\n"
83cba9c @bmizerany updated README with helpful tidbits
bmizerany authored
488 end
489
490 template :index do
491 '%div.title Hello World!'
492 end
493
494 get '/' do
495 haml :index
496 end
497
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
498 If a template named "layout" exists, it will be used each time a template
499 is rendered. You can disable layouts by passing <tt>:layout => false</tt>.
578bbab @djanowski Updating README for :layout => true.
djanowski authored
500
501 get '/' do
502 haml :index, :layout => !request.xhr?
503 end
504
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
505 == Helpers
df800b5 Docs are started
Blake Mizerany authored
506
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
507 Use the top-level <tt>helpers</tt> method to define helper methods for use in
5018264 @rtomayko Tidy up README a bit; link to @sinatra on Twitter
rtomayko authored
508 route handlers and templates:
df800b5 Docs are started
Blake Mizerany authored
509
510 helpers do
511 def bar(name)
512 "#{name}bar"
513 end
514 end
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
515
1776a80 Added Version and Docs
Blake Mizerany authored
516 get '/:name' do
517 bar(params[:name])
518 end
df800b5 Docs are started
Blake Mizerany authored
519
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
520 == Filters
df800b5 Docs are started
Blake Mizerany authored
521
c6d0614 @rkh Minor README improvements.
rkh authored
522 Before filters are evaluated before each request within the same context as
523 the routes will be and can modify the request and response. Instance variables
524 set in filters are accessible by routes and templates:
1776a80 Added Version and Docs
Blake Mizerany authored
525
df800b5 Docs are started
Blake Mizerany authored
526 before do
a734cf3 @rtomayko I knew I shoulda taken that left turn at Hoboken
rtomayko authored
527 @note = 'Hi!'
528 request.path_info = '/foo/bar/baz'
529 end
530
531 get '/foo/*' do
532 @note #=> 'Hi!'
533 params[:splat] #=> 'bar/baz'
df800b5 Docs are started
Blake Mizerany authored
534 end
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
535
c6d0614 @rkh Minor README improvements.
rkh authored
536 After filter are evaluated after each request within the same context and can
537 also modify the request and response. Instance variables set in before filters
538 and routes are accessible by after filters:
4e50ddb @jschementi Adds after filters
jschementi authored
539
540 after do
541 puts response.status
542 end
543
c6d0614 @rkh Minor README improvements.
rkh authored
544 Filters optionally taking a pattern, causing them to be evaluated only if the
545 request path matches that pattern:
da047d3 @rkh add pattern matching to before/after filters.
rkh authored
546
547 before '/protected/*' do
548 authenticate!
549 end
550
551 after '/create/:slug' do |slug|
552 session[:last_slug] = slug
553 end
554
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
555 == Halting
a734cf3 @rtomayko I knew I shoulda taken that left turn at Hoboken
rtomayko authored
556
4e50ddb @jschementi Adds after filters
jschementi authored
557 To immediately stop a request within a filter or route use:
df800b5 Docs are started
Blake Mizerany authored
558
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
559 halt
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
560
c6d0614 @rkh Minor README improvements.
rkh authored
561 You can also specify the status when halting:
fbbd822 @sr More 'halt' doc
sr authored
562
563 halt 410
564
c6d0614 @rkh Minor README improvements.
rkh authored
565 Or the body:
df800b5 Docs are started
Blake Mizerany authored
566
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
567 halt 'this will be the body'
df800b5 Docs are started
Blake Mizerany authored
568
c6d0614 @rkh Minor README improvements.
rkh authored
569 Or both:
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
570
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
571 halt 401, 'go away!'
df800b5 Docs are started
Blake Mizerany authored
572
c6d0614 @rkh Minor README improvements.
rkh authored
573 With headers:
fbbd822 @sr More 'halt' doc
sr authored
574
575 halt 402, {'Content-Type' => 'text/plain'}, 'revenge'
576
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
577 == Passing
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
578
5018264 @rtomayko Tidy up README a bit; link to @sinatra on Twitter
rtomayko authored
579 A route can punt processing to the next matching route using <tt>pass</tt>:
df800b5 Docs are started
Blake Mizerany authored
580
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
581 get '/guess/:who' do
582 pass unless params[:who] == 'Frank'
6c9488e @sr Stick to single quote; kill a blank line
sr authored
583 'You got me!'
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
584 end
585
586 get '/guess/*' do
6c9488e @sr Stick to single quote; kill a blank line
sr authored
587 'You missed!'
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
588 end
589
590 The route block is immediately exited and control continues with the next
591 matching route. If no matching route is found, a 404 is returned.
df800b5 Docs are started
Blake Mizerany authored
592
13fc79d @rtomayko Remove support for source file reloading [#166]
rtomayko authored
593 == Configuration
1776a80 Added Version and Docs
Blake Mizerany authored
594
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
595 Run once, at startup, in any environment:
1776a80 Added Version and Docs
Blake Mizerany authored
596
597 configure do
e75f4b3 @rtomayko misc README formatting tweaks
rtomayko authored
598 ...
1776a80 Added Version and Docs
Blake Mizerany authored
599 end
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
600
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
601 Run only when the environment (RACK_ENV environment variable) is set to
13fc79d @rtomayko Remove support for source file reloading [#166]
rtomayko authored
602 <tt>:production</tt>:
1776a80 Added Version and Docs
Blake Mizerany authored
603
604 configure :production do
e75f4b3 @rtomayko misc README formatting tweaks
rtomayko authored
605 ...
1776a80 Added Version and Docs
Blake Mizerany authored
606 end
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
607
13fc79d @rtomayko Remove support for source file reloading [#166]
rtomayko authored
608 Run when the environment is set to either <tt>:production</tt> or
609 <tt>:test</tt>:
1776a80 Added Version and Docs
Blake Mizerany authored
610
611 configure :production, :test do
e75f4b3 @rtomayko misc README formatting tweaks
rtomayko authored
612 ...
1776a80 Added Version and Docs
Blake Mizerany authored
613 end
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
614
e75f4b3 @rtomayko misc README formatting tweaks
rtomayko authored
615 == Error handling
1776a80 Added Version and Docs
Blake Mizerany authored
616
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
617 Error handlers run within the same context as routes and before filters, which
c6d0614 @rkh Minor README improvements.
rkh authored
618 means you get all the goodies it has to offer, like <tt>haml</tt>,
619 <tt>erb</tt>, <tt>halt</tt>, etc.
1776a80 Added Version and Docs
Blake Mizerany authored
620
e75f4b3 @rtomayko misc README formatting tweaks
rtomayko authored
621 === Not Found
1776a80 Added Version and Docs
Blake Mizerany authored
622
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
623 When a <tt>Sinatra::NotFound</tt> exception is raised, or the response's status
624 code is 404, the <tt>not_found</tt> handler is invoked:
1776a80 Added Version and Docs
Blake Mizerany authored
625
626 not_found do
c6d0614 @rkh Minor README improvements.
rkh authored
627 'This is nowhere to be found.'
1776a80 Added Version and Docs
Blake Mizerany authored
628 end
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
629
e75f4b3 @rtomayko misc README formatting tweaks
rtomayko authored
630 === Error
83cba9c @bmizerany updated README with helpful tidbits
bmizerany authored
631
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
632 The +error+ handler is invoked any time an exception is raised from a route
63fd773 @sr Small doc fix re. after filter
sr authored
633 block or a filter. The exception object can be obtained from the
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
634 <tt>sinatra.error</tt> Rack variable:
83cba9c @bmizerany updated README with helpful tidbits
bmizerany authored
635
1776a80 Added Version and Docs
Blake Mizerany authored
636 error do
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
637 'Sorry there was a nasty error - ' + env['sinatra.error'].name
83cba9c @bmizerany updated README with helpful tidbits
bmizerany authored
638 end
639
e75f4b3 @rtomayko misc README formatting tweaks
rtomayko authored
640 Custom errors:
83cba9c @bmizerany updated README with helpful tidbits
bmizerany authored
641
642 error MyCustomError do
e7e0e55 @rtomayko Minor docfixes in README.rdoc
rtomayko authored
643 'So what happened was...' + request.env['sinatra.error'].message
1776a80 Added Version and Docs
Blake Mizerany authored
644 end
83cba9c @bmizerany updated README with helpful tidbits
bmizerany authored
645
e75f4b3 @rtomayko misc README formatting tweaks
rtomayko authored
646 Then, if this happens:
83cba9c @bmizerany updated README with helpful tidbits
bmizerany authored
647
648 get '/' do
649 raise MyCustomError, 'something bad'
650 end
651
e75f4b3 @rtomayko misc README formatting tweaks
rtomayko authored
652 You get this:
83cba9c @bmizerany updated README with helpful tidbits
bmizerany authored
653
654 So what happened was... something bad
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
655
59e797e @sr Doc for error(500) { }
sr authored
656 Alternatively, you can install error handler for a status code:
657
658 error 403 do
659 'Access forbidden'
660 end
661
662 get '/secret' do
663 403
664 end
665
666 Or a range:
667
668 error 400..510 do
669 'Boom'
670 end
671
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
672 Sinatra installs special <tt>not_found</tt> and <tt>error</tt> handlers when
673 running under the development environment.
83cba9c @bmizerany updated README with helpful tidbits
bmizerany authored
674
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
675 == Mime types
676
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
677 When using <tt>send_file</tt> or static files you may have mime types Sinatra
6d8b333 @sr Update README re. mime_type
sr authored
678 doesn't understand. Use +mime_type+ to register them by file extension:
83cba9c @bmizerany updated README with helpful tidbits
bmizerany authored
679
6d8b333 @sr Update README re. mime_type
sr authored
680 mime_type :foo, 'text/foo'
1776a80 Added Version and Docs
Blake Mizerany authored
681
cb8fcb6 @sr Doc for content_type :foo
sr authored
682 You can also use it with the +content_type+ helper:
683
684 content_type :foo
685
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
686 == Rack Middleware
bda21f1 @rtomayko add doc on using Rack middleware to README
rtomayko authored
687
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
688 Sinatra rides on Rack[http://rack.rubyforge.org/], a minimal standard
689 interface for Ruby web frameworks. One of Rack's most interesting capabilities
690 for application developers is support for "middleware" -- components that sit
691 between the server and your application monitoring and/or manipulating the
692 HTTP request/response to provide various types of common functionality.
bda21f1 @rtomayko add doc on using Rack middleware to README
rtomayko authored
693
e75f4b3 @rtomayko misc README formatting tweaks
rtomayko authored
694 Sinatra makes building Rack middleware pipelines a cinch via a top-level
695 +use+ method:
bda21f1 @rtomayko add doc on using Rack middleware to README
rtomayko authored
696
697 require 'sinatra'
698 require 'my_custom_middleware'
699
700 use Rack::Lint
701 use MyCustomMiddleware
702
703 get '/hello' do
704 'Hello World'
705 end
706
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
707 The semantics of +use+ are identical to those defined for the
708 Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html] DSL
709 (most frequently used from rackup files). For example, the +use+ method
710 accepts multiple/variable args as well as blocks:
bda21f1 @rtomayko add doc on using Rack middleware to README
rtomayko authored
711
712 use Rack::Auth::Basic do |username, password|
713 username == 'admin' && password == 'secret'
714 end
715
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
716 Rack is distributed with a variety of standard middleware for logging,
717 debugging, URL routing, authentication, and session handling. Sinatra uses
718 many of of these components automatically based on configuration so you
719 typically don't have to +use+ them explicitly.
bda21f1 @rtomayko add doc on using Rack middleware to README
rtomayko authored
720
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
721 == Testing
1776a80 Added Version and Docs
Blake Mizerany authored
722
c831278 @rtomayko Recommend Rack::Test in README / note Sinatra::Test deprecation
rtomayko authored
723 Sinatra tests can be written using any Rack-based testing library
724 or framework. {Rack::Test}[http://gitrdoc.com/brynary/rack-test] is
725 recommended:
c00a25e @rtomayko Test framework refactoring
rtomayko authored
726
7cfe04a @jcrosby Fix for test/unit and test/spec docs
jcrosby authored
727 require 'my_sinatra_app'
c3f167f @xentek MOD: docs for testing forgot to require test/unit
xentek authored
728 require 'test/unit'
c831278 @rtomayko Recommend Rack::Test in README / note Sinatra::Test deprecation
rtomayko authored
729 require 'rack/test'
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
730
1776a80 Added Version and Docs
Blake Mizerany authored
731 class MyAppTest < Test::Unit::TestCase
c831278 @rtomayko Recommend Rack::Test in README / note Sinatra::Test deprecation
rtomayko authored
732 include Rack::Test::Methods
733
734 def app
735 Sinatra::Application
736 end
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
737
2f377e2 @rtomayko Trim down Testing section in the README; link to doc site instead
rtomayko authored
738 def test_my_default
c00a25e @rtomayko Test framework refactoring
rtomayko authored
739 get '/'
c831278 @rtomayko Recommend Rack::Test in README / note Sinatra::Test deprecation
rtomayko authored
740 assert_equal 'Hello World!', last_response.body
1776a80 Added Version and Docs
Blake Mizerany authored
741 end
10c90d5 @sr document testing with rspec
sr authored
742
2f377e2 @rtomayko Trim down Testing section in the README; link to doc site instead
rtomayko authored
743 def test_with_params
c831278 @rtomayko Recommend Rack::Test in README / note Sinatra::Test deprecation
rtomayko authored
744 get '/meet', :name => 'Frank'
745 assert_equal 'Hello Frank!', last_response.body
10c90d5 @sr document testing with rspec
sr authored
746 end
747
2f377e2 @rtomayko Trim down Testing section in the README; link to doc site instead
rtomayko authored
748 def test_with_rack_env
c831278 @rtomayko Recommend Rack::Test in README / note Sinatra::Test deprecation
rtomayko authored
749 get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
750 assert_equal "You're using Songbird!", last_response.body
1fb5b99 @dylanegan Bacon support
dylanegan authored
751 end
752 end
753
c831278 @rtomayko Recommend Rack::Test in README / note Sinatra::Test deprecation
rtomayko authored
754 NOTE: The built-in Sinatra::Test module and Sinatra::TestHarness class
755 are deprecated as of the 0.9.2 release.
1776a80 Added Version and Docs
Blake Mizerany authored
756
5360333 @sr Add a note about Sinatra::Base to the README
sr authored
757 == Sinatra::Base - Middleware, Libraries, and Modular Apps
758
759 Defining your app at the top-level works well for micro-apps but has
760 considerable drawbacks when building reuseable components such as Rack
761 middleware, Rails metal, simple libraries with a server component, or
762 even Sinatra extensions. The top-level DSL pollutes the Object namespace
763 and assumes a micro-app style configuration (e.g., a single application
764 file, ./public and ./views directories, logging, exception detail page,
765 etc.). That's where Sinatra::Base comes into play:
766
767 require 'sinatra/base'
768
769 class MyApp < Sinatra::Base
770 set :sessions, true
771 set :foo, 'bar'
772
773 get '/' do
774 'Hello world!'
775 end
776 end
777
778 The MyApp class is an independent Rack component that can act as
779 Rack middleware, a Rack application, or Rails metal. You can +use+ or
780 +run+ this class from a rackup +config.ru+ file; or, control a server
781 component shipped as a library:
782
783 MyApp.run! :host => 'localhost', :port => 9090
784
785 The methods available to Sinatra::Base subclasses are exactly as those
786 available via the top-level DSL. Most top-level apps can be converted to
787 Sinatra::Base components with two modifications:
788
789 * Your file should require +sinatra/base+ instead of +sinatra+;
790 otherwise, all of Sinatra's DSL methods are imported into the main
791 namespace.
792 * Put your app's routes, error handlers, filters, and options in a subclass
793 of Sinatra::Base.
794
795 +Sinatra::Base+ is a blank slate. Most options are disabled by default,
796 including the built-in server. See {Options and Configuration}[http://sinatra.github.com/configuration.html]
797 for details on available options and their behavior.
798
799 SIDEBAR: Sinatra's top-level DSL is implemented using a simple delegation
800 system. The +Sinatra::Application+ class -- a special subclass of
801 Sinatra::Base -- receives all :get, :put, :post, :delete, :before,
802 :error, :not_found, :configure, and :set messages sent to the
803 top-level. Have a look at the code for yourself: here's the
035fe47 @sr fix Delegator links in README
sr authored
804 {Sinatra::Delegator mixin}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/base.rb#L1128]
805 being {included into the main namespace}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/main.rb#L28]
5360333 @sr Add a note about Sinatra::Base to the README
sr authored
806
3f21c3f @rkh Document different scopes/bindings.
rkh authored
807 == Scopes and Binding
808
6233ce4 @rkh Proof-reading Scopes section
rkh authored
809 The scope you are currently in determines what methods and variables are
810 available.
3f21c3f @rkh Document different scopes/bindings.
rkh authored
811
812 === Application/Class Scope
813
814 Every Sinatra application corresponds to a subclass of Sinatra::Base. If you
815 are using the top level DSL (<tt>require 'sinatra'</tt>), then this class is
816 Sinatra::Application, otherwise it is the subclass you created explicitly. At
817 class level you have methods like `get` or `before`, but you cannot access the
818 `request` object or the `session`, as there only is a single application class
819 for all requests.
820
821 Options created via `set` are methods at class level:
822
823 class MyApp << Sinatra::Base
824 # Hey, I'm in the application scope!
825 set :foo, 42
826 foo # => 42
827
828 get '/foo' do
829 # Hey, I'm no longer in the application scope!
830 end
831 end
832
6233ce4 @rkh Proof-reading Scopes section
rkh authored
833 You have the application scope binding inside:
3f21c3f @rkh Document different scopes/bindings.
rkh authored
834
835 * Your application class body
836 * Methods defined by extensions
837 * The block passed to `helpers`
838 * Procs/blocks used as value for `set`
839
840 You can reach the scope object (the class) like this:
841
6233ce4 @rkh Proof-reading Scopes section
rkh authored
842 * Via the object passed to configure blocks (<tt>configure { |c| ... }</tt>)
3f21c3f @rkh Document different scopes/bindings.
rkh authored
843 * `settings` from within request scope
844
845 === Request/Instance Scope
846
6233ce4 @rkh Proof-reading Scopes section
rkh authored
847 For every incoming request, a new instance of your application class is
848 created and all handler blocks run in that scope. From within this scope you
849 can access the `request` and `session` object or call rendering methods like
850 `erb` or `haml`. You can access the application scope from within the request
851 scope via the `settings` helper:
3f21c3f @rkh Document different scopes/bindings.
rkh authored
852
853 class MyApp << Sinatra::Base
854 # Hey, I'm in the application scope!
855 get '/define_route/:name' do
856 # Request scope for '/define_route/:name'
857 @value = 42
858
859 settings.get("/#{params[:name]}") do
860 # Request scope for "/#{params[:name]}"
861 @value # => nil (not the same request)
862 end
863
864 "Route defined!"
865 end
866 end
867
6233ce4 @rkh Proof-reading Scopes section
rkh authored
868 You have the request scope binding inside:
3f21c3f @rkh Document different scopes/bindings.
rkh authored
869
870 * get/head/post/put/delete blocks
871 * before/after filters
872 * helper methods
873 * templates/views
874
875 === Delegation Scope
876
877 The delegation scope just forwards methods to the class scope. However, it
6233ce4 @rkh Proof-reading Scopes section
rkh authored
878 does not behave 100% like the class scope, as you do not have the class'
879 binding: Only methods explicitly marked for delegation are available and you
880 do not share variables/state with the class scope (read: you have a different
881 `self`). You can explicitly add method delegations by calling
882 <tt>Sinatra::Delegator.delegate :method_name</tt>.
3f21c3f @rkh Document different scopes/bindings.
rkh authored
883
6233ce4 @rkh Proof-reading Scopes section
rkh authored
884 You have the delegate scope binding inside:
3f21c3f @rkh Document different scopes/bindings.
rkh authored
885
886 * The top level binding, if you did <tt>require "sinatra"</tt>
6233ce4 @rkh Proof-reading Scopes section
rkh authored
887 * An object extended with the `Sinatra::Delegator` mixin
3f21c3f @rkh Document different scopes/bindings.
rkh authored
888
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
889 == Command line
1776a80 Added Version and Docs
Blake Mizerany authored
890
e75f4b3 @rtomayko misc README formatting tweaks
rtomayko authored
891 Sinatra applications can be run directly:
f44fb6a @rtomayko grammar/formatting pass over README
rtomayko authored
892
4d61607 @sr update README/CHANGES re. -o
sr authored
893 ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
1776a80 Added Version and Docs
Blake Mizerany authored
894
895 Options are:
896
897 -h # help
898 -p # set the port (default is 4567)
4d61607 @sr update README/CHANGES re. -o
sr authored
899 -o # set the host (default is 0.0.0.0)
1776a80 Added Version and Docs
Blake Mizerany authored
900 -e # set the environment (default is development)
f29486b @karmi Note "-s" (server) command line option in README
karmi authored
901 -s # specify rack server/handler (default is thin)
e7e0e55 @rtomayko Minor docfixes in README.rdoc
rtomayko authored
902 -x # turn on the mutex lock (default is off)
1776a80 Added Version and Docs
Blake Mizerany authored
903
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
904 == The Bleeding Edge
6326809 @cypher Add a subsection about tools needed for Sinatra to the Contributing sect...
cypher authored
905
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
906 If you would like to use Sinatra's latest bleeding code, create a local
907 clone and run your app with the <tt>sinatra/lib</tt> directory on the
908 <tt>LOAD_PATH</tt>:
6326809 @cypher Add a subsection about tools needed for Sinatra to the Contributing sect...
cypher authored
909
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
910 cd myapp
ba92616 @bmizerany Updated README to point to github.com/sinatra/sinatra.git
bmizerany authored
911 git clone git://github.com/sinatra/sinatra.git
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
912 ruby -Isinatra/lib myapp.rb
480fbfa @rtomayko minor formatting tweaks to cypher's README updates
rtomayko authored
913
4f30c1c fix unclosed <tt> in README
Mathew Cucuzella authored
914 Alternatively, you can add the <tt>sinatra/lib</tt> directory to the
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
915 <tt>LOAD_PATH</tt> in your application:
1776a80 Added Version and Docs
Blake Mizerany authored
916
17cb177 @cypher README and CHANGES tweaks for 0.9.0 release (#63)
cypher authored
917 $LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
918 require 'rubygems'
1776a80 Added Version and Docs
Blake Mizerany authored
919 require 'sinatra'
920
921 get '/about' do
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
922 "I'm running version " + Sinatra::VERSION
1776a80 Added Version and Docs
Blake Mizerany authored
923 end
e6c5471 @cypher Add a community section with info about the mailing list and irc channel
cypher authored
924
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
925 To update the Sinatra sources in the future:
d8fec16 @cypher Add subsection about contributing a patch as well as a link to the issue...
cypher authored
926
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
927 cd myproject/sinatra
928 git pull
e6c5471 @cypher Add a community section with info about the mailing list and irc channel
cypher authored
929
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
930 == More
e6c5471 @cypher Add a community section with info about the mailing list and irc channel
cypher authored
931
754f116 @rtomayko README: better links to project website and mailing list
rtomayko authored
932 * {Project Website}[http://www.sinatrarb.com/] - Additional documentation,
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
933 news, and links to other resources.
754f116 @rtomayko README: better links to project website and mailing list
rtomayko authored
934 * {Contributing}[http://www.sinatrarb.com/contributing] - Find a bug? Need
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
935 help? Have a patch?
60ac449 @sr lighthouse => github issue
sr authored
936 * {Issue tracker}[http://github.com/sinatra/sinatra/issues]
5018264 @rtomayko Tidy up README a bit; link to @sinatra on Twitter
rtomayko authored
937 * {Twitter}[http://twitter.com/sinatra]
754f116 @rtomayko README: better links to project website and mailing list
rtomayko authored
938 * {Mailing List}[http://groups.google.com/group/sinatrarb/topics]
4298a77 @rtomayko Tweak README formatting; move community/contributing to website
rtomayko authored
939 * {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] on http://freenode.net
Something went wrong with that request. Please try again.