= Sinatra::OutputBuffer A Sinatra Extension that makes content output buffering easy within your apps or extensions. == Why was this gem created ? To enable the Sinatra community to quickly and easily add this functionality to any app / extension they wish to create. ie: preventing time waste or the 're-invention of the wheel'. == Installation # Add RubyGems.org (former Gemcutter) to your RubyGems sources $ gem sources -a http://rubygems.org $ (sudo)? gem install sinatra-outputbuffer == Dependencies This Gem depends upon the following: === Runtime: * sinatra ( >= 1.0.a ) === Development & Tests: * sinatra-tests (>= 0.1.6) * rspec (>= 1.3.0 ) * rack-test (>= 0.5.3) * rspec_hpricot_matchers (>= 0.1.0) == Getting Started Sinatra::OutputBuffer could be very useful in essentially two scenarios: * Apps * Sinatra extensions === In Apps In the App scenario, Sinatra::OutputBuffer provides the following helper methods: * content_for * yield_content You can access those methods by doing the following: class YourApp < Sinatra::Base helpers Sinatra::OutputBuffer::Helpers end Then you can use them as follows: <% content_for :some_key do %>

some HTML content here

<% end %> <%= yield_content :some_key %> NB! the syntax used for calling these methods. Or in Haml - content_for :some_key do %h1 some HTML content here = yield_content :some_key NB! the syntax used for calling these methods. A more concrete example: # in ../views/layout.erb # in ../views/template.erb <% content_for :custom_css do %> body { color: red; } <% end %> # in ../views/shared/sidebar.erb <% content_for :custom_css do %> #sidebar { background-color: black; } <% end %> Which outputs: The methods outlined below are also available in this mode, but not as useful (?) as when used in extensions. === In Sinatra Extensions When developing a Sinatra Extension, then you just require the gem and include / register it into the extension you are developing, like this: require 'sinatra/outputbuffer' module Sinatra module YourExtension include Sinatra::OutputBuffer::Helpers end end ... or if your extension needs to be registered to function... module Sinatra module YourExtension def self.registered(app) app.helpers Sinatra::OutputBuffer::Helpers # or app.register Sinatra::OutputBuffer # works too, and leaves a 'trace' of it being loaded end end end Once included, Sinatra::OutputBuffer provides the following very useful helper methods: * capture_html * concat_content * block_is_template? With these three methods you can very easily write something like this: ## # Creates an html tag with given name, content and options # # ==== Examples # # content_tag(:p, "hello", :class => 'light') # # content_tag(:p, :class => 'dark') do ... # # some output here.. # end # # content_tag(name, content=nil, options={}, &block) # def content_tag(*args, &block) name = args.first options = args.extract_options! tag_html = block_given? ? capture_html(&block) : args[1] tag_result = tag(name, options.merge(:content => tag_html)) block_is_template?(block) ? concat_content(tag_result) : tag_result end # NB! code sample taken from the Padrino framework [http://github.com/padrino/padrino-framework/] That's more or less it. == RTFM If the above is not clear enough, please check the Specs for a better understanding. == Errors / Bugs If something is not behaving intuitively, it is a bug, and should be reported. Report it here: http://github.com/kematzy/sinatra-outputbuffer/issues == TODOs * Keep it up to date with any changes in Sinatra. * Any other improvements you can think of. == Note on Patches/Pull Requests * Fork the project. * Make your feature addition or bug fix. * Add tests for it. This is important so I don't break it in a future version unintentionally. * Commit, do not mess with rakefile, version, or history. * (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull) * Send me a pull request. Bonus points for topic branches. == Copyright Copyright (c) 2010 Kematzy, Nathan Esquenazi & Others (?) Released under the MIT License. See LICENSE for further details.