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