README.rdoc in rtomayko-sinatra-0.3.3 vs README.rdoc in rtomayko-sinatra-0.8.9
- old
+ new
@@ -1,12 +1,10 @@
= Sinatra
Sinatra is a DSL for quickly creating web-applications in Ruby with minimal
-effort.
+effort:
-== Sample App
-
# myapp.rb
require 'rubygems'
require 'sinatra'
get '/' do
'Hello world!'
@@ -30,95 +28,106 @@
delete '/' do
.. annihilate something ..
end
- head '/' do
-
- end
-
-NOTE: <tt>put</tt> and <tt>delete</tt> are also triggered when a
-<tt>_method</tt> parameter is set to PUT or DELETE and the HTTP request method
-is POST
-
== Routes
Routes are matched based on the order of declaration. The first route that
matches the request is invoked.
-Simple:
+Basic routes:
get '/hi' do
...
end
-Named parameters:
+Route patterns may include named parameters, accessible via the
+<tt>params</tt> hash:
get '/:name' do
- # matches /sinatra and the like and sets params[:name]
+ # matches "GET /foo" and "GET /bar"
+ # params[:name] is 'foo' or 'bar'
+ "Hello #{params[:name]}!"
end
-Splat parameters:
+Route patterns may also include splat (or wildcard) parameters, accessible
+via the <tt>params[:splat]</tt> array.
get '/say/*/to/*' do
# matches /say/hello/to/world
- params["splat"] # => ["hello", "world"]
+ params[:splat] # => ["hello", "world"]
end
get '/download/*.*' do
# matches /download/path/to/file.xml
- params["splat"] # => ["path/to/file", "xml"]
+ params[:splat] # => ["path/to/file", "xml"]
end
-User agent matching:
+Route matching with Regular Expressions:
+ get %r{/hello/([\w]+)} do
+ "Hello, #{params[:captures].first}!"
+ end
+
+Routes may include a variety of matching conditions, such as the user agent:
+
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
"You're using Songbird version #{params[:agent][0]}"
end
get '/foo' do
- # matches non-songbird browsers
+ # Matches non-songbird browsers
end
-== Static files
+== Static Files
-Put all of your static content in the ./public directory
+Static files are served from the <tt>./public</tt> directory. You can specify
+a different location by setting the <tt>:public</tt> option:
- root
- \ public
+ set :public, File.dirname(__FILE__) + '/static'
-If a file exists that maps to the REQUEST_PATH then it is served and the
-request ends. Otherwise, Sinatra will look for an event that matches the
-path.
+== Views / Templates
-== Views
+Templates are assumed to be located directly under a <tt>./views</tt>
+directory. To use a different views directory:
-Views are searched for in a "views" directory in the same location as
-your main application.
+ set :views, File.dirname(__FILE__) + '/templates'
=== Haml Templates
+The haml gem/library is required to render HAML templates:
+
get '/' do
haml :index
end
Renders <tt>./views/index.haml</tt>.
-=== Erb
+=== Erb Templates
get '/' do
erb :index
end
Renders <tt>./views/index.erb</tt>
-=== Builder
+=== Builder Templates
-See Sinatra::Builder
+The builder gem/library is required to render builder templates:
-=== Sass
+ get '/' do
+ content_type 'application/xml', :charset => 'utf-8'
+ builder :index
+ end
+Renders <tt>./views/index.builder</tt>.
+
+=== Sass Templates
+
+The sass gem/library is required to render Sass templates:
+
get '/stylesheet.css' do
content_type 'text/css', :charset => 'utf-8'
sass :stylesheet
end
@@ -132,13 +141,12 @@
Renders the inlined template string.
=== Accessing Variables
-Templates are evaluated within the Sinatra::EventContext instance
-used to evaluate event blocks. Instance variables set in event
-blocks can be accessed direcly in views:
+Templates are evaluated within the same context as the route blocks. Instance
+variables set in route blocks are available in templates:
get '/:id' do
@foo = Foo.find(params[:id])
haml '%h1= @foo.name'
end
@@ -164,36 +172,42 @@
use_in_file_templates!
__END__
@@ layout
- X
- = yield
- X
+ %html
+ = yield
@@ index
%div.title Hello world!!!!!
It's also possible to define named templates using the top-level template
method:
template :layout do
- "X\n=yield\nX"
+ "%html\n =yield\n"
end
template :index do
'%div.title Hello World!'
end
get '/' do
haml :index
end
+If a template named "layout" exists, it will be used each time a template
+is rendered. You can disable layouts by passing <tt>:layout => false</tt>.
+
+ get '/' do
+ haml :index, :layout => !request.xhr?
+ end
+
== Helpers
-The top-level <tt>helpers</tt> method takes a block and extends all
-EventContext instances with the methods defined:
+Use the top-level <tt>helpers</tt> method to define helper methods for use in
+route blocks and templates:
helpers do
def bar(name)
"#{name}bar"
end
@@ -203,114 +217,106 @@
bar(params[:name])
end
== Filters
-These are run in Sinatra::EventContext before every event.
+Before filters are evaluated before each request within the context of the
+request and can modify the request and response. Instance variables set in
+filters are accessible by routes and templates.
before do
- .. this code will run before each event ..
+ @note = 'Hi!'
+ request.path_info = '/foo/bar/baz'
end
-== Halt!
+ get '/foo/*' do
+ @note #=> 'Hi!'
+ params[:splat] #=> 'bar/baz'
+ end
-To immediately stop a request during a before filter or event use:
+== Halting
- throw :halt
+To immediately stop a request during a before filter or route use:
-Set the body to the result of a helper method
+ halt
- throw :halt, :helper_method
+You can also specify a body when halting ...
-Set the body to the result of a helper method after sending it parameters from
-the local scope
+ halt 'this will be the body'
- throw :halt, [:helper_method, foo, bar]
+Set the status and body ...
-Set the body to a simple string
+ halt 401, 'go away!'
- throw :halt, 'this will be the body'
+== Passing
-Set status then the body
+A route can punt processing to the next matching route using the <tt>pass</tt>
+statement:
- throw :halt, [401, 'go away!']
-
-Set the status then call a helper method with params from local scope
-
- throw :halt, [401, [:helper_method, foo, bar]]
-
-Run a proc inside the Sinatra::EventContext instance and set the body to the
-result
-
- throw :halt, lambda { puts 'In a proc!'; 'I just wrote to $stdout!' }
-
-Create you own to_result
-
- class MyResultObject
- def to_result(event_context, *args)
- event_context.body = 'This will be the body!
- end
+ get '/guess/:who' do
+ pass unless params[:who] == 'Frank'
+ "You got me!"
end
- get '/' do
- throw :halt, MyResultObject.new
+ get '/guess/*' do
+ "You missed!"
end
-Get the gist? If you want more fun with this then checkout <tt>to_result</tt>
-on Array, Symbol, Fixnum, NilClass.
+The route block is immediately exited and control continues with the next
+matching route. If no matching route is found, a 404 is returned.
== Configuration and Reloading
Sinatra supports multiple environments and reloading. Reloading happens
-before every request when running under the :development environment. Wrap
-your configurations in <tt>configure</tt> (i.e. Database connections, Constants,
-etc.) to protect them from reloading or to target specific environments.
+before each request when running under the <tt>:development</tt>
+environment. Wrap your configurations (e.g., database connections, constants,
+etc.) in <tt>configure</tt> blocks to protect them from reloading or to
+target specific environments.
-All environments:
+Run once, at startup, in any environment:
configure do
...
end
-Production:
+Run only when the environment (RACK_ENV environment variable) is set to
+<tt>:production</tt>.
configure :production do
...
end
-Two at a time:
+Run when the environment (RACK_ENV environment variable) is set to
+either <tt>:production</tt> or <tt>:test</tt>.
configure :production, :test do
...
end
-This is also really nifty for error handling.
-
== Error handling
-Error handlers run inside the current Sinatra::EventContext instance, which
-means you get all the goodies it has to offer (i.e. haml, erb, throw :halt,
-etc.)
+Error handlers run within the same context as routes and before filters, which
+means you get all the goodies it has to offer, like <tt>haml</tt>, <tt>erb</tt>,
+<tt>halt</tt>, etc.
=== Not Found
-When Sinatra::NotFound is raised, the not_found handler is invoked:
+When a <tt>Sinatra::NotFound</tt> exception is raised, or the response's status
+code is 404, the <tt>not_found</tt> handler is invoked:
not_found do
'This is nowhere to be found'
end
=== Error
-By default, the +error+ handler is invoked on Sinatra::ServerError or when
-an unknown error occurs.
+The +error+ handler is invoked any time an exception is raised from a route
+block or before filter. The exception object can be obtained from the
+'sinatra.error' Rack variable:
-The exception can be obtained from the 'sinatra.error' variable in
-request.env.
-
error do
- 'Sorry there was a nasty error - ' + request.env['sinatra.error'].name
+ 'Sorry there was a nasty error - ' + env['sinatra.error'].name
end
Custom errors:
error MyCustomError do
@@ -326,16 +332,16 @@
You get this:
So what happened was... something bad
Sinatra installs special not_found and error handlers when running under
-the development.
+the development environment.
== Mime types
-When using send_file or static files you may have mime types Sinatra doesn't
-understand. Use +mime+ in those cases.
+When using <tt>send_file</tt> or static files you may have mime types Sinatra
+doesn't understand. Use +mime+ to register them by file extension:
mime :foo, 'text/foo'
== Rack Middleware
@@ -479,10 +485,10 @@
=== Using Edge Sinatra in Your App
at the top of your sinatra_app.rb file:
- $:.unshift File.dirname(__FILE__) + '/sinatra/lib'
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
require 'sinatra'
get '/about' do
"I'm running on Version " + Sinatra::VERSION
end