camping 2.0 → 2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,16 +3,16 @@ module Camping
3
3
  #
4
4
  # To get sessions working for your application:
5
5
  # 1. <tt>require 'camping/session'</tt>
6
- # 2. Mixin the module: <tt>include Camping::Session</tt>
7
- # 3. Define a secret (and keep it secret): <tt>secret "SECRET!"</tt>
6
+ # 2. Define a secret (and keep it secret): <tt>set :secret, "SECRET!"</tt>
7
+ # 3. Mixin the module: <tt>include Camping::Session</tt>
8
8
  # 4. Throughout your application, use the <tt>@state</tt> var like a hash
9
9
  # to store your application's data.
10
10
  #
11
11
  # require 'camping/session' # 1
12
12
  #
13
13
  # module Nuts
14
- # include Camping::Session # 2
15
- # secret "Oh yeah!" # 3
14
+ # set :secret, "Oh yeah!" # 2
15
+ # include Camping::Session # 3
16
16
  # end
17
17
  #
18
18
  # == Other backends
@@ -27,9 +27,8 @@ module Camping
27
27
  module Session
28
28
  def self.included(app)
29
29
  key = "#{app}.state".downcase
30
- secret = [__FILE__, File.mtime(__FILE__)].join(":")
30
+ secret = app.options[:secret] || [__FILE__, File.mtime(__FILE__)].join(":")
31
31
 
32
- app.meta_def(:secret) { |val| secret.replace(val) }
33
32
  app.use Rack::Session::Cookie, :key => key, :secret => secret
34
33
  end
35
34
  end
