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