Module: Camping

Defined in:
lib/camping/server.rb,
lib/camping.rb,
lib/camping/ar.rb,
lib/camping/session.rb,
lib/camping/reloader.rb,
lib/camping-unabridged.rb

Overview

If you're new to Camping, you should probably start by reading the first chapters of The Camping Book.

Okay. So, the important thing to remember is that Camping.goes :Nuts copies the Camping module into Nuts. This means that you should never use any of these methods/classes on the Camping module, but rather on your own app. Here's a short explanation on how Camping is organized:

  • Camping::Controllers is where your controllers live.

  • Camping::Models is where your models live.

  • Camping::Views is where your views live.

  • Camping::Base is a module which is included in all your controllers.

  • Camping::Helpers is a module with useful helpers, both for the controllers and the views. You should fill this up with your own helpers.

Camping also ships with:

  • Camping::Session adds states to your app.

  • Camping::Server starts up your app in development.

  • Camping::Reloader automatically reloads your apps when a file has changed.

More importantly, Camping also installs The Camping Server, please see Camping::Server.

Defined Under Namespace

Modules: Base, Controllers, Helpers, Models, Session, Views Classes: Cookies, H, Reloader, Server

Constant Summary collapse

C =
self
S =
IO.read(__FILE__) rescue nil
P =
"<h1>Cam\ping Problem!</h1><h2>%s</h2>"
U =
Rack::Utils
O =
{}
Apps =
[]
SK =

Key for r.session

:camping
X =
Controllers

Class Method Summary collapse

Class Method Details

.call(e) ⇒ Object

Ruby web servers use this method to enter the Camping realm. The e argument is the environment variables hash as per the Rack specification. And array with [status, headers, body] is expected at the output.

See: rack.rubyforge.org/doc/SPEC.html


651
652
653
# File 'lib/camping-unabridged.rb', line 651

def call e;X.M
k,m,*a=X.D e["PATH_INFO"],e['REQUEST_METHOD'].
downcase,e;k.new(e,m).service(*a).to_a;rescue;r500(:I,k,m,$!,:env=>e).to_a end

.goes(m, g = TOPLEVEL_BINDING) ⇒ Object

When you are running many applications, you may want to create independent modules for each Camping application. Camping::goes defines a toplevel constant with the whole MVC rack inside:

require 'camping'
Camping.goes :Nuts

module Nuts::Controllers; ... end
module Nuts::Models;      ... end
module Nuts::Views;       ... end

Additionally, you can pass a Binding as the second parameter, which enables you to create a Camping-based application within another module, for example to namespace your web interface and code for a worker process together:

module YourApplication
  Camping.goes :Web, binding()
  module Web
    ...
  end
  module Worker
    ...
  end
end

All the applications will be available in Camping::Apps.


638
639
640
641
# File 'lib/camping-unabridged.rb', line 638

def
goes m,g=TOPLEVEL_BINDING;Apps<<a=eval(S.gsub(/Camping/,m.to_s),g);caller[0]=~/:/
IO.read(a.set:__FILE__,$`)=~/^__END__/&&(b=$'.split /^@@\s*(.+?)\s*\r?\n/m).shift rescue nil
a.set :_t,H[*b||[]];end

.method_missing(m, c, *a) ⇒ Object

The Camping scriptable dispatcher. Any unhandled method call to the app module will be sent to a controller class, specified as an argument.

Blog.get(:Index)
#=> #<Blog::Controllers::Index ... >

The controller object contains all the @cookies, @body, @headers, etc. formulated by the response.

You can also feed environment variables and query variables as a hash, the final argument.

Blog.post(:Login, :input => {'username' => 'admin', 'password' => 'camping'})
#=> #<Blog::Controllers::Login @user=... >

Blog.get(:Info, :env => {'HTTP_HOST' => 'wagon'})
#=> #<Blog::Controllers::Info @headers={'HTTP_HOST'=>'wagon'} ...>

677
678
679
# File 'lib/camping-unabridged.rb', line 677

def method_missing m,c,*a;X.M;h=Hash===a[-1]?a.pop: {};e=H[Rack::MockRequest.
env_for('',h.delete(:env)||{})];k=X.const_get(c).new(e,m.to_s);h.each{|i,v|k.
send"#{i}=",v};k.service(*a) end

.optionsObject

A hash where you can set different settings.


698
# File 'lib/camping-unabridged.rb', line 698

def options;O end

.set(k, v) ⇒ Object

Shortcut for setting options:

module Blog
  set :secret, "Hello!"
end

707
# File 'lib/camping-unabridged.rb', line 707

def set k,v;O[k]=v end

.use(*a, &b) ⇒ Object

Injects a middleware:

module Blog
  use Rack::MethodOverride
  use Rack::Session::Memcache, :key => "session"
end

692
693
# File 'lib/camping-unabridged.rb', line 692

def use*a,&b;m=a.shift.new(method(:call),*a,&b)
meta_def(:call){|e|m.call(e)}end