Helpers contains methods available in your controllers
Builds an URL route to a controller or a path
if you declare the controller Hello :
module Capcode class Hello < Route '/hello/(.*)' ... end end
then
URL( Capcode::Hello, "you" ) # => /hello/you
# File lib/capcode.rb, line 164 164: def URL( klass, *a ) 165: path = nil 166: a = a.delete_if{ |x| x.nil? } 167: 168: if klass.class == Class 169: Capcode.routes.each do |p, k| 170: path = p if k.class == klass 171: end 172: else 173: path = klass 174: end 175: 176: (ENV['RACK_BASE_URI']||'')+path+((a.size>0)?("/"+a.join("/")):("")) 177: end
Calling content_for stores a block of markup in an identifier.
module Capcode class ContentFor < Route '/' def get render( :markaby => :page, :layout => :layout ) end end end module Capcode::Views def layout html do head do yield :header end body do yield :content end end end def page content_for :header do title "This is the title!" end content_for :content do p "this is the content!" end end end
# File lib/capcode.rb, line 211 211: def content_for( x ) 212: if @@__ARGS__.map{|_| _.to_s }.include?(x.to_s) 213: yield 214: end 215: end
Help you to return a JSON response
module Capcode class JsonResponse < Route '/json/([^\/]*)/(.*)' def get( arg1, arg2 ) json( { :1 => arg1, :2 => arg2 }) end end end
DEPRECATED, please use render( :json => o )
# File lib/capcode.rb, line 107 107: def json( d ) ## DELETE THIS IN 1.0.0 108: warn( "json is deprecated, please use `render( :json => ... )'" ) 109: @response['Content-Type'] = 'application/json' 110: d.to_json 111: end
Send a redirect response
module Capcode class Hello < Route '/hello/(.*)' def get( you ) if you.nil? redirect( WhoAreYou ) else ... end end end end
The first parameter can be a controller class name
redirect( MyController )
it can be a string path
redirect( "/path/to/my/resource" )
it can be an http status code (by default redirect use the http status code 302)
redirect( 304, MyController )
For more informations about HTTP status, see en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_Redirection
# File lib/capcode.rb, line 140 140: def redirect( klass, *a ) 141: httpCode = 302 142: 143: if( klass.class == Fixnum ) 144: httpCode = klass 145: klass = a.shift 146: end 147: 148: [httpCode, {'Location' => URL(klass, *a)}, ''] 149: end
Render a view
render‘s parameter can be a Hash or a string. Passing a string is equivalent to do
render( :text => string )
If you want to use a specific renderer, use one of this options :
If you want to use a specific layout, you can specify it with option
:layout
If you use the WebDav renderer, you can use the option
:resource_class (see http://github.com/georgi/rack_dav for more informations)
# File lib/capcode.rb, line 63 63: def render( hash ) 64: if hash.class == Hash 65: render_type = nil 66: 67: hash.keys.each do |key| 68: if self.respond_to?("render_#{key.to_s}") 69: unless render_type.nil? 70: raise Capcode::RenderError, "Can't use multiple renderer (`#{render_type}' and `#{key}') !", caller 71: end 72: render_type = key 73: end 74: end 75: 76: if render_type.nil? 77: raise Capcode::RenderError, "Renderer type not specified!", caller 78: end 79: 80: unless self.respond_to?("render_#{render_type.to_s}") 81: raise Capcode::RenderError, "#{render_type} renderer not present ! please require 'capcode/render/#{render_type}'", caller 82: end 83: 84: render_name = hash.delete(render_type) 85: 86: begin 87: self.send( "render_#{render_type.to_s}", render_name, hash ) 88: rescue => e 89: raise Capcode::RenderError, "Error rendering `#{render_type.to_s}' : #{e.message}", caller 90: end 91: else 92: render( :text => hash ) 93: end 94: end
# File lib/capcode/render/webdav.rb, line 19 19: def render_webdav( f, opts ) 20: options = { 21: :resource_class => RackDAV::FileResource, 22: :root => f 23: }.merge(opts) 24: 25: request = Rack::Request.new(env) 26: response = Rack::Response.new 27: 28: begin 29: controller = RackDAV::Controller.new(request, response, options.dup) 30: controller.send(request.request_method.downcase) 31: rescue RackDAV::HTTPStatus::Status => status 32: response.status = status.code 33: end 34: 35: # Strings in Ruby 1.9 are no longer enumerable. Rack still expects the response.body to be 36: # enumerable, however. 37: response.body = [response.body] if not response.body.respond_to? :each 38: 39: response.status = response.status ? response.status.to_i : 200 40: response.finish 41: 42: [response.status, response.header, response.body] 43: end
Return information about the static directory
# File lib/capcode.rb, line 221 221: def static 222: { 223: :uri => Capcode.static, 224: :path => File.expand_path( File.join(".", Capcode.static ) ) 225: } 226: end