Module | Camping::Base |
In: |
lib/camping-unabridged.rb
|
Camping::Base is built into each controller by way of the generic routing class Camping::R. In some ways, this class is trying to do too much, but it saves code for all the glue to stay in one place. Forgivable, considering that it‘s only really a handful of methods and accessors.
Everything in this module is accessible inside your controllers.
T | = | {} |
L | = | :layout |
body | [RW] | |
cookies | [RW] | |
env | [RW] | |
headers | [RW] | |
input | [RW] | |
request | [RW] | |
root | [RW] | |
state | [RW] | |
status | [RW] |
The default prefix for Camping model classes is the topmost module name lowercase and followed with an underscore.
Tepee::Models::Page.table_name_prefix #=> "tepee_pages"
# File lib/camping/ar.rb, line 66 66: def Base.table_name_prefix 67: "#{name[/\w+/]}_".downcase.sub(/^(#{A}|camping)_/i,'') 68: end
Finds a template, returning either:
false # => Could not find template true # => Found template in Views instance of Tilt # => Found template in a file
# File lib/camping-unabridged.rb, line 268 268: def lookup(n) 269: T.fetch(n.to_sym) do |k| 270: t = Views.method_defined?(k) || 271: (t = O[:_t].keys.grep(/^#{n}\./)[0]and Template[t].new{O[:_t][t]}) || 272: (f = Dir[[O[:views] || "views", "#{n}.*"]*'/'][0]) && 273: Template.new(f, O[f[/\.(\w+)$/, 1].to_sym] || {}) 274: 275: O[:dynamic_templates] ? t : T[k] = t 276: end 277: end
You can directly return HTML from your controller for quick debugging by calling this method and passing some Markaby to it.
module Nuts::Controllers class Info def get; mab{ code @headers.inspect } end end end
You can also pass true to use the :layout HTML wrapping method
# File lib/camping-unabridged.rb, line 312 312: def mab(&b) 313: extend Mab 314: mab(&b) 315: end
A quick means of setting this controller‘s status, body and headers based on a Rack response:
r(302, 'Location' => self / "/view/12", '') r(*another_app.call(@env))
You can also switch the body and the header if you want:
r(404, "Could not find page")
# File lib/camping-unabridged.rb, line 328 328: def r(s, b, h = {}) 329: b, h = h, b if Hash === b 330: @status = s 331: @headers.merge!(h) 332: @body = b 333: end
Called when a controller was not found. You can override this if you want to customize the error page:
module Nuts def r404(path) @path = path render :not_found end end
# File lib/camping-unabridged.rb, line 362 362: def r404(p) 363: P % "#{p} not found" 364: end
Called when an exception is raised. However, if there is a parse error in Camping or in your application‘s source code, it will not be caught.
k is the controller class, m is the request method (GET, POST, etc.) and e is the Exception which can be mined for useful info.
Be default this simply re-raises the error so a Rack middleware can handle it, but you are free to override it here:
module Nuts def r500(klass, method, exception) send_email_alert(klass, method, exception) render :server_error end end
# File lib/camping-unabridged.rb, line 381 381: def r500(k,m,e) 382: raise e 383: end
Called if an undefined method is called on a controller, along with the request method m (GET, POST, etc.)
# File lib/camping-unabridged.rb, line 387 387: def r501(m) 388: P % "#{m.upcase} not implemented" 389: end
Formulate a redirect response: a 302 status with Location header and a blank body. Uses Helpers#URL to build the location from a controller route or path.
So, given a root of localhost:3301/articles:
redirect "view/12" # redirects to "//localhost:3301/articles/view/12" redirect View, 12 # redirects to "//localhost:3301/articles/view/12"
NOTE: This method doesn‘t magically exit your methods and redirect. You‘ll need to return redirect(…) if this isn‘t the last statement in your code, or throw :halt if it‘s in a helper.
See: Controllers
# File lib/camping-unabridged.rb, line 349 349: def redirect(*a) 350: r(302,'','Location'=>URL(*a).to_s) 351: end
Display a view, calling it by its method name v. If a layout method is found in Camping::Views, it will be used to wrap the HTML.
module Nuts::Controllers class Show def get @posts = Post.find :all render :index end end end
# File lib/camping-unabridged.rb, line 291 291: def render(v, *a, &b) 292: if t = lookup(v) 293: r, @_r = @_r, o = Hash === a[-1] ? a.pop : {} 294: s = (t == true) ? mab { send(v, *a, &b) } : t.render(self, o[:locals] || {}, &b) 295: s = render(L, o.merge(L => false)) { s } if o[L] or o[L].nil? && lookup(L) && (!r && v.to_s[0] != ?_) 296: s 297: else 298: raise "no template: #{v}" 299: end 300: end
Serves the string c with the MIME type of the filename p.
# File lib/camping-unabridged.rb, line 392 392: def serve(p, c) 393: t = Rack::Mime.mime_type(p[/\..*$/], nil) and @headers['Content-Type'] = t 394: c 395: end
Turn a controller into a Rack response. This is designed to be used to pipe controllers into the r method. A great way to forward your requests!
class Read < '/(\d+)' def get(id) Post.find(id) rescue r *Blog.get(:NotFound, @headers.REQUEST_URI) end end
# File lib/camping-unabridged.rb, line 408 408: def to_a 409: @env['rack.session'] = Hash[@state] 410: r = Rack::Response.new(@body, @status, @headers) 411: @cookies._n.each do |k, v| 412: r.set_cookie(k, v) 413: end 414: r.to_a 415: end