merb 0.0.6 → 0.0.7

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.
Files changed (88) hide show
  1. data/README +22 -4
  2. data/Rakefile +15 -3
  3. data/TODO +2 -3
  4. data/bin/merb +61 -36
  5. data/examples/sample_app/dist/app/controllers/files.rb +31 -0
  6. data/examples/sample_app/dist/app/controllers/posts.rb +26 -2
  7. data/examples/sample_app/dist/app/controllers/test.rb +7 -1
  8. data/examples/sample_app/dist/app/views/files/progress.jerb +3 -0
  9. data/examples/sample_app/dist/app/views/files/start.herb +62 -0
  10. data/examples/sample_app/dist/app/views/files/upload.herb +6 -0
  11. data/examples/sample_app/dist/app/views/layout/{application.rhtml → application.herb} +2 -3
  12. data/examples/sample_app/dist/app/views/layout/{foo.rhtml → foo.herb} +0 -0
  13. data/examples/sample_app/dist/app/views/posts/{_comments.rhtml → _comments.herb} +0 -0
  14. data/examples/sample_app/dist/app/views/posts/comment.jerb +1 -0
  15. data/examples/sample_app/dist/app/views/posts/{list.rhtml → list.herb} +0 -0
  16. data/examples/sample_app/dist/app/views/posts/{new.rhtml → new.herb} +0 -0
  17. data/examples/sample_app/dist/app/views/posts/{show.rhtml → show.herb} +0 -0
  18. data/examples/sample_app/dist/app/views/posts/xml_test.xerb +3 -0
  19. data/examples/sample_app/dist/app/views/test/{foo.rhtml → foo.herb} +0 -0
  20. data/examples/sample_app/dist/app/views/test/{hello.rhtml → hello.herb} +0 -0
  21. data/examples/sample_app/dist/app/views/test/json.jerb +1 -0
  22. data/examples/sample_app/dist/conf/merb.yml +11 -0
  23. data/examples/sample_app/dist/conf/merb_init.rb +1 -1
  24. data/examples/sample_app/dist/conf/mup.conf +11 -0
  25. data/examples/sample_app/dist/public/javascripts/mup.js +113 -0
  26. data/examples/sample_app/script/merb_stop +7 -3
  27. data/examples/sample_app/script/startdrb +8 -0
  28. data/lib/merb.rb +37 -2
  29. data/lib/merb/merb_class_extensions.rb +21 -22
  30. data/lib/merb/merb_controller.rb +101 -33
  31. data/lib/merb/merb_handler.rb +26 -25
  32. data/lib/merb/merb_router.rb +1 -1
  33. data/lib/merb/merb_utils.rb +35 -37
  34. data/lib/merb/mixins/basic_authentication_mixin.rb +39 -0
  35. data/lib/merb/mixins/controller_mixin.rb +119 -115
  36. data/lib/merb/mixins/javascript_mixin.rb +63 -0
  37. data/lib/merb/mixins/render_mixin.rb +85 -69
  38. data/lib/merb/mixins/responder_mixin.rb +38 -0
  39. data/lib/merb/session/merb_drb_server.rb +107 -0
  40. data/lib/merb/session/merb_drb_session.rb +71 -0
  41. data/lib/merb/session/merb_session.rb +1 -0
  42. data/lib/merb/vendor/paginator/README.txt +84 -0
  43. data/lib/merb/vendor/paginator/paginator.rb +121 -0
  44. data/lib/mutex_hotfix.rb +34 -0
  45. metadata +41 -63
  46. data/doc/rdoc/classes/ControllerMixin.html +0 -676
  47. data/doc/rdoc/classes/Hash.html +0 -148
  48. data/doc/rdoc/classes/Merb.html +0 -140
  49. data/doc/rdoc/classes/Merb/Controller.html +0 -338
  50. data/doc/rdoc/classes/Merb/RouteMatcher.html +0 -388
  51. data/doc/rdoc/classes/Merb/Server.html +0 -148
  52. data/doc/rdoc/classes/Merb/Session.html +0 -201
  53. data/doc/rdoc/classes/Merb/SessionMixin.html +0 -199
  54. data/doc/rdoc/classes/MerbControllerError.html +0 -111
  55. data/doc/rdoc/classes/MerbHandler.html +0 -430
  56. data/doc/rdoc/classes/MerbHash.html +0 -469
  57. data/doc/rdoc/classes/MerbHash/Mutex.html +0 -198
  58. data/doc/rdoc/classes/Noroutefound.html +0 -153
  59. data/doc/rdoc/classes/Object.html +0 -149
  60. data/doc/rdoc/classes/RenderMixin.html +0 -362
  61. data/doc/rdoc/classes/String.html +0 -212
  62. data/doc/rdoc/classes/Symbol.html +0 -179
  63. data/doc/rdoc/created.rid +0 -1
  64. data/doc/rdoc/files/LICENSE.html +0 -129
  65. data/doc/rdoc/files/README.html +0 -417
  66. data/doc/rdoc/files/TODO.html +0 -151
  67. data/doc/rdoc/files/lib/merb/merb_class_extensions_rb.html +0 -101
  68. data/doc/rdoc/files/lib/merb/merb_controller_rb.html +0 -101
  69. data/doc/rdoc/files/lib/merb/merb_handler_rb.html +0 -101
  70. data/doc/rdoc/files/lib/merb/merb_router_rb.html +0 -101
  71. data/doc/rdoc/files/lib/merb/merb_utils_rb.html +0 -108
  72. data/doc/rdoc/files/lib/merb/mixins/controller_mixin_rb.html +0 -101
  73. data/doc/rdoc/files/lib/merb/mixins/render_mixin_rb.html +0 -101
  74. data/doc/rdoc/files/lib/merb/session/merb_session_rb.html +0 -101
  75. data/doc/rdoc/files/lib/merb_rb.html +0 -140
  76. data/doc/rdoc/files/lib/merb_tasks_rb.html +0 -101
  77. data/doc/rdoc/fr_class_index.html +0 -43
  78. data/doc/rdoc/fr_file_index.html +0 -40
  79. data/doc/rdoc/fr_method_index.html +0 -104
  80. data/doc/rdoc/index.html +0 -24
  81. data/doc/rdoc/rdoc-style.css +0 -208
  82. data/examples/sample_app/dist/app/controllers/upload.rb +0 -29
  83. data/examples/sample_app/dist/app/views/posts/comment.merbjs +0 -1
  84. data/examples/sample_app/dist/app/views/upload/start.rhtml +0 -15
  85. data/examples/sample_app/dist/app/views/upload/upload.rhtml +0 -4
  86. data/examples/sample_app/dist/public/files/README +0 -35
  87. data/examples/sample_app/dist/public/files/setup.rb +0 -1346
  88. data/examples/sample_app/log/merb.log +0 -778