@@ -0,0 +1,17 @@
1
+ class MissingLibrary < Exception #:nodoc: all
2
+ end
3
+ begin
4
+ require 'tilt'
5
+ rescue LoadError => e
6
+ raise MissingLibrary, "Tilt could not be loaded (is it installed?): #{e.message}"
7
+ end
8
+
9
+ $TILT_CODE = %{
10
+ Template = Tilt
11
+ include Tilt::CompileSite unless self.options[:dynamic_templates]
12
+ }
13
+
14
+ Camping::S.sub! /autoload\s*:Template\s*,\s*['"]camping\/template['"]/, $TILT_CODE
15
+ Camping::Apps.each do |c|
16
+ c.module_eval $TILT_CODE
17
+ end
@@ -0,0 +1,51 @@
1
+ require 'test_helper'
2
+ require 'camping'
3
+
4
+ Camping.goes :Markup
5
+
6
+ module Markup::Controllers
7
+ class Index
8
+ def get
9
+ render :index
10
+ end
11
+ end
12
+
13
+ class NoLayout
14
+ def get
15
+ render :index, :layout => false
16
+ end
17
+ end
18
+ end
19
+
20
+ module Markup::Views
21
+ def index
22
+ h1 "Welcome!"
23
+ end
24
+
25
+ def layout
26
+ html do
27
+ head do
28
+ title "Web Page"
29
+ end
30
+
31
+ body { yield }
32
+ end
33
+ end
34
+ end
35
+
36
+ class Markup::Test < TestCase
37
+ def test_render
38
+ get '/'
39
+ assert_body %r{<h1>Welcome!</h1>}
40
+ assert_body %r{<title>Web Page</title>}
41
+ end
42
+
43
+ def test_no_layout
44
+ get '/no/layout'
45
+ assert_body %r{<h1>Welcome!</h1>}
46
+
47
+ assert_reverse do
48
+ assert_body %r{<title>Web Page</title>}
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,22 @@
1
+ require 'test_helper'
2
+ require 'camping'
3
+
4
+ Camping.goes :Routes
5
+
6
+ module Routes::Controllers
7
+ class Index
8
+ def get
9
+ R(Style)
10
+ end
11
+ end
12
+
13
+ class Style < R '/style\.css'
14
+ end
15
+ end
16
+
17
+ class Routes::Test < TestCase
18
+ def test_backslash
19
+ get '/'
20
+ assert_body '/style.css'
21
+ end
22
+ end
@@ -0,0 +1,46 @@
1
+ require 'test_helper'
2
+ require 'camping'
3
+ require 'camping/session'
4
+
5
+ Camping.goes :Sessions
6
+
7
+ module Sessions
8
+ include Camping::Session
9
+ end
10
+
11
+ module Sessions::Controllers
12
+ class One
13
+ def get
14
+ @state.clear
15
+ @state.one = 42
16
+ redirect R(Two)
17
+ end
18
+ end
19
+
20
+ class Two
21
+ def get
22
+ @state.two = 56
23
+ redirect R(Three)
24
+ end
25
+ end
26
+
27
+ class Three
28
+ def get
29
+ @state.three = 99
30
+ @state.values_at("one", "two", "three").inspect
31
+ end
32
+ end
33
+ end
34
+
35
+ class Sessions::Test < TestCase
36
+ def test_session
37
+ get '/one'
38
+ follow_redirect!
39
+
40
+ get '/two'
41
+ follow_redirect!
42
+
43
+ get '/three'
44
+ assert_body "[42, 56, 99]"
45
+ end
46
+ end
@@ -0,0 +1,97 @@
1
+ require 'test_helper'
2
+ require 'camping'
3
+
4
+ Camping.goes :Simple
5
+
6
+ module Simple::Controllers
7
+ class Index
8
+ def get
9
+ "Hello World!"
10
+ end
11
+
12
+ def post
13
+ "Hello Post!"
14
+ end
15
+
16
+ def custom
17
+ "Hello Custom!"
18
+ end
19
+ end
20
+
21
+ class PostN
22
+ def get(id)
23
+ "Post ##{id}"
24
+ end
25
+ end
26
+
27
+ class MultipleComplexX
28
+ def get(str)
29
+ "Complex: #{str}"
30
+ end
31
+ end
32
+
33
+ class DateNNN
34
+ def get(year, month, day)
35
+ [year, month, day] * "-"
36
+ end
37
+ end
38
+
39
+ class Regexp < R '/ohmy/([a-f]+)'
40
+ def get(value)
41
+ value
42
+ end
43
+ end
44
+
45
+ class Optional < R '/optional', '/optional/([^/]+)'
46
+ def get(value = "default")
47
+ "Optional: #{value}"
48
+ end
49
+ end
50
+ end
51
+
52
+ class Simple::Test < TestCase
53
+ def test_index
54
+ get '/'
55
+ assert_body "Hello World!"
56
+
57
+ post '/'
58
+ assert_body "Hello Post!"
59
+ end
60
+
61
+ def test_post
62
+ get '/post/1'
63
+ assert_body "Post #1"
64
+
65
+ get '/post/2'
66
+ assert_body "Post #2"
67
+
68
+ get '/post/2-oh-no'
69
+ assert_status 404
70
+ end
71
+
72
+ def test_complex
73
+ get '/multiple/complex/Hello'
74
+ assert_body "Complex: Hello"
75
+ end
76
+
77
+ def test_date
78
+ get '/date/2010/04/01'
79
+ assert_body "2010-04-01"
80
+ end
81
+
82
+ def test_regexp
83
+ get '/ohmy/cafebabe'
84
+ assert_body "cafebabe"
85
+
86
+ get '/ohmy/CAFEBABE'
87
+ assert_status 404
88
+ end
89
+
90
+ def test_optional
91
+ get '/optional'
92
+ assert_body "Optional: default"
93
+
94
+ get '/optional/override'
95
+ assert_body "Optional: override"
96
+ end
97
+ end
@@ -0,0 +1,51 @@
1
+ $:.unshift File.dirname(__FILE__) + '/../lib'
2
+
3
+ begin
4
+ require 'rubygems'
5
+ rescue LoadError
6
+ end
7
+
8
+ require 'camping-unabridged'
9
+ require 'test/unit'
10
+ require 'rack/test'
11
+
12
+ class TestCase < Test::Unit::TestCase
13
+ include Rack::Test::Methods
14
+
15
+ def self.inherited(mod)
16
+ mod.app = Object.const_get(mod.to_s[/\w+/])
17
+ super
18
+ end
19
+
20
+ class << self
21
+ attr_accessor :app
22
+ end
23
+
24
+ def body() last_response.body end
25
+ def app() self.class.app end
26
+
27
+ def assert_reverse
28
+ begin
29
+ yield
30
+ rescue Exception
31
+ else
32
+ assert false, "Block didn't fail"
33
+ end
34
+ end
35
+
36
+ def assert_body(str)
37
+ case str
38
+ when Regexp
39
+ assert_match(str, last_response.body)
40
+ else
41
+ assert_equal(str.to_s, last_response.body)
42
+ end
43
+ end
44
+
45
+ def assert_status(code)
46
+ assert_equal(code, last_response.status)
47
+ end
48
+
49
+ def test_noop
50
+ end
51
+ end
metadata CHANGED
@@ -4,8 +4,8 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 2
7
- - 0
8
- version: "2.0"
7
+ - 1
8
+ version: "2.1"
9
9
  platform: ruby
10
10
  authors:
11
11
  - why the lucky stiff
@@ -13,7 +13,7 @@ autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
15
 
16
- date: 2010-04-09 00:00:00 +02:00
16
+ date: 2010-08-19 00:00:00 +02:00
17
17
  default_executable:
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
@@ -47,30 +47,23 @@ files:
47
47
  - README
48
48
  - Rakefile
49
49
  - bin/camping
50
- - doc/api.html
51
- - doc/book/01_introduction.html
52
- - doc/book/02_getting_started.html
53
- - doc/book/51_upgrading.html
54
- - doc/book.html
55
- - doc/created.rid
56
- - doc/images/Camping.gif
57
- - doc/images/loadingAnimation.gif
58
- - doc/images/permalink.gif
59
- - doc/index.html
60
- - doc/js/camping.js
61
- - doc/js/jquery.js
62
- - doc/rdoc.css
50
+ - test/app_markup.rb
51
+ - test/app_route_generating.rb
52
+ - test/app_sessions.rb
53
+ - test/app_simple.rb
63
54
  - test/apps/env_debug.rb
64
55
  - test/apps/forms.rb
65
56
  - test/apps/forward_to_other_controller.rb
66
57
  - test/apps/migrations.rb
67
58
  - test/apps/misc.rb
68
59
  - test/apps/sessions.rb
60
+ - test/test_helper.rb
69
61
  - lib/camping/ar.rb
70
62
  - lib/camping/mab.rb
71
63
  - lib/camping/reloader.rb
72
64
  - lib/camping/server.rb
73
65
  - lib/camping/session.rb
66
+ - lib/camping/template.rb
74
67
  - lib/camping-unabridged.rb
75
68
  - lib/camping.rb
76
69
  - extras/images/badge.gif
@@ -1,1953 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Camping, the Reference</title>
5
- <link rel="stylesheet" href="./rdoc.css" type="text/css" media="screen" />
6
- <script src="./js/jquery.js" type="text/javascript"></script>
7
- <script src="./js/camping.js" type="text/javascript"></script>
8
- </head>
9
- <body>
10
- <div id="menu">
11
- <ul id="links">
12
- <li><a href="./index.html">front</a> | </li>
13
- <li><a href="./book.html">book</a> | </li>
14
- <li><a href="http://wiki.github.com/camping/camping">wiki</a> | </li>
15
- <li><a href="http://github.com/camping/camping">code</a></li>
16
- </ul>
17
- <p id="version">Camping 2.0</p>
18
- </div>
19
-
20
- <div id="fullpage">
21
- <div class="page_shade">
22
- <div class="page ref">
23
- <p class="header">Fri Apr 09 16:33:39 +0200 2010</p>
24
- <h1>Camping, the Reference</h1>
25
-
26
-
27
- <h2 id="class-Camping">
28
- <a href="#class-Camping">
29
- Module
30
- Camping
31
-
32
- </a>
33
- </h2>
34
-
35
- <div class="mod">
36
- <p>
37
- If you&#8217;re new to <a href="api.html#class-Camping">Camping</a>, you
38
- should probably start by reading the first chapters of <a
39
- href="file:book/01_introduction.html#toc">The Camping Book</a>.
40
- </p>
41
- <p>
42
- Okay. So, the important thing to remember is that <tt><a
43
- href="api.html#M000028">Camping.goes</a> :Nuts</tt> copies the <a
44
- href="api.html#class-Camping">Camping</a> module into Nuts. This means that
45
- you should never use any of these methods/classes on the <a
46
- href="api.html#class-Camping">Camping</a> module, but rather on your own
47
- app. Here&#8217;s a short explanation on how <a
48
- href="api.html#class-Camping">Camping</a> is organized:
49
- </p>
50
- <ul>
51
- <li><a href="api.html#class-Camping-Controllers">Camping::Controllers</a> is
52
- where your controllers live.
53
-
54
- </li>
55
- <li><a href="api.html#class-Camping-Models">Camping::Models</a> is where your
56
- models live.
57
-
58
- </li>
59
- <li><a href="api.html#class-Camping-Views">Camping::Views</a> is where your
60
- views live.
61
-
62
- </li>
63
- <li><a href="api.html#class-Camping-Base">Camping::Base</a> is a module which
64
- is included in all your controllers.
65
-
66
- </li>
67
- <li><a href="api.html#class-Camping-Helpers">Camping::Helpers</a> is a module
68
- with useful helpers, both for the controllers and the views. You should
69
- fill this up with your own helpers.
70
-
71
- </li>
72
- </ul>
73
- <p>
74
- <a href="api.html#class-Camping">Camping</a> also ships with:
75
- </p>
76
- <ul>
77
- <li><a href="api.html#class-Camping-Session">Camping::Session</a> adds states
78
- to your app.
79
-
80
- </li>
81
- <li><a href="api.html#class-Camping-Server">Camping::Server</a> starts up your
82
- app in development.
83
-
84
- </li>
85
- <li><a href="api.html#class-Camping-Reloader">Camping::Reloader</a>
86
- automatically reloads your apps when a file has changed.
87
-
88
- </li>
89
- </ul>
90
- <p>
91
- More importantly, <a href="api.html#class-Camping">Camping</a> also
92
- installs The <a href="api.html#class-Camping">Camping</a> <a
93
- href="api.html#class-Camping-Server">Server</a>, please see <a
94
- href="api.html#class-Camping-Server">Camping::Server</a>.
95
- </p>
96
-
97
-
98
- <h3>Methods</h3>
99
-
100
- <h4 class="ruled" id="M000029">
101
- <a href="#M000029">
102
- Public Class method:
103
- <strong>::call(e)</strong>
104
- <img src="./images/permalink.gif">
105
- </a>
106
- </h4>
107
- <div class="method">
108
- <p>
109
- Ruby web servers use this method to enter the <a
110
- href="api.html#class-Camping">Camping</a> realm. The <tt>e</tt> argument is
111
- the environment variables hash as per the Rack specification. And array
112
- with [status, headers, body] is expected at the output.
113
- </p>
114
- <p>
115
- See: <a
116
- href="http://rack.rubyforge.org/doc/SPEC.html">rack.rubyforge.org/doc/SPEC.html</a>
117
- </p>
118
-
119
- <p class="source-link">[ <a href="#">show source</a> ]</p>
120
- <pre class="sourcecode">
121
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 584</span>
122
- 584: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">call</span>(<span class="ruby-identifier">e</span>)
123
- 585: <span class="ruby-constant">X</span>.<span class="ruby-constant">M</span>
124
- 586: <span class="ruby-identifier">p</span> = <span class="ruby-identifier">e</span>[<span class="ruby-value str">'PATH_INFO'</span>] = <span class="ruby-constant">U</span>.<span class="ruby-identifier">unescape</span>(<span class="ruby-identifier">e</span>[<span class="ruby-value str">'PATH_INFO'</span>])
125
- 587: <span class="ruby-identifier">k</span>,<span class="ruby-identifier">m</span>,<span class="ruby-operator">*</span><span class="ruby-identifier">a</span>=<span class="ruby-constant">X</span>.<span class="ruby-constant">D</span> <span class="ruby-identifier">p</span>,<span class="ruby-identifier">e</span>[<span class="ruby-value str">'REQUEST_METHOD'</span>].<span class="ruby-identifier">downcase</span>
126
- 588: <span class="ruby-identifier">k</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">e</span>,<span class="ruby-identifier">m</span>).<span class="ruby-identifier">service</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">a</span>).<span class="ruby-identifier">to_a</span>
127
- 589: <span class="ruby-keyword kw">rescue</span>
128
- 590: <span class="ruby-identifier">r500</span>(<span class="ruby-identifier">:I</span>, <span class="ruby-identifier">k</span>, <span class="ruby-identifier">m</span>, <span class="ruby-identifier">$!</span>, <span class="ruby-identifier">:env</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>).<span class="ruby-identifier">to_a</span>
129
- 591: <span class="ruby-keyword kw">end</span></pre>
130
- </div>
131
-
132
- <h4 class="ruled" id="M000028">
133
- <a href="#M000028">
134
- Public Class method:
135
- <strong>::goes(m)</strong>
136
- <img src="./images/permalink.gif">
137
- </a>
138
- </h4>
139
- <div class="method">
140
- <p>
141
- When you are running many applications, you may want to create independent
142
- modules for each <a href="api.html#class-Camping">Camping</a> application.
143
- Camping::goes defines a toplevel constant with the whole MVC rack inside:
144
- </p>
145
- <pre>
146
- require 'camping'
147
- Camping.goes :Nuts
148
-
149
- module Nuts::Controllers; ... end
150
- module Nuts::Models; ... end
151
- module Nuts::Views; ... end
152
- </pre>
153
- <p>
154
- All the applications will be available in Camping::Apps.
155
- </p>
156
-
157
- <p class="source-link">[ <a href="#">show source</a> ]</p>
158
- <pre class="sourcecode">
159
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 575</span>
160
- 575: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">goes</span>(<span class="ruby-identifier">m</span>)
161
- 576: <span class="ruby-constant">Apps</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">eval</span>(<span class="ruby-constant">S</span>.<span class="ruby-identifier">gsub</span>(<span class="ruby-regexp re">/Camping/</span>,<span class="ruby-identifier">m</span>.<span class="ruby-identifier">to_s</span>), <span class="ruby-constant">TOPLEVEL_BINDING</span>)
162
- 577: <span class="ruby-keyword kw">end</span></pre>
163
- </div>
164
-
165
- <h4 class="ruled" id="M000031">
166
- <a href="#M000031">
167
- Public Class method:
168
- <strong>::method_missing(m, c, *a)</strong>
169
- <img src="./images/permalink.gif">
170
- </a>
171
- </h4>
172
- <div class="method">
173
- <p>
174
- The <a href="api.html#class-Camping">Camping</a> scriptable dispatcher. Any
175
- unhandled method call to the app module will be sent to a controller class,
176
- specified as an argument.
177
- </p>
178
- <pre>
179
- Blog.get(:Index)
180
- #=&gt; #&lt;Blog::Controllers::Index ... &gt;
181
- </pre>
182
- <p>
183
- The controller object contains all the @cookies, @body, @headers, etc.
184
- formulated by the response.
185
- </p>
186
- <p>
187
- You can also feed environment variables and query variables as a hash, the
188
- final argument.
189
- </p>
190
- <pre>
191
- Blog.post(:Login, :input =&gt; {'username' =&gt; 'admin', 'password' =&gt; 'camping'})
192
- #=&gt; #&lt;Blog::Controllers::Login @user=... &gt;
193
-
194
- Blog.get(:Info, :env =&gt; {'HTTP_HOST' =&gt; 'wagon'})
195
- #=&gt; #&lt;Blog::Controllers::Info @headers={'HTTP_HOST'=&gt;'wagon'} ...&gt;
196
- </pre>
197
-
198
- <p class="source-link">[ <a href="#">show source</a> ]</p>
199
- <pre class="sourcecode">
200
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 611</span>
201
- 611: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">method_missing</span>(<span class="ruby-identifier">m</span>, <span class="ruby-identifier">c</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">a</span>)
202
- 612: <span class="ruby-constant">X</span>.<span class="ruby-constant">M</span>
203
- 613: <span class="ruby-identifier">h</span> = <span class="ruby-constant">Hash</span> <span class="ruby-operator">===</span> <span class="ruby-identifier">a</span>[<span class="ruby-value">-1</span>] <span class="ruby-operator">?</span> <span class="ruby-identifier">a</span>.<span class="ruby-identifier">pop</span> <span class="ruby-operator">:</span> {}
204
- 614: <span class="ruby-identifier">e</span> = <span class="ruby-constant">H</span>[<span class="ruby-constant">Rack</span><span class="ruby-operator">::</span><span class="ruby-constant">MockRequest</span>.<span class="ruby-identifier">env_for</span>(<span class="ruby-value str">''</span>,<span class="ruby-identifier">h</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">:env</span>)<span class="ruby-operator">||</span>{})]
205
- 615: <span class="ruby-identifier">k</span> = <span class="ruby-constant">X</span>.<span class="ruby-identifier">const_get</span>(<span class="ruby-identifier">c</span>).<span class="ruby-identifier">new</span>(<span class="ruby-identifier">e</span>,<span class="ruby-identifier">m</span>.<span class="ruby-identifier">to_s</span>)
206
- 616: <span class="ruby-identifier">h</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">i</span>, <span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">k</span>.<span class="ruby-identifier">send</span>(<span class="ruby-node">&quot;#{i}=&quot;</span>, <span class="ruby-identifier">v</span>) }
207
- 617: <span class="ruby-identifier">k</span>.<span class="ruby-identifier">service</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">a</span>)
208
- 618: <span class="ruby-keyword kw">end</span></pre>
209
- </div>
210
-
211
- <h4 class="ruled" id="M000034">
212
- <a href="#M000034">
213
- Public Class method:
214
- <strong>::use(*a, &b)</strong>
215
- <img src="./images/permalink.gif">
216
- </a>
217
- </h4>
218
- <div class="method">
219
- <p>
220
- Injects a middleware:
221
- </p>
222
- <pre>
223
- module Blog
224
- use Rack::MethodOverride
225
- use Rack::Session::Memcache, :key =&gt; &quot;session&quot;
226
- end
227
- </pre>
228
-
229
- <p class="source-link">[ <a href="#">show source</a> ]</p>
230
- <pre class="sourcecode">
231
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 626</span>
232
- 626: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">use</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">a</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">b</span>)
233
- 627: <span class="ruby-identifier">m</span> = <span class="ruby-identifier">a</span>.<span class="ruby-identifier">shift</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">method</span>(<span class="ruby-identifier">:call</span>), <span class="ruby-operator">*</span><span class="ruby-identifier">a</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">b</span>)
234
- 628: <span class="ruby-identifier">meta_def</span>(<span class="ruby-identifier">:call</span>) { <span class="ruby-operator">|</span><span class="ruby-identifier">e</span><span class="ruby-operator">|</span> <span class="ruby-identifier">m</span>.<span class="ruby-identifier">call</span>(<span class="ruby-identifier">e</span>) }
235
- 629: <span class="ruby-keyword kw">end</span></pre>
236
- </div>
237
-
238
- </div>
239
-
240
- <h2 id="class-Camping-Base">
241
- <a href="#class-Camping-Base">
242
- Module
243
- Camping::Base
244
-
245
- </a>
246
- </h2>
247
-
248
- <div class="mod">
249
- <p>
250
- <a href="api.html#class-Camping-Base">Camping::Base</a> is built into each
251
- controller by way of the generic routing class Camping::R. In some ways,
252
- this class is trying to do too much, but it saves code for all the glue to
253
- stay in one place. Forgivable, considering that it&#8217;s only really a
254
- handful of methods and accessors.
255
- </p>
256
- <p>
257
- Everything in this module is accessable inside your controllers.
258
- </p>
259
-
260
-
261
- <h3>Methods</h3>
262
-
263
- <h4 class="ruled" id="M000006">
264
- <a href="#M000006">
265
- Public Instance method:
266
- <strong>#mab(l=nil,&b)</strong>
267
- <img src="./images/permalink.gif">
268
- </a>
269
- </h4>
270
- <div class="method">
271
- <p>
272
- You can directly return HTML form your controller for quick debugging by
273
- calling this method and pass some Markaby to it.
274
- </p>
275
- <pre>
276
- module Nuts::Controllers
277
- class Info
278
- def get; mab{ code @headers.inspect } end
279
- end
280
- end
281
- </pre>
282
- <p>
283
- You can also pass true to use the :layout HTML wrapping method
284
- </p>
285
-
286
- <p class="source-link">[ <a href="#">show source</a> ]</p>
287
- <pre class="sourcecode">
288
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 265</span>
289
- 265: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">mab</span>(<span class="ruby-identifier">l</span>=<span class="ruby-keyword kw">nil</span>,<span class="ruby-operator">&amp;</span><span class="ruby-identifier">b</span>)
290
- 266: <span class="ruby-identifier">m</span>=<span class="ruby-constant">Mab</span>.<span class="ruby-identifier">new</span>({},<span class="ruby-keyword kw">self</span>)
291
- 267: <span class="ruby-identifier">s</span>=<span class="ruby-identifier">m</span>.<span class="ruby-identifier">capture</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">b</span>)
292
- 268: <span class="ruby-identifier">s</span>=<span class="ruby-identifier">m</span>.<span class="ruby-identifier">capture</span>{<span class="ruby-identifier">layout</span>{<span class="ruby-identifier">s</span>}} <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">l</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">m</span>.<span class="ruby-identifier">respond_to?</span>(<span class="ruby-identifier">:layout</span>)
293
- 269: <span class="ruby-identifier">s</span>
294
- 270: <span class="ruby-keyword kw">end</span></pre>
295
- </div>
296
-
297
- <h4 class="ruled" id="M000007">
298
- <a href="#M000007">
299
- Public Instance method:
300
- <strong>#r(s, b, h = {})</strong>
301
- <img src="./images/permalink.gif">
302
- </a>
303
- </h4>
304
- <div class="method">
305
- <p>
306
- A quick means of setting this controller&#8217;s status, body and headers
307
- based on a Rack response:
308
- </p>
309
- <pre>
310
- r(302, 'Location' =&gt; self / &quot;/view/12&quot;, '')
311
- r(*another_app.call(@env))
312
- </pre>
313
- <p>
314
- You can also switch the body and the header if you want:
315
- </p>
316
- <pre>
317
- r(404, &quot;Could not find page&quot;)
318
- </pre>
319
- <p>
320
- See also: <a href="api.html#M000009">r404</a>, <a
321
- href="api.html#M000011">r500</a> and <a href="api.html#M000012">r501</a>
322
- </p>
323
-
324
- <p class="source-link">[ <a href="#">show source</a> ]</p>
325
- <pre class="sourcecode">
326
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 283</span>
327
- 283: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">r</span>(<span class="ruby-identifier">s</span>, <span class="ruby-identifier">b</span>, <span class="ruby-identifier">h</span> = {})
328
- 284: <span class="ruby-identifier">b</span>, <span class="ruby-identifier">h</span> = <span class="ruby-identifier">h</span>, <span class="ruby-identifier">b</span> <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Hash</span> <span class="ruby-operator">===</span> <span class="ruby-identifier">b</span>
329
- 285: <span class="ruby-ivar">@status</span> = <span class="ruby-identifier">s</span>
330
- 286: <span class="ruby-ivar">@headers</span>.<span class="ruby-identifier">merge!</span>(<span class="ruby-identifier">h</span>)
331
- 287: <span class="ruby-ivar">@body</span> = <span class="ruby-identifier">b</span>
332
- 288: <span class="ruby-keyword kw">end</span></pre>
333
- </div>
334
-
335
- <h4 class="ruled" id="M000009">
336
- <a href="#M000009">
337
- Public Instance method:
338
- <strong>#r404(p)</strong>
339
- <img src="./images/permalink.gif">
340
- </a>
341
- </h4>
342
- <div class="method">
343
- <p>
344
- Called when a controller was not found. You can override this if you want
345
- to customize the error page:
346
- </p>
347
- <pre>
348
- module Nuts
349
- def r404(path)
350
- @path = path
351
- render :not_found
352
- end
353
- end
354
- </pre>
355
-
356
- <p class="source-link">[ <a href="#">show source</a> ]</p>
357
- <pre class="sourcecode">
358
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 317</span>
359
- 317: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">r404</span>(<span class="ruby-identifier">p</span>)
360
- 318: <span class="ruby-constant">P</span> <span class="ruby-operator">%</span> <span class="ruby-node">&quot;#{p} not found&quot;</span>
361
- 319: <span class="ruby-keyword kw">end</span></pre>
362
- </div>
363
-
364
- <h4 class="ruled" id="M000011">
365
- <a href="#M000011">
366
- Public Instance method:
367
- <strong>#r500(k,m,e)</strong>
368
- <img src="./images/permalink.gif">
369
- </a>
370
- </h4>
371
- <div class="method">
372
- <p>
373
- Called when an exception is raised. However, if there is a parse error in
374
- <a href="api.html#class-Camping">Camping</a> or in your application&#8217;s
375
- source code, it will not be caught.
376
- </p>
377
- <p>
378
- <tt>k</tt> is the controller class, <tt>m</tt> is the request method (GET,
379
- POST, etc.) and <tt>e</tt> is the Exception which can be mined for useful
380
- info.
381
- </p>
382
- <p>
383
- Be default this simply re-raises the error so a Rack middleware can handle
384
- it, but you are free to override it here:
385
- </p>
386
- <pre>
387
- module Nuts
388
- def r500(klass, method, exception)
389
- send_email_alert(klass, method, exception)
390
- render :server_error
391
- end
392
- end
393
- </pre>
394
-
395
- <p class="source-link">[ <a href="#">show source</a> ]</p>
396
- <pre class="sourcecode">
397
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 336</span>
398
- 336: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">r500</span>(<span class="ruby-identifier">k</span>,<span class="ruby-identifier">m</span>,<span class="ruby-identifier">e</span>)
399
- 337: <span class="ruby-identifier">raise</span> <span class="ruby-identifier">e</span>
400
- 338: <span class="ruby-keyword kw">end</span></pre>
401
- </div>
402
-
403
- <h4 class="ruled" id="M000012">
404
- <a href="#M000012">
405
- Public Instance method:
406
- <strong>#r501(m)</strong>
407
- <img src="./images/permalink.gif">
408
- </a>
409
- </h4>
410
- <div class="method">
411
- <p>
412
- Called if an undefined method is called on a controller, along with the
413
- request method <tt>m</tt> (GET, POST, etc.)
414
- </p>
415
-
416
- <p class="source-link">[ <a href="#">show source</a> ]</p>
417
- <pre class="sourcecode">
418
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 342</span>
419
- 342: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">r501</span>(<span class="ruby-identifier">m</span>)
420
- 343: <span class="ruby-constant">P</span> <span class="ruby-operator">%</span> <span class="ruby-node">&quot;#{m.upcase} not implemented&quot;</span>
421
- 344: <span class="ruby-keyword kw">end</span></pre>
422
- </div>
423
-
424
- <h4 class="ruled" id="M000008">
425
- <a href="#M000008">
426
- Public Instance method:
427
- <strong>#redirect(*a)</strong>
428
- <img src="./images/permalink.gif">
429
- </a>
430
- </h4>
431
- <div class="method">
432
- <p>
433
- Formulate a redirect response: a 302 status with <tt>Location</tt> header
434
- and a blank body. Uses <a href="api.html#M000004">Helpers#URL</a> to build
435
- the location from a controller route or path.
436
- </p>
437
- <p>
438
- So, given a root of <tt><a
439
- href="http://localhost:3301/articles">localhost:3301/articles</a></tt>:
440
- </p>
441
- <pre>
442
- redirect &quot;view/12&quot; # redirects to &quot;//localhost:3301/articles/view/12&quot;
443
- redirect View, 12 # redirects to &quot;//localhost:3301/articles/view/12&quot;
444
- </pre>
445
- <p>
446
- <b>NOTE:</b> This method doesn&#8217;t magically exit your methods and
447
- redirect. You&#8217;ll need to <tt>return redirect(...)</tt> if this
448
- isn&#8217;t the last statement in your code, or <tt>throw :halt</tt> if
449
- it&#8217;s in a helper.
450
- </p>
451
- <p>
452
- See: <a href="api.html#class-Camping-Controllers">Controllers</a>
453
- </p>
454
-
455
- <p class="source-link">[ <a href="#">show source</a> ]</p>
456
- <pre class="sourcecode">
457
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 304</span>
458
- 304: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">redirect</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">a</span>)
459
- 305: <span class="ruby-identifier">r</span>(<span class="ruby-value">302</span>,<span class="ruby-value str">''</span>,<span class="ruby-value str">'Location'</span>=<span class="ruby-operator">&gt;</span><span class="ruby-constant">URL</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">a</span>).<span class="ruby-identifier">to_s</span>)
460
- 306: <span class="ruby-keyword kw">end</span></pre>
461
- </div>
462
-
463
- <h4 class="ruled" id="M000005">
464
- <a href="#M000005">
465
- Public Instance method:
466
- <strong>#render(v,*a,&b)</strong>
467
- <img src="./images/permalink.gif">
468
- </a>
469
- </h4>
470
- <div class="method">
471
- <p>
472
- Display a view, calling it by its method name <tt>v</tt>. If a
473
- <tt>layout</tt> method is found in <a
474
- href="api.html#class-Camping-Views">Camping::Views</a>, it will be used to
475
- wrap the HTML.
476
- </p>
477
- <pre>
478
- module Nuts::Controllers
479
- class Show
480
- def get
481
- @posts = Post.find :all
482
- render :index
483
- end
484
- end
485
- end
486
- </pre>
487
-
488
- <p class="source-link">[ <a href="#">show source</a> ]</p>
489
- <pre class="sourcecode">
490
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 251</span>
491
- 251: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">render</span>(<span class="ruby-identifier">v</span>,<span class="ruby-operator">*</span><span class="ruby-identifier">a</span>,<span class="ruby-operator">&amp;</span><span class="ruby-identifier">b</span>)
492
- 252: <span class="ruby-identifier">mab</span>(<span class="ruby-regexp re">/^_/</span><span class="ruby-operator">!~</span><span class="ruby-identifier">v</span>.<span class="ruby-identifier">to_s</span>){<span class="ruby-identifier">send</span>(<span class="ruby-identifier">v</span>,<span class="ruby-operator">*</span><span class="ruby-identifier">a</span>,<span class="ruby-operator">&amp;</span><span class="ruby-identifier">b</span>)}
493
- 253: <span class="ruby-keyword kw">end</span></pre>
494
- </div>
495
-
496
- <h4 class="ruled" id="M000017">
497
- <a href="#M000017">
498
- Public Instance method:
499
- <strong>#service(*a)</strong>
500
- <img src="./images/permalink.gif">
501
- </a>
502
- </h4>
503
- <div class="method">
504
- <p>
505
- All requests pass through this method before going to the controller. Some
506
- magic in <a href="api.html#class-Camping">Camping</a> can be performed by
507
- overriding this method.
508
- </p>
509
-
510
- <p class="source-link">[ <a href="#">show source</a> ]</p>
511
- <pre class="sourcecode">
512
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 390</span>
513
- 390: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">service</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">a</span>)
514
- 391: <span class="ruby-identifier">r</span> = <span class="ruby-identifier">catch</span>(<span class="ruby-identifier">:halt</span>){<span class="ruby-identifier">send</span>(<span class="ruby-ivar">@method</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">a</span>)}
515
- 392: <span class="ruby-ivar">@body</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">r</span>
516
- 393: <span class="ruby-keyword kw">self</span>
517
- 394: <span class="ruby-keyword kw">end</span></pre>
518
- </div>
519
-
520
- <h4 class="ruled" id="M000013">
521
- <a href="#M000013">
522
- Public Instance method:
523
- <strong>#to_a()</strong>
524
- <img src="./images/permalink.gif">
525
- </a>
526
- </h4>
527
- <div class="method">
528
- <p>
529
- Turn a controller into a Rack response. This is designed to be used to pipe
530
- controllers into the <tt>r</tt> method. A great way to forward your
531
- requests!
532
- </p>
533
- <pre>
534
- class Read &lt; '/(\d+)'
535
- def get(id)
536
- Post.find(id)
537
- rescue
538
- r *Blog.get(:NotFound, @headers.REQUEST_URI)
539
- end
540
- end
541
- </pre>
542
-
543
- <p class="source-link">[ <a href="#">show source</a> ]</p>
544
- <pre class="sourcecode">
545
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 357</span>
546
- 357: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">to_a</span>
547
- 358: <span class="ruby-ivar">@env</span>[<span class="ruby-value str">'rack.session'</span>] = <span class="ruby-ivar">@state</span>
548
- 359: <span class="ruby-identifier">r</span> = <span class="ruby-constant">Rack</span><span class="ruby-operator">::</span><span class="ruby-constant">Response</span>.<span class="ruby-identifier">new</span>(<span class="ruby-ivar">@body</span>, <span class="ruby-ivar">@status</span>, <span class="ruby-ivar">@headers</span>)
549
- 360: <span class="ruby-ivar">@cookies</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">k</span>, <span class="ruby-identifier">v</span><span class="ruby-operator">|</span>
550
- 361: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@old_cookies</span>[<span class="ruby-identifier">k</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">v</span>
551
- 362: <span class="ruby-identifier">v</span> = { <span class="ruby-identifier">:value</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">v</span>, <span class="ruby-identifier">:path</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">/</span> <span class="ruby-value str">&quot;/&quot;</span> } <span class="ruby-keyword kw">if</span> <span class="ruby-constant">String</span> <span class="ruby-operator">===</span> <span class="ruby-identifier">v</span>
552
- 363: <span class="ruby-identifier">r</span>.<span class="ruby-identifier">set_cookie</span>(<span class="ruby-identifier">k</span>, <span class="ruby-identifier">v</span>)
553
- 364: <span class="ruby-keyword kw">end</span>
554
- 365: <span class="ruby-identifier">r</span>.<span class="ruby-identifier">to_a</span>
555
- 366: <span class="ruby-keyword kw">end</span></pre>
556
- </div>
557
-
558
- </div>
559
-
560
- <h2 id="class-Camping-Controllers">
561
- <a href="#class-Camping-Controllers">
562
- Module
563
- Camping::Controllers
564
-
565
- </a>
566
- </h2>
567
-
568
- <div class="mod">
569
- <p>
570
- <a href="api.html#class-Camping-Controllers">Controllers</a> receive the
571
- requests and sends a response back to the client. A controller is simply a
572
- class which must implement the HTTP methods it wants to accept:
573
- </p>
574
- <pre>
575
- module Nuts::Controllers
576
- class Index
577
- def get
578
- &quot;Hello World&quot;
579
- end
580
- end
581
-
582
- class Posts
583
- def post
584
- Post.create(@input)
585
- redirect Index
586
- end
587
- end
588
- end
589
- </pre>
590
- <h3>Defining a controller</h3>
591
- <p>
592
- There are two ways to define controllers: Just defining a class and let <a
593
- href="api.html#class-Camping">Camping</a> figure out the route, or add the
594
- route explicitly using <a href="api.html#M000021">R</a>.
595
- </p>
596
- <p>
597
- If you don&#8217;t use <a href="api.html#M000021">R</a>, <a
598
- href="api.html#class-Camping">Camping</a> will first split the controller
599
- name up by words (HelloWorld => Hello and World). Then it would do the
600
- following:
601
- </p>
602
- <ul>
603
- <li>Replace Index with /
604
-
605
- </li>
606
- <li>Replace X with ([^/]+)
607
-
608
- </li>
609
- <li>Replace <a href="api.html#class-Camping-Controllers#N">N</a> with (\d+)
610
-
611
- </li>
612
- <li>Everything else turns into lowercase
613
-
614
- </li>
615
- <li>Join the words with slashes
616
-
617
- </li>
618
- </ul>
619
- <p>
620
- Here&#8217;s a few examples:
621
- </p>
622
- <pre>
623
- Index # =&gt; /
624
- PostN # =&gt; /post/(\d+)
625
- PageX # =&gt; /page/([^/]+)
626
- Pages # =&gt; /pages
627
- </pre>
628
- <h3>The request</h3>
629
- <p>
630
- You have these variables which describes the request:
631
- </p>
632
- <ul>
633
- <li>@env contains the environment as defined in <a
634
- href="http://rack.rubyforge.org/doc/SPEC.html">rack.rubyforge.org/doc/SPEC.html</a>
635
-
636
- </li>
637
- <li>@request is Rack::Request.new(@env)
638
-
639
- </li>
640
- <li>@root is the path where the app is mounted
641
-
642
- </li>
643
- <li>@cookies is a hash with the cookies sent by the client
644
-
645
- </li>
646
- <li>@state is a hash with the sessions (see <a
647
- href="api.html#class-Camping-Session">Camping::Session</a>)
648
-
649
- </li>
650
- <li>@method is the HTTP method in lowercase
651
-
652
- </li>
653
- </ul>
654
- <h3>The response</h3>
655
- <p>
656
- You can change these variables to your needs:
657
- </p>
658
- <ul>
659
- <li>@status is the HTTP status (defaults to 200)
660
-
661
- </li>
662
- <li>@headers is a hash with the headers
663
-
664
- </li>
665
- <li>@body is the body (a string or something which responds to each)
666
-
667
- </li>
668
- <li>Any changes in @cookies and @state will also be sent to the client
669
-
670
- </li>
671
- </ul>
672
- <p>
673
- If you haven&#8217;t set @body, it will use the return value of the method:
674
- </p>
675
- <pre>
676
- module Nuts::Controllers
677
- class Index
678
- def get
679
- &quot;This is the body&quot;
680
- end
681
- end
682
-
683
- class Posts
684
- def get
685
- @body = &quot;Hello World!&quot;
686
- &quot;This is ignored&quot;
687
- end
688
- end
689
- end
690
- </pre>
691
-
692
-
693
- <h3>Methods</h3>
694
-
695
- <h4 class="ruled" id="M000024">
696
- <a href="#M000024">
697
- Public Class method:
698
- <strong>::D(p, m)</strong>
699
- <img src="./images/permalink.gif">
700
- </a>
701
- </h4>
702
- <div class="method">
703
- <p>
704
- Dispatch routes to controller classes. For each class, routes are checked
705
- for a match based on their order in the routing list given to
706
- Controllers::R. If no routes were given, the dispatcher uses a slash
707
- followed by the name of the controller lowercased.
708
- </p>
709
- <p>
710
- <a href="api.html#class-Camping-Controllers">Controllers</a> are searched
711
- in this order:
712
- </p>
713
- <ul>
714
- <li>Classes without routes, since they refer to a very specific URL.
715
-
716
- </li>
717
- <li>Classes with routes are searched in order of their creation.
718
-
719
- </li>
720
- </ul>
721
- <p>
722
- So, define your catch-all controllers last.
723
- </p>
724
-
725
- <p class="source-link">[ <a href="#">show source</a> ]</p>
726
- <pre class="sourcecode">
727
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 520</span>
728
- 520: <span class="ruby-keyword kw">def</span> <span class="ruby-constant">D</span>(<span class="ruby-identifier">p</span>, <span class="ruby-identifier">m</span>)
729
- 521: <span class="ruby-identifier">p</span> = <span class="ruby-value str">'/'</span> <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">p</span> <span class="ruby-operator">||</span> <span class="ruby-operator">!</span><span class="ruby-identifier">p</span>[<span class="ruby-value">0</span>]
730
- 522: <span class="ruby-identifier">r</span>.<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">k</span><span class="ruby-operator">|</span>
731
- 523: <span class="ruby-identifier">k</span>.<span class="ruby-identifier">urls</span>.<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span>
732
- 524: <span class="ruby-keyword kw">return</span> (<span class="ruby-identifier">k</span>.<span class="ruby-identifier">instance_method</span>(<span class="ruby-identifier">m</span>) <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>) <span class="ruby-operator">?</span>
733
- 525: [<span class="ruby-identifier">k</span>, <span class="ruby-identifier">m</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">$~</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>]] <span class="ruby-operator">:</span> [<span class="ruby-constant">I</span>, <span class="ruby-value str">'r501'</span>, <span class="ruby-identifier">m</span>] <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">p</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/^#{x}\/?$/</span>
734
- 526: }
735
- 527: }
736
- 528: [<span class="ruby-constant">I</span>, <span class="ruby-value str">'r404'</span>, <span class="ruby-identifier">p</span>]
737
- 529: <span class="ruby-keyword kw">end</span></pre>
738
- </div>
739
-
740
- <h4 class="ruled" id="M000026">
741
- <a href="#M000026">
742
- Public Class method:
743
- <strong>::M()</strong>
744
- <img src="./images/permalink.gif">
745
- </a>
746
- </h4>
747
- <div class="method">
748
- <p>
749
- The route maker, this is called by <a
750
- href="api.html#class-Camping">Camping</a> internally, you shouldn&#8217;t
751
- need to call it.
752
- </p>
753
- <p>
754
- Still, it&#8217;s worth know what this method does. Since Ruby
755
- doesn&#8217;t keep track of class creation order, we&#8217;re keeping an
756
- internal list of the controllers which inherit from R(). This method goes
757
- through and adds all the remaining routes to the beginning of the list and
758
- ensures all the controllers have the right mixins.
759
- </p>
760
- <p>
761
- Anyway, if you are calling the URI dispatcher from outside of a <a
762
- href="api.html#class-Camping">Camping</a> server, you&#8217;ll definitely
763
- need to call this to set things up. Don&#8217;t call it too early though.
764
- Any controllers added after this method is called won&#8217;t work properly
765
- </p>
766
-
767
- <p class="source-link">[ <a href="#">show source</a> ]</p>
768
- <pre class="sourcecode">
769
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 545</span>
770
- 545: <span class="ruby-keyword kw">def</span> <span class="ruby-constant">M</span>
771
- 546: <span class="ruby-keyword kw">def</span> <span class="ruby-constant">M</span> <span class="ruby-comment cmt">#:nodoc:</span>
772
- 547: <span class="ruby-keyword kw">end</span>
773
- 548: <span class="ruby-identifier">constants</span>.<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
774
- 549: <span class="ruby-identifier">k</span> = <span class="ruby-identifier">const_get</span>(<span class="ruby-identifier">c</span>)
775
- 550: <span class="ruby-identifier">k</span>.<span class="ruby-identifier">send</span> <span class="ruby-identifier">:include</span>,<span class="ruby-constant">C</span>,<span class="ruby-constant">Base</span>,<span class="ruby-constant">Helpers</span>,<span class="ruby-constant">Models</span>
776
- 551: <span class="ruby-ivar">@r</span>=[<span class="ruby-identifier">k</span>]<span class="ruby-operator">+</span><span class="ruby-identifier">r</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">r</span><span class="ruby-operator">-</span>[<span class="ruby-identifier">k</span>]<span class="ruby-operator">==</span><span class="ruby-identifier">r</span>
777
- 552: <span class="ruby-identifier">k</span>.<span class="ruby-identifier">meta_def</span>(<span class="ruby-identifier">:urls</span>){[<span class="ruby-node">&quot;/#{c.scan(/.[^A-Z]*/).map(&amp;N.method(:[]))*'/'}&quot;</span>]}<span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">k</span>.<span class="ruby-identifier">respond_to?</span><span class="ruby-identifier">:urls</span>
778
- 553: }
779
- 554: <span class="ruby-keyword kw">end</span></pre>
780
- </div>
781
-
782
- <h4 class="ruled" id="M000021">
783
- <a href="#M000021">
784
- Public Class method:
785
- <strong>::R(*u)</strong>
786
- <img src="./images/permalink.gif">
787
- </a>
788
- </h4>
789
- <div class="method">
790
- <p>
791
- Add routes to a controller class by piling them into the <a
792
- href="api.html#M000021">R</a> method.
793
- </p>
794
- <p>
795
- The route is a regexp which will match the request path. Anything enclosed
796
- in parenthesis will be sent to the method as arguments.
797
- </p>
798
- <pre>
799
- module Camping::Controllers
800
- class Edit &lt; R '/edit/(\d+)', '/new'
801
- def get(id)
802
- if id # edit
803
- else # new
804
- end
805
- end
806
- end
807
- end
808
- </pre>
809
-
810
- <p class="source-link">[ <a href="#">show source</a> ]</p>
811
- <pre class="sourcecode">
812
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 501</span>
813
- 501: <span class="ruby-keyword kw">def</span> <span class="ruby-constant">R</span> <span class="ruby-operator">*</span><span class="ruby-identifier">u</span>
814
- 502: <span class="ruby-identifier">r</span>=<span class="ruby-ivar">@r</span>
815
- 503: <span class="ruby-constant">Class</span>.<span class="ruby-identifier">new</span> {
816
- 504: <span class="ruby-identifier">meta_def</span>(<span class="ruby-identifier">:urls</span>){<span class="ruby-identifier">u</span>}
817
- 505: <span class="ruby-identifier">meta_def</span>(<span class="ruby-identifier">:inherited</span>){<span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">&lt;&lt;</span><span class="ruby-identifier">x</span>}
818
- 506: }
819
- 507: <span class="ruby-keyword kw">end</span></pre>
820
- </div>
821
-
822
- </div>
823
-
824
- <h2 id="class-Camping-H">
825
- <a href="#class-Camping-H">
826
- Class
827
- Camping::H
828
-
829
- &lt;
830
-
831
- Hash
832
-
833
-
834
- </a>
835
- </h2>
836
-
837
- <div class="mod">
838
- <p>
839
- An object-like Hash. All <a href="api.html#class-Camping">Camping</a> query
840
- string and cookie variables are loaded as this.
841
- </p>
842
- <p>
843
- To access the query string, for instance, use the <tt>@input</tt> variable.
844
- </p>
845
- <pre>
846
- module Blog::Controllers
847
- class Index &lt; R '/'
848
- def get
849
- if (page = @input.page.to_i) &gt; 0
850
- page -= 1
851
- end
852
- @posts = Post.all, :offset =&gt; page * 20, :limit =&gt; 20
853
- render :index
854
- end
855
- end
856
- end
857
- </pre>
858
- <p>
859
- In the above example if you visit <tt>/?page=2</tt>, you&#8217;ll get the
860
- second page of twenty posts. You can also use <tt>@input['page']</tt> to
861
- get the value for the <tt>page</tt> query variable.
862
- </p>
863
-
864
-
865
- <h3>Methods</h3>
866
-
867
- <h4 class="ruled" id="M000001">
868
- <a href="#M000001">
869
- Public Instance method:
870
- <strong>#method_missing(m,*a)</strong>
871
- <img src="./images/permalink.gif">
872
- </a>
873
- </h4>
874
- <div class="method">
875
- <p>
876
- Gets or sets keys in the hash.
877
- </p>
878
- <pre>
879
- @cookies.my_favorite = :macadamian
880
- @cookies.my_favorite
881
- =&gt; :macadamian
882
- </pre>
883
-
884
- <p class="source-link">[ <a href="#">show source</a> ]</p>
885
- <pre class="sourcecode">
886
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 77</span>
887
- 77: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">method_missing</span>(<span class="ruby-identifier">m</span>,<span class="ruby-operator">*</span><span class="ruby-identifier">a</span>)
888
- 78: <span class="ruby-identifier">m</span>.<span class="ruby-identifier">to_s</span><span class="ruby-operator">=~</span><span class="ruby-regexp re">/=$/</span><span class="ruby-operator">?</span><span class="ruby-keyword kw">self</span>[<span class="ruby-identifier">$`</span>]=<span class="ruby-identifier">a</span>[<span class="ruby-value">0</span>]<span class="ruby-operator">:</span><span class="ruby-identifier">a</span><span class="ruby-operator">==</span>[]<span class="ruby-operator">?</span><span class="ruby-keyword kw">self</span>[<span class="ruby-identifier">m</span>.<span class="ruby-identifier">to_s</span>]<span class="ruby-operator">:</span><span class="ruby-keyword kw">super</span>
889
- 79: <span class="ruby-keyword kw">end</span></pre>
890
- </div>
891
-
892
- </div>
893
-
894
- <h2 id="class-Camping-Helpers">
895
- <a href="#class-Camping-Helpers">
896
- Module
897
- Camping::Helpers
898
-
899
- </a>
900
- </h2>
901
-
902
- <div class="mod">
903
- <p>
904
- <a href="api.html#class-Camping-Helpers">Helpers</a> contains methods
905
- available in your controllers and views. You may add methods of your own to
906
- this module, including many helper methods from Rails. This is analogous to
907
- Rails&#8217; <tt>ApplicationHelper</tt> module.
908
- </p>
909
- <h3>Using ActionPack <a href="api.html#class-Camping-Helpers">Helpers</a></h3>
910
- <p>
911
- If you&#8217;d like to include helpers from Rails&#8217; modules,
912
- you&#8217;ll need to look up the helper module in the Rails documentation
913
- at <a href="http://api.rubyonrails.org/.">api.rubyonrails.org/.</a>
914
- </p>
915
- <p>
916
- For example, if you look up the <tt>ActionView::Helpers::FormTagHelper</tt>
917
- class, you&#8217;ll find that it&#8217;s loaded from the
918
- <tt>action_view/helpers/form_tag_helper.rb</tt> file. You&#8217;ll need to
919
- have the ActionPack gem installed for this to work.
920
- </p>
921
- <p>
922
- Often the helpers depends on other helpers, so you would have to look up
923
- the dependencies too. <tt>FormTagHelper</tt> for instance required the
924
- <tt>content_tag</tt> provided by <tt>TagHelper</tt>.
925
- </p>
926
- <pre>
927
- require 'action_view/helpers/form_tag_helper'
928
-
929
- module Nuts::Helpers
930
- include ActionView::Helpers::TagHelper
931
- include ActionView::Helpers::FormTagHelper
932
- end
933
- </pre>
934
- <h3>Return a response immediately</h3>
935
- <p>
936
- If you need to return a response inside a helper, you can use <tt>throw
937
- :halt</tt>.
938
- </p>
939
- <pre>
940
- module Nuts::Helpers
941
- def requires_login!
942
- unless @state.user_id
943
- redirect Login
944
- throw :halt
945
- end
946
- end
947
- end
948
-
949
- module Nuts::Controllers
950
- class Admin
951
- def get
952
- requires_login!
953
- &quot;Never gets here unless you're logged in&quot;
954
- end
955
- end
956
- end
957
- </pre>
958
-
959
-
960
- <h3>Methods</h3>
961
-
962
- <h4 class="ruled" id="M000003">
963
- <a href="#M000003">
964
- Public Instance method:
965
- <strong>#/(p)</strong>
966
- <img src="./images/permalink.gif">
967
- </a>
968
- </h4>
969
- <div class="method">
970
- <p>
971
- Simply builds a complete path from a path <tt>p</tt> within the app. If
972
- your application is mounted at <tt>/blog</tt>:
973
- </p>
974
- <pre>
975
- self / &quot;/view/1&quot; #=&gt; &quot;/blog/view/1&quot;
976
- self / &quot;styles.css&quot; #=&gt; &quot;styles.css&quot;
977
- self / R(Edit, 1) #=&gt; &quot;/blog/edit/1&quot;
978
- </pre>
979
-
980
- <p class="source-link">[ <a href="#">show source</a> ]</p>
981
- <pre class="sourcecode">
982
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 198</span>
983
- 198: <span class="ruby-keyword kw">def</span> <span class="ruby-operator">/</span>(<span class="ruby-identifier">p</span>); <span class="ruby-identifier">p</span>[<span class="ruby-value">0</span>]<span class="ruby-operator">==</span><span class="ruby-value">?/</span><span class="ruby-operator">?</span><span class="ruby-ivar">@root</span><span class="ruby-operator">+</span><span class="ruby-identifier">p</span><span class="ruby-identifier">:p</span> <span class="ruby-keyword kw">end</span></pre>
984
- </div>
985
-
986
- <h4 class="ruled" id="M000002">
987
- <a href="#M000002">
988
- Public Instance method:
989
- <strong>#R(c,*g)</strong>
990
- <img src="./images/permalink.gif">
991
- </a>
992
- </h4>
993
- <div class="method">
994
- <p>
995
- From inside your controllers and views, you will often need to figure out
996
- the route used to get to a certain controller <tt>c</tt>. Pass the
997
- controller class and any arguments into the <a
998
- href="api.html#M000002">R</a> method, a string containing the route will be
999
- returned to you.
1000
- </p>
1001
- <p>
1002
- Assuming you have a specific route in an edit controller:
1003
- </p>
1004
- <pre>
1005
- class Edit &lt; R '/edit/(\d+)'
1006
- </pre>
1007
- <p>
1008
- A specific route to the Edit controller can be built with:
1009
- </p>
1010
- <pre>
1011
- R(Edit, 1)
1012
- </pre>
1013
- <p>
1014
- Which outputs: <tt>/edit/1</tt>.
1015
- </p>
1016
- <p>
1017
- If a controller has many routes, the route will be selected if it is the
1018
- first in the routing list to have the right number of arguments.
1019
- </p>
1020
- <h2>Using <a href="api.html#M000002">R</a> in the View</h2>
1021
- <p>
1022
- Keep in mind that this route doesn&#8217;t include the root path. You will
1023
- need to use <tt>/</tt> (the slash method above) in your controllers. Or, go
1024
- ahead and use the <a href="api.html#M000004">Helpers#URL</a> method to
1025
- build a complete <a href="api.html#M000004">URL</a> for a route.
1026
- </p>
1027
- <p>
1028
- However, in your views, the :href, :src and :action attributes
1029
- automatically pass through the slash method, so you are encouraged to use
1030
- <tt>R</tt> or <tt>URL</tt> in your views.
1031
- </p>
1032
- <pre>
1033
- module Nuts::Views
1034
- def menu
1035
- div.menu! do
1036
- a 'Home', :href =&gt; URL()
1037
- a 'Profile', :href =&gt; &quot;/profile&quot;
1038
- a 'Logout', :href =&gt; R(Logout)
1039
- a 'Google', :href =&gt; 'http://google.com'
1040
- end
1041
- end
1042
- end
1043
- </pre>
1044
- <p>
1045
- Let&#8217;s say the above example takes place inside an application mounted
1046
- at <tt><a href="http://localhost:3301/frodo">localhost:3301/frodo</a></tt>
1047
- and that a controller named <tt>Logout</tt> is assigned to route
1048
- <tt>/logout</tt>. The HTML will come out as:
1049
- </p>
1050
- <pre>
1051
- &lt;div id=&quot;menu&quot;&gt;
1052
- &lt;a href=&quot;http://localhost:3301/frodo/&quot;&gt;Home&lt;/a&gt;
1053
- &lt;a href=&quot;/frodo/profile&quot;&gt;Profile&lt;/a&gt;
1054
- &lt;a href=&quot;/frodo/logout&quot;&gt;Logout&lt;/a&gt;
1055
- &lt;a href=&quot;http://google.com&quot;&gt;Google&lt;/a&gt;
1056
- &lt;/div&gt;
1057
- </pre>
1058
-
1059
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1060
- <pre class="sourcecode">
1061
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 180</span>
1062
- 180: <span class="ruby-keyword kw">def</span> <span class="ruby-constant">R</span>(<span class="ruby-identifier">c</span>,<span class="ruby-operator">*</span><span class="ruby-identifier">g</span>)
1063
- 181: <span class="ruby-identifier">p</span>,<span class="ruby-identifier">h</span>=<span class="ruby-regexp re">/\(.+?\)/</span>,<span class="ruby-identifier">g</span>.<span class="ruby-identifier">grep</span>(<span class="ruby-constant">Hash</span>)
1064
- 182: <span class="ruby-identifier">g</span><span class="ruby-operator">-=</span><span class="ruby-identifier">h</span>
1065
- 183: <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;bad route&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">u</span> = <span class="ruby-identifier">c</span>.<span class="ruby-identifier">urls</span>.<span class="ruby-identifier">find</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span>
1066
- 184: <span class="ruby-keyword kw">break</span> <span class="ruby-identifier">x</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-identifier">p</span>).<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">g</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&amp;&amp;</span>
1067
- 185: <span class="ruby-node">/^#{x}\/?$/</span> <span class="ruby-operator">=~</span> (<span class="ruby-identifier">x</span>=<span class="ruby-identifier">g</span>.<span class="ruby-identifier">inject</span>(<span class="ruby-identifier">x</span>){<span class="ruby-operator">|</span><span class="ruby-identifier">x</span>,<span class="ruby-identifier">a</span><span class="ruby-operator">|</span>
1068
- 186: <span class="ruby-identifier">x</span>.<span class="ruby-identifier">sub</span> <span class="ruby-identifier">p</span>,<span class="ruby-constant">U</span>.<span class="ruby-identifier">escape</span>((<span class="ruby-identifier">a</span>[<span class="ruby-identifier">a</span>.<span class="ruby-identifier">class</span>.<span class="ruby-identifier">primary_key</span>]<span class="ruby-keyword kw">rescue</span> <span class="ruby-identifier">a</span>))})
1069
- 187: }
1070
- 188: <span class="ruby-identifier">h</span>.<span class="ruby-identifier">any?</span><span class="ruby-value">? </span><span class="ruby-identifier">u</span><span class="ruby-operator">+</span><span class="ruby-value str">&quot;?&quot;</span><span class="ruby-operator">+</span><span class="ruby-constant">U</span>.<span class="ruby-identifier">build_query</span>(<span class="ruby-identifier">h</span>[<span class="ruby-value">0</span>]) <span class="ruby-operator">:</span> <span class="ruby-identifier">u</span>
1071
- 189: <span class="ruby-keyword kw">end</span></pre>
1072
- </div>
1073
-
1074
- <h4 class="ruled" id="M000004">
1075
- <a href="#M000004">
1076
- Public Instance method:
1077
- <strong>#URL(c='/',*a)</strong>
1078
- <img src="./images/permalink.gif">
1079
- </a>
1080
- </h4>
1081
- <div class="method">
1082
- <p>
1083
- Builds a <a href="api.html#M000004">URL</a> route to a controller or a
1084
- path, returning a URI object. This way you&#8217;ll get the hostname and
1085
- the port number, a complete <a href="api.html#M000004">URL</a>.
1086
- </p>
1087
- <p>
1088
- You can use this to grab URLs for controllers using the R-style syntax. So,
1089
- if your application is mounted at <tt><a
1090
- href="http://test.ing/blog/">test.ing/blog/</a></tt> and you have a View
1091
- controller which routes as <tt><a href="api.html#M000002">R</a>
1092
- '/view/(d+)'</tt>:
1093
- </p>
1094
- <pre>
1095
- URL(View, @post.id) #=&gt; #&lt;URL:http://test.ing/blog/view/12&gt;
1096
- </pre>
1097
- <p>
1098
- Or you can use the direct path:
1099
- </p>
1100
- <pre>
1101
- self.URL #=&gt; #&lt;URL:http://test.ing/blog/&gt;
1102
- self.URL + &quot;view/12&quot; #=&gt; #&lt;URL:http://test.ing/blog/view/12&gt;
1103
- URL(&quot;/view/12&quot;) #=&gt; #&lt;URL:http://test.ing/blog/view/12&gt;
1104
- </pre>
1105
- <p>
1106
- It&#8217;s okay to pass <a href="api.html#M000004">URL</a> strings through
1107
- this method as well:
1108
- </p>
1109
- <pre>
1110
- URL(&quot;http://google.com&quot;) #=&gt; #&lt;URL:http://google.com&gt;
1111
- </pre>
1112
- <p>
1113
- Any string which doesn&#8217;t begin with a slash will pass through
1114
- unscathed.
1115
- </p>
1116
-
1117
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1118
- <pre class="sourcecode">
1119
- <span class="ruby-comment cmt"># File lib/camping-unabridged.rb, line 221</span>
1120
- 221: <span class="ruby-keyword kw">def</span> <span class="ruby-constant">URL</span> <span class="ruby-identifier">c</span>=<span class="ruby-value str">'/'</span>,<span class="ruby-operator">*</span><span class="ruby-identifier">a</span>
1121
- 222: <span class="ruby-identifier">c</span> = <span class="ruby-constant">R</span>(<span class="ruby-identifier">c</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">a</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">respond_to?</span> <span class="ruby-identifier">:urls</span>
1122
- 223: <span class="ruby-identifier">c</span> = <span class="ruby-keyword kw">self</span><span class="ruby-operator">/</span><span class="ruby-identifier">c</span>
1123
- 224: <span class="ruby-identifier">c</span> = <span class="ruby-ivar">@request</span>.<span class="ruby-identifier">url</span>[<span class="ruby-regexp re">/.{8,}?(?=\/)/</span>]<span class="ruby-operator">+</span><span class="ruby-identifier">c</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">c</span>[<span class="ruby-value">0</span>]<span class="ruby-operator">==</span><span class="ruby-value">?/</span>
1124
- 225: <span class="ruby-constant">URI</span>(<span class="ruby-identifier">c</span>)
1125
- 226: <span class="ruby-keyword kw">end</span></pre>
1126
- </div>
1127
-
1128
- </div>
1129
-
1130
- <h2 id="class-Camping-Models">
1131
- <a href="#class-Camping-Models">
1132
- Module
1133
- Camping::Models
1134
-
1135
- </a>
1136
- </h2>
1137
-
1138
- <div class="mod">
1139
- <p>
1140
- <a href="api.html#class-Camping-Models">Models</a> is an empty Ruby module
1141
- for housing model classes derived from ActiveRecord::Base. As a shortcut,
1142
- you may derive from <a href="api.html#class-Camping-Models#Base">Base</a>
1143
- which is an alias for ActiveRecord::Base.
1144
- </p>
1145
- <pre>
1146
- module Camping::Models
1147
- class Post &lt; Base; belongs_to :user end
1148
- class User &lt; Base; has_many :posts end
1149
- end
1150
- </pre>
1151
- <h3>Where <a href="api.html#class-Camping-Models">Models</a> are Used</h3>
1152
- <p>
1153
- <a href="api.html#class-Camping-Models">Models</a> are used in your
1154
- controller classes. However, if your model class name conflicts with a
1155
- controller class name, you will need to refer to it using the <a
1156
- href="api.html#class-Camping-Models">Models</a> module.
1157
- </p>
1158
- <pre>
1159
- module Camping::Controllers
1160
- class Post &lt; R '/post/(\d+)'
1161
- def get(post_id)
1162
- @post = Models::Post.find post_id
1163
- render :index
1164
- end
1165
- end
1166
- end
1167
- </pre>
1168
- <p>
1169
- <a href="api.html#class-Camping-Models">Models</a> cannot be referred to in
1170
- <a href="api.html#class-Camping-Views">Views</a> at this time.
1171
- </p>
1172
-
1173
-
1174
- <h3>Methods</h3>
1175
-
1176
- </div>
1177
-
1178
- <h2 id="class-Camping-Models-Base">
1179
- <a href="#class-Camping-Models-Base">
1180
- Module
1181
- Camping::Models::Base
1182
-
1183
- </a>
1184
- </h2>
1185
-
1186
- <div class="mod">
1187
-
1188
-
1189
- <h3>Methods</h3>
1190
-
1191
- <h4 class="ruled" id="M000000">
1192
- <a href="#M000000">
1193
- Public Class method:
1194
- <strong>::table_name_prefix()</strong>
1195
- <img src="./images/permalink.gif">
1196
- </a>
1197
- </h4>
1198
- <div class="method">
1199
- <p>
1200
- The default prefix for <a href="api.html#class-Camping">Camping</a> model
1201
- classes is the topmost module name lowercase and followed with an
1202
- underscore.
1203
- </p>
1204
- <pre>
1205
- Tepee::Models::Page.table_name_prefix
1206
- #=&gt; &quot;tepee_pages&quot;
1207
- </pre>
1208
-
1209
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1210
- <pre class="sourcecode">
1211
- <span class="ruby-comment cmt"># File lib/camping/ar.rb, line 66</span>
1212
- 66: <span class="ruby-keyword kw">def</span> <span class="ruby-constant">Base</span>.<span class="ruby-identifier">table_name_prefix</span>
1213
- 67: <span class="ruby-node">&quot;#{name[/\w+/]}_&quot;</span>.<span class="ruby-identifier">downcase</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-node">/^(#{A}|camping)_/i</span>,<span class="ruby-value str">''</span>)
1214
- 68: <span class="ruby-keyword kw">end</span></pre>
1215
- </div>
1216
-
1217
- </div>
1218
-
1219
- <h2 id="class-Camping-Reloader">
1220
- <a href="#class-Camping-Reloader">
1221
- Class
1222
- Camping::Reloader
1223
-
1224
- &lt;
1225
-
1226
- Object
1227
-
1228
-
1229
- </a>
1230
- </h2>
1231
-
1232
- <div class="mod">
1233
- <h3>The <a href="api.html#class-Camping">Camping</a> <a href="api.html#class-Camping-Reloader">Reloader</a></h3>
1234
- <p>
1235
- <a href="api.html#class-Camping">Camping</a> apps are generally small and
1236
- predictable. Many <a href="api.html#class-Camping">Camping</a> apps are
1237
- contained within a single file. Larger apps are split into a handful of
1238
- other Ruby libraries within the same directory.
1239
- </p>
1240
- <p>
1241
- Since <a href="api.html#class-Camping">Camping</a> apps (and their
1242
- dependencies) are loaded with Ruby&#8217;s require method, there is a
1243
- record of them in $LOADED_FEATURES. Which leaves a perfect space for this
1244
- class to manage auto-reloading an app if any of its immediate dependencies
1245
- changes.
1246
- </p>
1247
- <h3>Wrapping Your Apps</h3>
1248
- <p>
1249
- Since bin/camping and the <a
1250
- href="api.html#class-Camping-Server">Camping::Server</a> class already use
1251
- the <a href="api.html#class-Camping-Reloader">Reloader</a>, you probably
1252
- don&#8217;t need to hack it on your own. But, if you&#8217;re rolling your
1253
- own situation, here&#8217;s how.
1254
- </p>
1255
- <p>
1256
- Rather than this:
1257
- </p>
1258
- <pre>
1259
- require 'yourapp'
1260
- </pre>
1261
- <p>
1262
- Use this:
1263
- </p>
1264
- <pre>
1265
- require 'camping/reloader'
1266
- reloader = Camping::Reloader.new('/path/to/yourapp.rb')
1267
- blog = reloader.apps[:Blog]
1268
- wiki = reloader.apps[:Wiki]
1269
- </pre>
1270
- <p>
1271
- The <tt>blog</tt> and <tt>wiki</tt> objects will behave exactly like your
1272
- Blog and Wiki, but they will update themselves if yourapp.rb changes.
1273
- </p>
1274
- <p>
1275
- You can also give <a href="api.html#class-Camping-Reloader">Reloader</a>
1276
- more than one script.
1277
- </p>
1278
-
1279
-
1280
- <h3>Methods</h3>
1281
-
1282
- <h4 class="ruled" id="M000019">
1283
- <a href="#M000019">
1284
- Public Class method:
1285
- <strong>::new(*scripts)</strong>
1286
- <img src="./images/permalink.gif">
1287
- </a>
1288
- </h4>
1289
- <div class="method">
1290
- <p>
1291
- Creates the reloader, assigns a <tt>script</tt> to it and initially loads
1292
- the application. Pass in the full path to the script, otherwise the script
1293
- will be loaded relative to the current working directory.
1294
- </p>
1295
-
1296
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1297
- <pre class="sourcecode">
1298
- <span class="ruby-comment cmt"># File lib/camping/reloader.rb, line 150</span>
1299
- 150: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">scripts</span>)
1300
- 151: <span class="ruby-ivar">@scripts</span> = []
1301
- 152: <span class="ruby-identifier">update</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">scripts</span>)
1302
- 153: <span class="ruby-keyword kw">end</span></pre>
1303
- </div>
1304
-
1305
- <h4 class="ruled" id="M000025">
1306
- <a href="#M000025">
1307
- Public Instance method:
1308
- <strong>#apps()</strong>
1309
- <img src="./images/permalink.gif">
1310
- </a>
1311
- </h4>
1312
- <div class="method">
1313
- <p>
1314
- Returns a Hash of all the apps available in the scripts, where the key
1315
- would be the name of the app (the one you gave to <a
1316
- href="api.html#M000028">Camping.goes</a>) and the value would be the app
1317
- (wrapped inside <a href="api.html#class-Camping-Reloader-App">App</a>).
1318
- </p>
1319
-
1320
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1321
- <pre class="sourcecode">
1322
- <span class="ruby-comment cmt"># File lib/camping/reloader.rb, line 185</span>
1323
- 185: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">apps</span>
1324
- 186: <span class="ruby-ivar">@scripts</span>.<span class="ruby-identifier">inject</span>({}) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">hash</span>, <span class="ruby-identifier">script</span><span class="ruby-operator">|</span>
1325
- 187: <span class="ruby-identifier">hash</span>.<span class="ruby-identifier">merge</span>(<span class="ruby-identifier">script</span>.<span class="ruby-identifier">apps</span>)
1326
- 188: <span class="ruby-keyword kw">end</span>
1327
- 189: <span class="ruby-keyword kw">end</span></pre>
1328
- </div>
1329
-
1330
- <h4 class="ruled" id="M000022">
1331
- <a href="#M000022">
1332
- Public Instance method:
1333
- <strong>#clear()</strong>
1334
- <img src="./images/permalink.gif">
1335
- </a>
1336
- </h4>
1337
- <div class="method">
1338
- <p>
1339
- Removes all the scripts from the reloader.
1340
- </p>
1341
-
1342
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1343
- <pre class="sourcecode">
1344
- <span class="ruby-comment cmt"># File lib/camping/reloader.rb, line 173</span>
1345
- 173: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">clear</span>
1346
- 174: <span class="ruby-ivar">@scrips</span> = []
1347
- 175: <span class="ruby-keyword kw">end</span></pre>
1348
- </div>
1349
-
1350
- <h4 class="ruled" id="M000023">
1351
- <a href="#M000023">
1352
- Public Instance method:
1353
- <strong>#reload!()</strong>
1354
- <img src="./images/permalink.gif">
1355
- </a>
1356
- </h4>
1357
- <div class="method">
1358
- <p>
1359
- Simply calls reload! on all the Script objects.
1360
- </p>
1361
-
1362
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1363
- <pre class="sourcecode">
1364
- <span class="ruby-comment cmt"># File lib/camping/reloader.rb, line 178</span>
1365
- 178: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">reload!</span>
1366
- 179: <span class="ruby-ivar">@scripts</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">script</span><span class="ruby-operator">|</span> <span class="ruby-identifier">script</span>.<span class="ruby-identifier">reload!</span> }
1367
- 180: <span class="ruby-keyword kw">end</span></pre>
1368
- </div>
1369
-
1370
- <h4 class="ruled" id="M000020">
1371
- <a href="#M000020">
1372
- Public Instance method:
1373
- <strong>#update(*scripts)</strong>
1374
- <img src="./images/permalink.gif">
1375
- </a>
1376
- </h4>
1377
- <div class="method">
1378
- <p>
1379
- Updates the reloader to only use the scripts provided:
1380
- </p>
1381
- <pre>
1382
- reloader.update(&quot;examples/blog.rb&quot;, &quot;examples/wiki.rb&quot;)
1383
- </pre>
1384
-
1385
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1386
- <pre class="sourcecode">
1387
- <span class="ruby-comment cmt"># File lib/camping/reloader.rb, line 158</span>
1388
- 158: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">update</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">scripts</span>)
1389
- 159: <span class="ruby-identifier">old</span> = <span class="ruby-ivar">@scripts</span>.<span class="ruby-identifier">dup</span>
1390
- 160: <span class="ruby-identifier">clear</span>
1391
- 161: <span class="ruby-ivar">@scripts</span> = <span class="ruby-identifier">scripts</span>.<span class="ruby-identifier">map</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">script</span><span class="ruby-operator">|</span>
1392
- 162: <span class="ruby-identifier">s</span> = <span class="ruby-constant">Script</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">script</span>)
1393
- 163: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pos</span> = <span class="ruby-identifier">old</span>.<span class="ruby-identifier">index</span>(<span class="ruby-identifier">s</span>)
1394
- 164: <span class="ruby-comment cmt"># We already got a script, so we use the old (which might got a mtime)</span>
1395
- 165: <span class="ruby-identifier">old</span>[<span class="ruby-identifier">pos</span>]
1396
- 166: <span class="ruby-keyword kw">else</span>
1397
- 167: <span class="ruby-identifier">s</span>.<span class="ruby-identifier">load_apps</span>
1398
- 168: <span class="ruby-keyword kw">end</span>
1399
- 169: <span class="ruby-keyword kw">end</span>
1400
- 170: <span class="ruby-keyword kw">end</span></pre>
1401
- </div>
1402
-
1403
- </div>
1404
-
1405
- <h2 id="class-Camping-Reloader-App">
1406
- <a href="#class-Camping-Reloader-App">
1407
- Class
1408
- Camping::Reloader::App
1409
-
1410
- &lt;
1411
-
1412
- (defined?(BasicObject) ? BasicObject : Object)
1413
-
1414
-
1415
- </a>
1416
- </h2>
1417
-
1418
- <div class="mod">
1419
- <p>
1420
- This is a simple wrapper which causes the script to reload (if needed) on
1421
- any method call. Then the method call will be forwarded to the app.
1422
- </p>
1423
-
1424
-
1425
- <h3>Methods</h3>
1426
-
1427
- <h4 class="ruled" id="M000010">
1428
- <a href="#M000010">
1429
- Public Class method:
1430
- <strong>::new(script)</strong>
1431
- <img src="./images/permalink.gif">
1432
- </a>
1433
- </h4>
1434
- <div class="method">
1435
-
1436
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1437
- <pre class="sourcecode">
1438
- <span class="ruby-comment cmt"># File lib/camping/reloader.rb, line 47</span>
1439
- 47: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">script</span>)
1440
- 48: <span class="ruby-ivar">@script</span> = <span class="ruby-identifier">script</span>
1441
- 49: <span class="ruby-keyword kw">end</span></pre>
1442
- </div>
1443
-
1444
- <h4 class="ruled" id="M000014">
1445
- <a href="#M000014">
1446
- Public Instance method:
1447
- <strong>#method_missing(meth, *args, &blk)</strong>
1448
- <img src="./images/permalink.gif">
1449
- </a>
1450
- </h4>
1451
- <div class="method">
1452
- <p>
1453
- Reloads if needed, before calling the method on the app.
1454
- </p>
1455
-
1456
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1457
- <pre class="sourcecode">
1458
- <span class="ruby-comment cmt"># File lib/camping/reloader.rb, line 52</span>
1459
- 52: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">method_missing</span>(<span class="ruby-identifier">meth</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1460
- 53: <span class="ruby-ivar">@script</span>.<span class="ruby-identifier">reload!</span>
1461
- 54: <span class="ruby-ivar">@app</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">meth</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1462
- 55: <span class="ruby-keyword kw">end</span></pre>
1463
- </div>
1464
-
1465
- </div>
1466
-
1467
- <h2 id="class-Camping-Server">
1468
- <a href="#class-Camping-Server">
1469
- Class
1470
- Camping::Server
1471
-
1472
- &lt;
1473
-
1474
- Object
1475
-
1476
-
1477
- </a>
1478
- </h2>
1479
-
1480
- <div class="mod">
1481
- <h3>The <a href="api.html#class-Camping">Camping</a> <a href="api.html#class-Camping-Server">Server</a> (for development)</h3>
1482
- <p>
1483
- <a href="api.html#class-Camping">Camping</a> includes a pretty nifty server
1484
- which is built for development. It follows these rules:
1485
- </p>
1486
- <ul>
1487
- <li>Load all <a href="api.html#class-Camping">Camping</a> apps in a directory
1488
- or a file.
1489
-
1490
- </li>
1491
- <li>Load new apps that appear in that directory or that file.
1492
-
1493
- </li>
1494
- <li>Mount those apps according to their name. (e.g. Blog is mounted at /blog.)
1495
-
1496
- </li>
1497
- <li>Run each app&#8217;s <tt>create</tt> method upon startup.
1498
-
1499
- </li>
1500
- <li>Reload the app if its modification time changes.
1501
-
1502
- </li>
1503
- <li>Reload the app if it requires any files under the same directory and one of
1504
- their modification times changes.
1505
-
1506
- </li>
1507
- <li>Support the X-Sendfile header.
1508
-
1509
- </li>
1510
- </ul>
1511
- <p>
1512
- Run it like this:
1513
- </p>
1514
- <pre>
1515
- camping examples/ # Mounts all apps in that directory
1516
- camping blog.rb # Mounts Blog at /
1517
- </pre>
1518
- <p>
1519
- And visit <a href="http://localhost:3301">localhost:3301</a>/ in your
1520
- browser.
1521
- </p>
1522
-
1523
-
1524
- <h3>Methods</h3>
1525
-
1526
- <h4 class="ruled" id="M000030">
1527
- <a href="#M000030">
1528
- Public Class method:
1529
- <strong>::new(conf, paths)</strong>
1530
- <img src="./images/permalink.gif">
1531
- </a>
1532
- </h4>
1533
- <div class="method">
1534
-
1535
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1536
- <pre class="sourcecode">
1537
- <span class="ruby-comment cmt"># File lib/camping/server.rb, line 29</span>
1538
- 29: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">conf</span>, <span class="ruby-identifier">paths</span>)
1539
- 30: <span class="ruby-ivar">@conf</span> = <span class="ruby-identifier">conf</span>
1540
- 31: <span class="ruby-ivar">@paths</span> = <span class="ruby-identifier">paths</span>
1541
- 32: <span class="ruby-ivar">@reloader</span> = <span class="ruby-constant">Camping</span><span class="ruby-operator">::</span><span class="ruby-constant">Reloader</span>.<span class="ruby-identifier">new</span>
1542
- 33: <span class="ruby-identifier">connect</span>(<span class="ruby-ivar">@conf</span>.<span class="ruby-identifier">database</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@conf</span>.<span class="ruby-identifier">database</span>
1543
- 34: <span class="ruby-keyword kw">end</span></pre>
1544
- </div>
1545
-
1546
- <h4 class="ruled" id="M000036">
1547
- <a href="#M000036">
1548
- Public Instance method:
1549
- <strong>#app()</strong>
1550
- <img src="./images/permalink.gif">
1551
- </a>
1552
- </h4>
1553
- <div class="method">
1554
-
1555
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1556
- <pre class="sourcecode">
1557
- <span class="ruby-comment cmt"># File lib/camping/server.rb, line 90</span>
1558
- 90: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">app</span>
1559
- 91: <span class="ruby-identifier">reload!</span>
1560
- 92: <span class="ruby-identifier">all_apps</span> = <span class="ruby-identifier">apps</span>
1561
- 93: <span class="ruby-identifier">rapp</span> = <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">all_apps</span>.<span class="ruby-identifier">length</span>
1562
- 94: <span class="ruby-keyword kw">when</span> <span class="ruby-value">0</span>
1563
- 95: <span class="ruby-identifier">proc</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">env</span><span class="ruby-operator">|</span>[<span class="ruby-value">200</span>,{<span class="ruby-value str">'Content-Type'</span>=<span class="ruby-operator">&gt;</span><span class="ruby-value str">'text/html'</span>},<span class="ruby-identifier">index_page</span>([])]}
1564
- 96: <span class="ruby-keyword kw">when</span> <span class="ruby-value">1</span>
1565
- 97: <span class="ruby-identifier">apps</span>.<span class="ruby-identifier">values</span>.<span class="ruby-identifier">first</span>
1566
- 98: <span class="ruby-keyword kw">else</span>
1567
- 99: <span class="ruby-identifier">hash</span> = {
1568
- 100: <span class="ruby-value str">&quot;/&quot;</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">proc</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">env</span><span class="ruby-operator">|</span>[<span class="ruby-value">200</span>,{<span class="ruby-value str">'Content-Type'</span>=<span class="ruby-operator">&gt;</span><span class="ruby-value str">'text/html'</span>},<span class="ruby-identifier">index_page</span>(<span class="ruby-identifier">all_apps</span>)]}
1569
- 101: }
1570
- 102: <span class="ruby-identifier">all_apps</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">mount</span>, <span class="ruby-identifier">wrapp</span><span class="ruby-operator">|</span>
1571
- 103: <span class="ruby-comment cmt"># We're doing @reloader.reload! ourself, so we don't need the wrapper.</span>
1572
- 104: <span class="ruby-identifier">app</span> = <span class="ruby-identifier">wrapp</span>.<span class="ruby-identifier">app</span>
1573
- 105: <span class="ruby-identifier">hash</span>[<span class="ruby-node">&quot;/#{mount}&quot;</span>] = <span class="ruby-identifier">app</span>
1574
- 106: <span class="ruby-identifier">hash</span>[<span class="ruby-node">&quot;/code/#{mount}&quot;</span>] = <span class="ruby-identifier">proc</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">env</span><span class="ruby-operator">|</span>
1575
- 107: [<span class="ruby-value">200</span>,{<span class="ruby-value str">'Content-Type'</span>=<span class="ruby-operator">&gt;</span><span class="ruby-value str">'text/plain'</span>,<span class="ruby-value str">'X-Sendfile'</span>=<span class="ruby-operator">&gt;</span><span class="ruby-identifier">wrapp</span>.<span class="ruby-identifier">script</span>.<span class="ruby-identifier">file</span>},<span class="ruby-value str">''</span>]
1576
- 108: <span class="ruby-keyword kw">end</span>
1577
- 109: <span class="ruby-keyword kw">end</span>
1578
- 110: <span class="ruby-constant">Rack</span><span class="ruby-operator">::</span><span class="ruby-constant">URLMap</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">hash</span>)
1579
- 111: <span class="ruby-keyword kw">end</span>
1580
- 112: <span class="ruby-identifier">rapp</span> = <span class="ruby-constant">Rack</span><span class="ruby-operator">::</span><span class="ruby-constant">ContentLength</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">rapp</span>)
1581
- 113: <span class="ruby-identifier">rapp</span> = <span class="ruby-constant">Rack</span><span class="ruby-operator">::</span><span class="ruby-constant">Lint</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">rapp</span>)
1582
- 114: <span class="ruby-identifier">rapp</span> = <span class="ruby-constant">XSendfile</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">rapp</span>)
1583
- 115: <span class="ruby-identifier">rapp</span> = <span class="ruby-constant">Rack</span><span class="ruby-operator">::</span><span class="ruby-constant">ShowExceptions</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">rapp</span>)
1584
- 116: <span class="ruby-keyword kw">end</span></pre>
1585
- </div>
1586
-
1587
- <h4 class="ruled" id="M000037">
1588
- <a href="#M000037">
1589
- Public Instance method:
1590
- <strong>#apps()</strong>
1591
- <img src="./images/permalink.gif">
1592
- </a>
1593
- </h4>
1594
- <div class="method">
1595
-
1596
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1597
- <pre class="sourcecode">
1598
- <span class="ruby-comment cmt"># File lib/camping/server.rb, line 118</span>
1599
- 118: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">apps</span>
1600
- 119: <span class="ruby-ivar">@reloader</span>.<span class="ruby-identifier">apps</span>.<span class="ruby-identifier">inject</span>({}) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">h</span>, (<span class="ruby-identifier">mount</span>, <span class="ruby-identifier">wrapp</span>)<span class="ruby-operator">|</span>
1601
- 120: <span class="ruby-identifier">h</span>[<span class="ruby-identifier">mount</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">downcase</span>] = <span class="ruby-identifier">wrapp</span>
1602
- 121: <span class="ruby-identifier">h</span>
1603
- 122: <span class="ruby-keyword kw">end</span>
1604
- 123: <span class="ruby-keyword kw">end</span></pre>
1605
- </div>
1606
-
1607
- <h4 class="ruled" id="M000038">
1608
- <a href="#M000038">
1609
- Public Instance method:
1610
- <strong>#call(env)</strong>
1611
- <img src="./images/permalink.gif">
1612
- </a>
1613
- </h4>
1614
- <div class="method">
1615
-
1616
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1617
- <pre class="sourcecode">
1618
- <span class="ruby-comment cmt"># File lib/camping/server.rb, line 125</span>
1619
- 125: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">call</span>(<span class="ruby-identifier">env</span>)
1620
- 126: <span class="ruby-identifier">app</span>.<span class="ruby-identifier">call</span>(<span class="ruby-identifier">env</span>)
1621
- 127: <span class="ruby-keyword kw">end</span></pre>
1622
- </div>
1623
-
1624
- <h4 class="ruled" id="M000032">
1625
- <a href="#M000032">
1626
- Public Instance method:
1627
- <strong>#connect(db)</strong>
1628
- <img src="./images/permalink.gif">
1629
- </a>
1630
- </h4>
1631
- <div class="method">
1632
-
1633
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1634
- <pre class="sourcecode">
1635
- <span class="ruby-comment cmt"># File lib/camping/server.rb, line 36</span>
1636
- 36: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">connect</span>(<span class="ruby-identifier">db</span>)
1637
- 37: <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">Camping</span>.<span class="ruby-identifier">autoload?</span>(<span class="ruby-identifier">:Models</span>)
1638
- 38: <span class="ruby-constant">Camping</span><span class="ruby-operator">::</span><span class="ruby-constant">Models</span><span class="ruby-operator">::</span><span class="ruby-constant">Base</span>.<span class="ruby-identifier">establish_connection</span>(<span class="ruby-identifier">db</span>)
1639
- 39: <span class="ruby-keyword kw">end</span>
1640
- 40: <span class="ruby-keyword kw">end</span></pre>
1641
- </div>
1642
-
1643
- <h4 class="ruled" id="M000033">
1644
- <a href="#M000033">
1645
- Public Instance method:
1646
- <strong>#find_scripts()</strong>
1647
- <img src="./images/permalink.gif">
1648
- </a>
1649
- </h4>
1650
- <div class="method">
1651
-
1652
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1653
- <pre class="sourcecode">
1654
- <span class="ruby-comment cmt"># File lib/camping/server.rb, line 42</span>
1655
- 42: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">find_scripts</span>
1656
- 43: <span class="ruby-identifier">scripts</span> = <span class="ruby-ivar">@paths</span>.<span class="ruby-identifier">map</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">path</span><span class="ruby-operator">|</span>
1657
- 44: <span class="ruby-keyword kw">case</span>
1658
- 45: <span class="ruby-keyword kw">when</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">file?</span>(<span class="ruby-identifier">path</span>)
1659
- 46: <span class="ruby-identifier">path</span>
1660
- 47: <span class="ruby-keyword kw">when</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">directory?</span>(<span class="ruby-identifier">path</span>)
1661
- 48: <span class="ruby-constant">Dir</span>[<span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>(<span class="ruby-identifier">path</span>, <span class="ruby-value str">'*.rb'</span>)]
1662
- 49: <span class="ruby-keyword kw">end</span>
1663
- 50: <span class="ruby-keyword kw">end</span>.<span class="ruby-identifier">flatten</span>.<span class="ruby-identifier">compact</span>
1664
- 51: <span class="ruby-ivar">@reloader</span>.<span class="ruby-identifier">update</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">scripts</span>)
1665
- 52: <span class="ruby-keyword kw">end</span></pre>
1666
- </div>
1667
-
1668
- <h4 class="ruled" id="M000035">
1669
- <a href="#M000035">
1670
- Public Instance method:
1671
- <strong>#index_page(apps)</strong>
1672
- <img src="./images/permalink.gif">
1673
- </a>
1674
- </h4>
1675
- <div class="method">
1676
-
1677
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1678
- <pre class="sourcecode">
1679
- <span class="ruby-comment cmt"># File lib/camping/server.rb, line 54</span>
1680
- 54: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">index_page</span>(<span class="ruby-identifier">apps</span>)
1681
- 55: <span class="ruby-identifier">welcome</span> = <span class="ruby-value str">&quot;You are Camping&quot;</span>
1682
- 56: <span class="ruby-identifier">header</span> = <span class="ruby-value str">&quot;&lt;html&gt;\n&lt;head&gt;\n&lt;title&gt;\#{welcome}&lt;/title&gt;\n&lt;style type=\&quot;text/css\&quot;&gt;\nbody {\nfont-family: verdana, arial, sans-serif;\npadding: 10px 40px;\nmargin: 0;\n}\nh1, h2, h3, h4, h5, h6 {\nfont-family: utopia, georgia, serif;\n}\n&lt;/style&gt;\n&lt;/head&gt;\n&lt;body&gt;\n&lt;h1&gt;\#{welcome}&lt;/h1&gt;\n&quot;</span>
1683
- 57: <span class="ruby-identifier">footer</span> = <span class="ruby-value str">'&lt;/body&gt;&lt;/html&gt;'</span>
1684
- 58: <span class="ruby-identifier">main</span> = <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">apps</span>.<span class="ruby-identifier">empty?</span>
1685
- 59: <span class="ruby-value str">&quot;&lt;p&gt;Good day. I'm sorry, but I could not find any Camping apps. &quot;</span>\
1686
- 60: <span class="ruby-value str">&quot;You might want to take a look at the console to see if any errors &quot;</span>\
1687
- 61: <span class="ruby-value str">&quot;have been raised.&lt;/p&gt;&quot;</span>
1688
- 62: <span class="ruby-keyword kw">else</span>
1689
- 63: <span class="ruby-value str">&quot;&lt;p&gt;Good day. These are the Camping apps you've mounted.&lt;/p&gt;&lt;ul&gt;&quot;</span> <span class="ruby-operator">+</span>
1690
- 64: <span class="ruby-identifier">apps</span>.<span class="ruby-identifier">map</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">mount</span>, <span class="ruby-identifier">app</span><span class="ruby-operator">|</span>
1691
- 65: <span class="ruby-node">&quot;&lt;li&gt;&lt;h3 style=\&quot;display: inline\&quot;&gt;&lt;a href=\&quot;/#{mount}\&quot;&gt;#{app}&lt;/a&gt;&lt;/h3&gt;&lt;small&gt; / &lt;a href=\&quot;/code/#{mount}\&quot;&gt;View source&lt;/a&gt;&lt;/small&gt;&lt;/li&gt;&quot;</span>
1692
- 66: <span class="ruby-keyword kw">end</span>.<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;\n&quot;</span>) <span class="ruby-operator">+</span> <span class="ruby-value str">'&lt;/ul&gt;'</span>
1693
- 67: <span class="ruby-keyword kw">end</span>
1694
- 68:
1695
- 69: <span class="ruby-identifier">header</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">main</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">footer</span>
1696
- 70: <span class="ruby-keyword kw">end</span></pre>
1697
- </div>
1698
-
1699
- <h4 class="ruled" id="M000041">
1700
- <a href="#M000041">
1701
- Public Instance method:
1702
- <strong>#reload!()</strong>
1703
- <img src="./images/permalink.gif">
1704
- </a>
1705
- </h4>
1706
- <div class="method">
1707
-
1708
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1709
- <pre class="sourcecode">
1710
- <span class="ruby-comment cmt"># File lib/camping/server.rb, line 149</span>
1711
- 149: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">reload!</span>
1712
- 150: <span class="ruby-identifier">find_scripts</span>
1713
- 151: <span class="ruby-ivar">@reloader</span>.<span class="ruby-identifier">reload!</span>
1714
- 152: <span class="ruby-keyword kw">end</span></pre>
1715
- </div>
1716
-
1717
- <h4 class="ruled" id="M000039">
1718
- <a href="#M000039">
1719
- Public Instance method:
1720
- <strong>#start()</strong>
1721
- <img src="./images/permalink.gif">
1722
- </a>
1723
- </h4>
1724
- <div class="method">
1725
-
1726
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1727
- <pre class="sourcecode">
1728
- <span class="ruby-comment cmt"># File lib/camping/server.rb, line 129</span>
1729
- 129: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">start</span>
1730
- 130: <span class="ruby-identifier">handler</span>, <span class="ruby-identifier">conf</span> = <span class="ruby-keyword kw">case</span> <span class="ruby-ivar">@conf</span>.<span class="ruby-identifier">server</span>
1731
- 131: <span class="ruby-keyword kw">when</span> <span class="ruby-value str">&quot;console&quot;</span>
1732
- 132: <span class="ruby-identifier">puts</span> <span class="ruby-value str">&quot;** Starting console&quot;</span>
1733
- 133: <span class="ruby-identifier">reload!</span>
1734
- 134: <span class="ruby-identifier">this</span> = <span class="ruby-keyword kw">self</span>; <span class="ruby-identifier">eval</span>(<span class="ruby-value str">&quot;self&quot;</span>, <span class="ruby-constant">TOPLEVEL_BINDING</span>).<span class="ruby-identifier">meta_def</span>(<span class="ruby-identifier">:reload!</span>) { <span class="ruby-identifier">this</span>.<span class="ruby-identifier">reload!</span>; <span class="ruby-keyword kw">nil</span> }
1735
- 135: <span class="ruby-constant">ARGV</span>.<span class="ruby-identifier">clear</span>
1736
- 136: <span class="ruby-constant">IRB</span>.<span class="ruby-identifier">start</span>
1737
- 137: <span class="ruby-identifier">exit</span>
1738
- 138: <span class="ruby-keyword kw">when</span> <span class="ruby-value str">&quot;mongrel&quot;</span>
1739
- 139: <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;** Starting Mongrel on #{@conf.host}:#{@conf.port}&quot;</span>
1740
- 140: [<span class="ruby-constant">Rack</span><span class="ruby-operator">::</span><span class="ruby-constant">Handler</span><span class="ruby-operator">::</span><span class="ruby-constant">Mongrel</span>, {<span class="ruby-identifier">:Port</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@conf</span>.<span class="ruby-identifier">port</span>, <span class="ruby-identifier">:Host</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@conf</span>.<span class="ruby-identifier">host</span>}]
1741
- 141: <span class="ruby-keyword kw">when</span> <span class="ruby-value str">&quot;webrick&quot;</span>
1742
- 142: <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;** Starting WEBrick on #{@conf.host}:#{@conf.port}&quot;</span>
1743
- 143: [<span class="ruby-constant">Rack</span><span class="ruby-operator">::</span><span class="ruby-constant">Handler</span><span class="ruby-operator">::</span><span class="ruby-constant">WEBrick</span>, {<span class="ruby-identifier">:Port</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@conf</span>.<span class="ruby-identifier">port</span>, <span class="ruby-identifier">:BindAddress</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@conf</span>.<span class="ruby-identifier">host</span>}]
1744
- 144: <span class="ruby-keyword kw">end</span>
1745
- 145: <span class="ruby-identifier">reload!</span>
1746
- 146: <span class="ruby-identifier">handler</span>.<span class="ruby-identifier">run</span>(<span class="ruby-keyword kw">self</span>, <span class="ruby-identifier">conf</span>)
1747
- 147: <span class="ruby-keyword kw">end</span></pre>
1748
- </div>
1749
-
1750
- </div>
1751
-
1752
- <h2 id="class-Camping-Server-XSendfile">
1753
- <a href="#class-Camping-Server-XSendfile">
1754
- Class
1755
- Camping::Server::XSendfile
1756
-
1757
- &lt;
1758
-
1759
- Object
1760
-
1761
-
1762
- </a>
1763
- </h2>
1764
-
1765
- <div class="mod">
1766
- <p>
1767
- A Rack middleware for reading X-Sendfile. Should only be used in
1768
- development.
1769
- </p>
1770
-
1771
-
1772
- <h3>Methods</h3>
1773
-
1774
- <h4 class="ruled" id="M000042">
1775
- <a href="#M000042">
1776
- Public Class method:
1777
- <strong>::new(app)</strong>
1778
- <img src="./images/permalink.gif">
1779
- </a>
1780
- </h4>
1781
- <div class="method">
1782
-
1783
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1784
- <pre class="sourcecode">
1785
- <span class="ruby-comment cmt"># File lib/camping/server.rb, line 164</span>
1786
- 164: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">app</span>)
1787
- 165: <span class="ruby-ivar">@app</span> = <span class="ruby-identifier">app</span>
1788
- 166: <span class="ruby-keyword kw">end</span></pre>
1789
- </div>
1790
-
1791
- <h4 class="ruled" id="M000043">
1792
- <a href="#M000043">
1793
- Public Instance method:
1794
- <strong>#call(env)</strong>
1795
- <img src="./images/permalink.gif">
1796
- </a>
1797
- </h4>
1798
- <div class="method">
1799
-
1800
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1801
- <pre class="sourcecode">
1802
- <span class="ruby-comment cmt"># File lib/camping/server.rb, line 168</span>
1803
- 168: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">call</span>(<span class="ruby-identifier">env</span>)
1804
- 169: <span class="ruby-identifier">status</span>, <span class="ruby-identifier">headers</span>, <span class="ruby-identifier">body</span> = <span class="ruby-ivar">@app</span>.<span class="ruby-identifier">call</span>(<span class="ruby-identifier">env</span>)
1805
- 170: <span class="ruby-identifier">headers</span> = <span class="ruby-constant">Rack</span><span class="ruby-operator">::</span><span class="ruby-constant">Utils</span><span class="ruby-operator">::</span><span class="ruby-constant">HeaderHash</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">headers</span>)
1806
- 171: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">header</span> = <span class="ruby-constant">HEADERS</span>.<span class="ruby-identifier">detect</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">header</span><span class="ruby-operator">|</span> <span class="ruby-identifier">headers</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">header</span>) }
1807
- 172: <span class="ruby-identifier">path</span> = <span class="ruby-identifier">headers</span>[<span class="ruby-identifier">header</span>]
1808
- 173: <span class="ruby-identifier">body</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">read</span>(<span class="ruby-identifier">path</span>)
1809
- 174: <span class="ruby-identifier">headers</span>[<span class="ruby-value str">'Content-Length'</span>] = <span class="ruby-identifier">body</span>.<span class="ruby-identifier">length</span>.<span class="ruby-identifier">to_s</span>
1810
- 175: <span class="ruby-keyword kw">end</span>
1811
- 176: [<span class="ruby-identifier">status</span>, <span class="ruby-identifier">headers</span>, <span class="ruby-identifier">body</span>]
1812
- 177: <span class="ruby-keyword kw">end</span></pre>
1813
- </div>
1814
-
1815
- </div>
1816
-
1817
- <h2 id="class-Camping-Session">
1818
- <a href="#class-Camping-Session">
1819
- Module
1820
- Camping::Session
1821
-
1822
- </a>
1823
- </h2>
1824
-
1825
- <div class="mod">
1826
- <h3>Getting Started</h3>
1827
- <p>
1828
- To get sessions working for your application:
1829
- </p>
1830
- <ol>
1831
- <li><tt>require 'camping/session'</tt>
1832
-
1833
- </li>
1834
- <li>Mixin the module: <tt>include Camping::Session</tt>
1835
-
1836
- </li>
1837
- <li>Define a secret (and keep it secret): <tt>secret &quot;SECRET!&quot;</tt>
1838
-
1839
- </li>
1840
- <li>Throughout your application, use the <tt>@state</tt> var like a hash to
1841
- store your application&#8217;s data.
1842
-
1843
- </li>
1844
- </ol>
1845
- <pre>
1846
- require 'camping/session' # 1
1847
-
1848
- module Nuts
1849
- include Camping::Session # 2
1850
- secret &quot;Oh yeah!&quot; # 3
1851
- end
1852
- </pre>
1853
- <h3>Other backends</h3>
1854
- <p>
1855
- <a href="api.html#class-Camping">Camping</a> only ships with
1856
- session-cookies. However, the <tt>@state</tt> variable is simply a shortcut
1857
- for <tt>@<a href="http://'rack.session'">env</a></tt>. Therefore you can
1858
- also use any middleware which sets this variable:
1859
- </p>
1860
- <pre>
1861
- module Nuts
1862
- use Rack::Session::Memcache
1863
- end
1864
- </pre>
1865
-
1866
-
1867
- <h3>Methods</h3>
1868
-
1869
- <h4 class="ruled" id="M000040">
1870
- <a href="#M000040">
1871
- Public Class method:
1872
- <strong>::included(app)</strong>
1873
- <img src="./images/permalink.gif">
1874
- </a>
1875
- </h4>
1876
- <div class="method">
1877
-
1878
- <p class="source-link">[ <a href="#">show source</a> ]</p>
1879
- <pre class="sourcecode">
1880
- <span class="ruby-comment cmt"># File lib/camping/session.rb, line 28</span>
1881
- 28: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">included</span>(<span class="ruby-identifier">app</span>)
1882
- 29: <span class="ruby-identifier">key</span> = <span class="ruby-node">&quot;#{app}.state&quot;</span>.<span class="ruby-identifier">downcase</span>
1883
- 30: <span class="ruby-identifier">secret</span> = [<span class="ruby-keyword kw">__FILE__</span>, <span class="ruby-constant">File</span>.<span class="ruby-identifier">mtime</span>(<span class="ruby-keyword kw">__FILE__</span>)].<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;:&quot;</span>)
1884
- 31:
1885
- 32: <span class="ruby-identifier">app</span>.<span class="ruby-identifier">meta_def</span>(<span class="ruby-identifier">:secret</span>) { <span class="ruby-operator">|</span><span class="ruby-identifier">val</span><span class="ruby-operator">|</span> <span class="ruby-identifier">secret</span>.<span class="ruby-identifier">replace</span>(<span class="ruby-identifier">val</span>) }
1886
- 33: <span class="ruby-identifier">app</span>.<span class="ruby-identifier">use</span> <span class="ruby-constant">Rack</span><span class="ruby-operator">::</span><span class="ruby-constant">Session</span><span class="ruby-operator">::</span><span class="ruby-constant">Cookie</span>, <span class="ruby-identifier">:key</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">key</span>, <span class="ruby-identifier">:secret</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">secret</span>
1887
- 34: <span class="ruby-keyword kw">end</span></pre>
1888
- </div>
1889
-
1890
- </div>
1891
-
1892
- <h2 id="class-Camping-Views">
1893
- <a href="#class-Camping-Views">
1894
- Module
1895
- Camping::Views
1896
-
1897
- </a>
1898
- </h2>
1899
-
1900
- <div class="mod">
1901
- <p>
1902
- <a href="api.html#class-Camping-Views">Views</a> is an empty module for
1903
- storing methods which create HTML. The HTML is described using the Markaby
1904
- language.
1905
- </p>
1906
- <h3>Defining and calling templates</h3>
1907
- <p>
1908
- Templates are simply Ruby methods with Markaby inside:
1909
- </p>
1910
- <pre>
1911
- module Blog::Views
1912
- def index
1913
- p &quot;Welcome to my blog&quot;
1914
- end
1915
-
1916
- def show
1917
- h1 @post.title
1918
- self &lt;&lt; @post.content
1919
- end
1920
- end
1921
- </pre>
1922
- <p>
1923
- In your controllers you just call <tt>render :template_name</tt> which will
1924
- invoke the template. The views and controllers will share instance
1925
- variables (as you can see above).
1926
- </p>
1927
- <h3>Using the layout method</h3>
1928
- <p>
1929
- If your <a href="api.html#class-Camping-Views">Views</a> module has a
1930
- <tt>layout</tt> method defined, it will be called with a block which will
1931
- insert content from your view:
1932
- </p>
1933
- <pre>
1934
- module Blog::Views
1935
- def layout
1936
- html do
1937
- head { title &quot;My Blog &quot;}
1938
- body { self &lt;&lt; yield }
1939
- end
1940
- end
1941
- end
1942
- </pre>
1943
-
1944
-
1945
- <h3>Methods</h3>
1946
-
1947
- </div>
1948
-
1949
- </div>
1950
- </div>
1951
- </div>
1952
- </body>
1953
- </html>