@@ -1,179 +0,0 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
-
6
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
- <head>
8
- <title>Class: Symbol</title>
9
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
- <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
- <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
12
- <script type="text/javascript">
13
- // <![CDATA[
14
-
15
- function popupCode( url ) {
16
- window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
- }
18
-
19
- function toggleCode( id ) {
20
- if ( document.getElementById )
21
- elem = document.getElementById( id );
22
- else if ( document.all )
23
- elem = eval( "document.all." + id );
24
- else
25
- return false;
26
-
27
- elemStyle = elem.style;
28
-
29
- if ( elemStyle.display != "block" ) {
30
- elemStyle.display = "block"
31
- } else {
32
- elemStyle.display = "none"
33
- }
34
-
35
- return true;
36
- }
37
-
38
- // Make codeblocks hidden by default
39
- document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
-
41
- // ]]>
42
- </script>
43
-
44
- </head>
45
- <body>
46
-
47
-
48
-
49
- <div id="classHeader">
50
- <table class="header-table">
51
- <tr class="top-aligned-row">
52
- <td><strong>Class</strong></td>
53
- <td class="class-name-in-header">Symbol</td>
54
- </tr>
55
- <tr class="top-aligned-row">
56
- <td><strong>In:</strong></td>
57
- <td>
58
- <a href="../files/lib/merb/merb_utils_rb.html">
59
- lib/merb/merb_utils.rb
60
- </a>
61
- <br />
62
- </td>
63
- </tr>
64
-
65
- <tr class="top-aligned-row">
66
- <td><strong>Parent:</strong></td>
67
- <td>
68
- <a href="Object.html">
69
- Object
70
- </a>
71
- </td>
72
- </tr>
73
- </table>
74
- </div>
75
- <!-- banner header -->
76
-
77
- <div id="bodyContent">
78
-
79
-
80
-
81
- <div id="contextContent">
82
-
83
-
84
-
85
- </div>
86
-
87
- <div id="method-list">
88
- <h3 class="section-bar">Methods</h3>
89
-
90
- <div class="name-list">
91
- <a href="#M000002">to_proc</a>&nbsp;&nbsp;
92
- <a href="#M000001">to_s</a>&nbsp;&nbsp;
93
- </div>
94
- </div>
95
-
96
- </div>
97
-
98
-
99
- <!-- if includes -->
100
-
101
- <div id="section">
102
-
103
-
104
-
105
-
106
-
107
-
108
-
109
-
110
- <!-- if method_list -->
111
- <div id="methods">
112
- <h3 class="section-bar">Public Instance methods</h3>
113
-
114
- <div id="method-M000002" class="method-detail">
115
- <a name="M000002"></a>
116
-
117
- <div class="method-heading">
118
- <a href="#M000002" class="method-signature">
119
- <span class="method-name">to_proc</span><span class="method-args">()</span>
120
- </a>
121
- </div>
122
-
123
- <div class="method-description">
124
- <p>
125
- [&quot;foo&quot;, &quot;bar&quot;].map &amp;:reverse #=&gt;
126
- [&#8216;oof&#8217;, &#8216;rab&#8217;]
127
- </p>
128
- <p><a class="source-toggle" href="#"
129
- onclick="toggleCode('M000002-source');return false;">[Source]</a></p>
130
- <div class="method-source-code" id="M000002-source">
131
- <pre>
132
- <span class="ruby-comment cmt"># File lib/merb/merb_utils.rb, line 34</span>
133
- 34: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">to_proc</span>
134
- 35: <span class="ruby-constant">Proc</span>.<span class="ruby-identifier">new</span>{<span class="ruby-operator">|</span><span class="ruby-operator">*</span><span class="ruby-identifier">args</span><span class="ruby-operator">|</span> <span class="ruby-identifier">args</span>.<span class="ruby-identifier">shift</span>.<span class="ruby-identifier">__send__</span>(<span class="ruby-keyword kw">self</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">args</span>)}
135
- 36: <span class="ruby-keyword kw">end</span>
136
- </pre>
137
- </div>
138
- </div>
139
- </div>
140
-
141
- <div id="method-M000001" class="method-detail">
142
- <a name="M000001"></a>
143
-
144
- <div class="method-heading">
145
- <a href="#M000001" class="method-signature">
146
- <span class="method-name">to_s</span><span class="method-args">()</span>
147
- </a>
148
- </div>
149
-
150
- <div class="method-description">
151
- <p>
152
- faster <a href="Symbol.html#M000001">Symbol#to_s</a> to speed up routing.
153
- </p>
154
- <p><a class="source-toggle" href="#"
155
- onclick="toggleCode('M000001-source');return false;">[Source]</a></p>
156
- <div class="method-source-code" id="M000001-source">
157
- <pre>
158
- <span class="ruby-comment cmt"># File lib/merb/merb_utils.rb, line 29</span>
159
- 29: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">to_s</span>
160
- 30: <span class="ruby-ivar">@str_rep</span> <span class="ruby-operator">||</span> (<span class="ruby-ivar">@str_rep</span> = <span class="ruby-identifier">id2name</span>.<span class="ruby-identifier">freeze</span>)
161
- 31: <span class="ruby-keyword kw">end</span>
162
- </pre>
163
- </div>
164
- </div>
165
- </div>
166
-
167
-
168
- </div>
169
-
170
-
171
- </div>
172
-
173
-
174
- <div id="validator-badges">
175
- <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
176
- </div>
177
-
178
- </body>
179
- </html>
data/doc/rdoc/created.rid DELETED
@@ -1 +0,0 @@
1
- Thu Nov 09 19:39:10 -0800 2006
@@ -1,129 +0,0 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
-
6
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
- <head>
8
- <title>File: LICENSE</title>
9
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
- <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
- <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
12
- <script type="text/javascript">
13
- // <![CDATA[
14
-
15
- function popupCode( url ) {
16
- window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
- }
18
-
19
- function toggleCode( id ) {
20
- if ( document.getElementById )
21
- elem = document.getElementById( id );
22
- else if ( document.all )
23
- elem = eval( "document.all." + id );
24
- else
25
- return false;
26
-
27
- elemStyle = elem.style;
28
-
29
- if ( elemStyle.display != "block" ) {
30
- elemStyle.display = "block"
31
- } else {
32
- elemStyle.display = "none"
33
- }
34
-
35
- return true;
36
- }
37
-
38
- // Make codeblocks hidden by default
39
- document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
-
41
- // ]]>
42
- </script>
43
-
44
- </head>
45
- <body>
46
-
47
-
48
-
49
- <div id="fileHeader">
50
- <h1>LICENSE</h1>
51
- <table class="header-table">
52
- <tr class="top-aligned-row">
53
- <td><strong>Path:</strong></td>
54
- <td>LICENSE
55
- </td>
56
- </tr>
57
- <tr class="top-aligned-row">
58
- <td><strong>Last Update:</strong></td>
59
- <td>Sat Oct 14 14:18:28 -0700 2006</td>
60
- </tr>
61
- </table>
62
- </div>
63
- <!-- banner header -->
64
-
65
- <div id="bodyContent">
66
-
67
-
68
-
69
- <div id="contextContent">
70
-
71
- <div id="description">
72
- <p>
73
- Copyright (c) 2006 Ezra Zygmuntowicz
74
- </p>
75
- <p>
76
- Permission is hereby granted, free of charge, to any person obtaining a
77
- copy of this software and associated documentation files (the
78
- &quot;Software&quot;), to deal in the Software without restriction,
79
- including without limitation the rights to use, copy, modify, merge,
80
- publish, distribute, sublicense, and/or sell copies of the Software, and to
81
- permit persons to whom the Software is furnished to do so, subject to the
82
- following conditions:
83
- </p>
84
- <p>
85
- The above copyright notice and this permission notice shall be included in
86
- all copies or substantial portions of the Software.
87
- </p>
88
- <p>
89
- THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
90
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
91
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
92
- NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
93
- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
94
- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
95
- USE OR OTHER DEALINGS IN THE SOFTWARE.
96
- </p>
97
-
98
- </div>
99
-
100
-
101
- </div>
102
-
103
-
104
- </div>
105
-
106
-
107
- <!-- if includes -->
108
-
109
- <div id="section">
110
-
111
-
112
-
113
-
114
-
115
-
116
-
117
-
118
- <!-- if method_list -->
119
-
120
-
121
- </div>
122
-
123
-
124
- <div id="validator-badges">
125
- <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
126
- </div>
127
-
128
- </body>
129
- </html>
@@ -1,417 +0,0 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
-
6
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
- <head>
8
- <title>File: README</title>
9
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
- <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
- <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
12
- <script type="text/javascript">
13
- // <![CDATA[
14
-
15
- function popupCode( url ) {
16
- window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
- }
18
-
19
- function toggleCode( id ) {
20
- if ( document.getElementById )
21
- elem = document.getElementById( id );
22
- else if ( document.all )
23
- elem = eval( "document.all." + id );
24
- else
25
- return false;
26
-
27
- elemStyle = elem.style;
28
-
29
- if ( elemStyle.display != "block" ) {
30
- elemStyle.display = "block"
31
- } else {
32
- elemStyle.display = "none"
33
- }
34
-
35
- return true;
36
- }
37
-
38
- // Make codeblocks hidden by default
39
- document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
-
41
- // ]]>
42
- </script>
43
-
44
- </head>
45
- <body>
46
-
47
-
48
-
49
- <div id="fileHeader">
50
- <h1>README</h1>
51
- <table class="header-table">
52
- <tr class="top-aligned-row">
53
- <td><strong>Path:</strong></td>
54
- <td>README
55
- </td>
56
- </tr>
57
- <tr class="top-aligned-row">
58
- <td><strong>Last Update:</strong></td>
59
- <td>Thu Nov 09 17:41:04 -0800 2006</td>
60
- </tr>
61
- </table>
62
- </div>
63
- <!-- banner header -->
64
-
65
- <div id="bodyContent">
66
-
67
-
68
-
69
- <div id="contextContent">
70
-
71
- <div id="description">
72
- <p>
73
- Copyright (c) 2006 Ezra Zygmuntowicz
74
- </p>
75
- <p>
76
- <a href="../classes/Merb.html">Merb</a>. Mongrel+Erb
77
- </p>
78
- <p>
79
- Little bitty lightweight ruby app server. For when you really need
80
- performance for simple dynamic pages.
81
- </p>
82
- <p>
83
- **Sample APP included**
84
- </p>
85
- <p>
86
- Unpack the gem and grab the sample app
87
- </p>
88
- <p>
89
- $ gem unpack merb
90
- </p>
91
- <p>
92
- cd merb* cd examples/sample_app
93
- </p>
94
- <p>
95
- $ merb
96
- </p>
97
- <p>
98
- then the sample app will be running on port 4000 in the foreground. you can
99
- go to a few urls:
100
- </p>
101
- <p>
102
- <a
103
- href="http://localhost:4000/upload/start">localhost:4000/upload/start</a>
104
- </p>
105
- <p>
106
- <a
107
- href="http://localhost:4000/foo/123/baz/12234345">localhost:4000/foo/123/baz/12234345</a>
108
- </p>
109
- <p>
110
- *<b>FEATURES</b>* 1. Mongrel handler built in that parses incoming requests
111
- including multipart uploads and post as well as ?query=strings. Puts the
112
- params into params and the cookies into cookies when it instantiates your
113
- controller class.
114
- </p>
115
- <ol>
116
- <li>RouteMatcher and route compiler. Reads your route definition and compiles
117
-
118
- </li>
119
- </ol>
120
- <p>
121
- a method on the fly that will match the request path against each route and
122
- do the right thing. So the following routes:
123
- </p>
124
- <p>
125
- Merb::RouteMatcher.prepare do |r|
126
- </p>
127
- <pre>
128
- r.add '/foo/:bar/baz/:id', :controller =&gt; 'Test', :action =&gt; 'foo'
129
- r.add '/:controller/:action/:id'
130
- r.add '/bar/:*rest', :controller =&gt; 'Test', :action =&gt; 'glob'
131
- </pre>
132
- <p>
133
- end
134
- </p>
135
- <p>
136
- Will be compiled and defined as a method with this lambda as the body:
137
- </p>
138
- <p>
139
- lambda{|path|
140
- </p>
141
- <pre>
142
- case path
143
- when Regexp.new('/foo/([^/;.,?]+)/baz/([^/;.,?]+)')
144
- @sections[:bar] = $1
145
- @sections[:id] = $2
146
- return {:controller=&gt;&quot;Test&quot;, :action=&gt;&quot;foo&quot;}.merge(@sections)
147
- when /\A\/([^\/;.,?]+)(?:\/?\Z|\/([^\/;.,?]+)\/?)(?:\/?\Z|\/([^\/;.,?]+)\/?)\Z/
148
- @sections[:controller] = $1
149
- @sections[:action] = $2 || 'index'
150
- @sections[:id] = $3 || nil
151
- return @sections
152
- when Regexp.new('/bar/([^;.,?]+)')
153
- @sections[:rest] = $1
154
- return {:controller=&gt;&quot;Test&quot;, :action=&gt;&quot;glob&quot;}.merge(@sections)
155
- else
156
- return {:controller=&gt;'Noroutefound', :action=&gt;'noroute'}
157
- end
158
- </pre>
159
- <p>
160
- }
161
- </p>
162
- <ol>
163
- <li>Simple controller classes with built in render method and template handling
164
-
165
- </li>
166
- </ol>
167
- <p>
168
- with instance vars available in the views automatically. <a
169
- href="../classes/Merb.html">Merb</a> also supports layouts. It will look
170
- for a layout named after your controller class first and then fall back to
171
- application.rhtml if no layout exists named after your controller. You can
172
- use render_no_layout or do layout :none right before you render
173
- </p>
174
- <p>
175
- class Test &lt; <a
176
- href="../classes/Merb/Controller.html">Merb::Controller</a>
177
- </p>
178
- <pre>
179
- def hello
180
- # params, headers and cookies are available here.
181
- @name = params[:name]
182
- render
183
- end
184
- </pre>
185
- <p>
186
- end
187
- </p>
188
- <p>
189
- &lt;html&gt;
190
- </p>
191
- <pre>
192
- &lt;head&gt;
193
- &lt;title&gt;Hello, &lt;%= @name %&gt;&lt;/title&gt;
194
- &lt;/head&gt;
195
- &lt;body&gt;
196
- </pre>
197
- <p>
198
- &lt;%= @layout_content %&gt;
199
- </p>
200
- <pre>
201
- &lt;/body&gt;
202
- </pre>
203
- <p>
204
- &lt;/html&gt;
205
- </p>
206
- <p>
207
- &lt;h1&gt;&lt;%= params.inspect %&gt;&lt;/h1&gt; &lt;h1&gt;&lt;%=
208
- cookies.inspect %&gt;&lt;/h1&gt; &lt;% 5.times do %&gt;
209
- </p>
210
- <pre>
211
- &lt;h1&gt;Hello, &lt;%= @name %&gt;!&lt;/h1&gt;
212
- </pre>
213
- <p>
214
- &lt;% end %&gt;
215
- </p>
216
- <p>
217
- You can also render partials like so: &lt;%= partial(:comments) %&gt;
218
- </p>
219
- <p>
220
- This assumes a _comments.rhtml file in the same view dir as the current
221
- controller/view
222
- </p>
223
- <p>
224
- <a href="../classes/Merb.html">Merb</a> also allows for returning
225
- javascript instead of html for ajax actions You have to use the render_js
226
- instead of normal render
227
- </p>
228
- <p>
229
- def ajax_action
230
- </p>
231
- <pre>
232
- @posts = Post.find :all
233
- render_js
234
- </pre>
235
- <p>
236
- end
237
- </p>
238
- <p>
239
- # ajax_action.merbjs $(&#8216;comments&#8217;).update(&#8217;&lt;%=
240
- escape_js(partial(:posts)) %&gt;&#8217;);
241
- </p>
242
- <p>
243
- # _posts.rhtml &lt;ul&gt;
244
- </p>
245
- <pre>
246
- &lt;% @posts.each do |p| %&gt;
247
- &lt;li&gt;
248
- &lt;%= p.title %&gt;&lt;br /&gt;
249
- &lt;%= p.body %&gt;
250
- &lt;/li&gt;
251
- &lt;% end %&gt;
252
- </pre>
253
- <p>
254
- &lt;/ul&gt;
255
- </p>
256
- <p>
257
- Controllers also now have before filters. Use the before method in your
258
- controllers. before accepts either a symbol or a Proc/lambda object. If you
259
- give it a symbol it will call a method with the same name as the symbol. If
260
- you give it a proc that takes one argument it will call the proc with the
261
- current controller as that argument.
262
- </p>
263
- <p>
264
- class Foo &lt; <a
265
- href="../classes/Merb/Controller.html">Merb::Controller</a>
266
- </p>
267
- <pre>
268
- before :setup_user
269
- before lambda {|c| c.headers['X-Foo] = 'bar' }
270
-
271
- def setup_user
272
- # blah blah
273
- end
274
-
275
- def regular_action
276
- # blah
277
- end
278
- </pre>
279
- <p>
280
- end
281
- </p>
282
- <p>
283
- Sessions are available when you start merb with the -s flag. See sample app
284
- for migration too add session table.
285
- </p>
286
- <ol>
287
- <li>the server. right now you add your routes in
288
-
289
- </li>
290
- </ol>
291
- <p>
292
- the appdir/conf/router.rb file. So by default it runs on port 4000
293
- </p>
294
- <p>
295
- $ cd /path/to/your/merb/app $ merb
296
- </p>
297
- <p>
298
- Or to start merb on a different port: $ merb -p 3500
299
- </p>
300
- <p>
301
- To start a cluster of merb servers you specify the first port and then how
302
- many servers you want spawned. SO this command will start a merb instance
303
- on ports 3000, 3001, 3002
304
- </p>
305
- <p>
306
- $ merb -p 3000 -c 3
307
- </p>
308
- <p>
309
- To start a <a href="../classes/Merb.html">Merb</a> IRB console where all
310
- your models and other classes are pre loaded use the -i flag
311
- </p>
312
- <p>
313
- $merb -i
314
- </p>
315
- <ol>
316
- <li>File uploads. This is the thing that <a
317
- href="../classes/Merb.html">Merb</a> was written for. Rails doesn&#8216;t
318
- allow
319
-
320
- </li>
321
- </ol>
322
- <p>
323
- multiple concurrent file uploads at once without blocking an entire rails
324
- backend for each file upload. <a href="../classes/Merb.html">Merb</a>
325
- allows multiple file uploads at once. Start the server and browse to <a
326
- href="http://localhost:4000/upload/start">localhost:4000/upload/start</a>
327
- and you will get a file upload form. There is a very simple upload
328
- controller example that handles this upload. When a file is uploaded with
329
- <a href="../classes/Merb.html">Merb</a>, it gets put in a Tempfile. So you
330
- just want to copy it to the right place on the filesystem.
331
- </p>
332
- <p>
333
- def upload
334
- </p>
335
- <pre>
336
- puts params[:file].inspect
337
-
338
- FileUtils.mv params[:file][:tempfile].path, MERB_ROOT+&quot;/uploads/#{params[:file][:filename]}&quot;
339
-
340
- render
341
- </pre>
342
- <p>
343
- end
344
- </p>
345
- <ol>
346
- <li><a href="../classes/Merb.html">Merb</a> app layout. A <a
347
- href="../classes/Merb.html">Merb</a> app contains everything it needs to
348
- run in production in the
349
-
350
- </li>
351
- </ol>
352
- <p>
353
- MERB_ROOT/dist directory. So for deployment you only need to deploy the
354
- dist dir. This keeps your test code and development plugins separate from
355
- your main app and lets you not deploy them to the live server. You deal
356
- with two things with this setup, MERB_ROOT and DIST_ROOT. MERB_ROOT is the
357
- root of the whole tree. And DISTROOT is MERB_ROOT+/dist You will cd into
358
- MERB_ROOT to run the merb command line. ANd when you deploy live you will
359
- put the dist dir into another empty MERB_ROOT on the production server.
360
- </p>
361
- <p>
362
- app_skeleton
363
- </p>
364
- <pre>
365
- Rakefile
366
- README
367
- scripts
368
- test
369
- test_helper.rb
370
- fixtures
371
- spec
372
- unit
373
- plugins
374
- dist
375
- app
376
- controllers
377
- models
378
- views
379
- conf
380
- lib
381
- public
382
- plugins
383
- schema
384
- </pre>
385
-
386
- </div>
387
-
388
-
389
- </div>
390
-
391
-
392
- </div>
393
-
394
-
395
- <!-- if includes -->
396
-
397
- <div id="section">
398
-
399
-
400
-
401
-
402
-
403
-
404
-
405
-
406
- <!-- if method_list -->
407
-
408
-
409
- </div>
410
-
411
-
412
- <div id="validator-badges">
413
- <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
414
- </div>
415
-
416
- </body>
417
- </html>