lotus-controller 0.1.0 → 0.2.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +127 -0
- data/{LICENSE.txt → LICENSE.md} +0 -0
- data/README.md +259 -15
- data/lib/lotus/action.rb +20 -0
- data/lib/lotus/action/callbacks.rb +20 -2
- data/lib/lotus/action/configurable.rb +48 -0
- data/lib/lotus/action/cookie_jar.rb +29 -5
- data/lib/lotus/action/exposable.rb +12 -5
- data/lib/lotus/action/mime.rb +215 -32
- data/lib/lotus/action/params.rb +21 -4
- data/lib/lotus/action/rack.rb +81 -0
- data/lib/lotus/action/redirect.rb +6 -1
- data/lib/lotus/action/session.rb +1 -0
- data/lib/lotus/action/throwable.rb +37 -36
- data/lib/lotus/controller.rb +216 -17
- data/lib/lotus/controller/configuration.rb +510 -0
- data/lib/lotus/controller/dsl.rb +6 -4
- data/lib/lotus/controller/version.rb +1 -1
- data/lib/lotus/http/status.rb +5 -62
- data/lib/rack-patch.rb +4 -2
- data/lotus-controller.gemspec +3 -3
- metadata +26 -56
- data/.gitignore +0 -10
- data/.travis.yml +0 -5
- data/.yardopts +0 -4
- data/Gemfile +0 -15
- data/Rakefile +0 -17
- data/test/action/callbacks_test.rb +0 -99
- data/test/action/params_test.rb +0 -29
- data/test/action_test.rb +0 -31
- data/test/controller_test.rb +0 -24
- data/test/cookies_test.rb +0 -36
- data/test/fixtures.rb +0 -501
- data/test/integration/mime_type_test.rb +0 -175
- data/test/integration/routing_test.rb +0 -141
- data/test/integration/sessions_test.rb +0 -63
- data/test/redirect_test.rb +0 -20
- data/test/session_test.rb +0 -19
- data/test/test_helper.rb +0 -24
- data/test/throw_test.rb +0 -93
- data/test/version_test.rb +0 -7
data/test/action/params_test.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
require 'rack'
|
3
|
-
|
4
|
-
describe Lotus::Action::Params do
|
5
|
-
it 'accepts params from "router.params"' do
|
6
|
-
action = ParamsAction.new
|
7
|
-
response = action.call({ 'router.params' => {id: '23'} })
|
8
|
-
|
9
|
-
response[2].must_equal ["{:id=>\"23\"}"]
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'accepts params as they are, for testing purposes' do
|
13
|
-
action = ParamsAction.new
|
14
|
-
response = action.call({id: '23'})
|
15
|
-
|
16
|
-
response[2].must_equal ["{:id=>\"23\"}"]
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'accepts params from "rack.input" as request body' do
|
20
|
-
response = Rack::MockRequest.new(ParamsAction.new).request('PATCH', "?id=23", params: { x: { foo: 'bar' } })
|
21
|
-
response.body.must_match "{:id=>\"23\", :x=>{:foo=>\"bar\"}}"
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'is frozen' do
|
25
|
-
params = Lotus::Action::Params.new({id: '23'})
|
26
|
-
|
27
|
-
-> { params.delete(:id) }.must_raise(RuntimeError)
|
28
|
-
end
|
29
|
-
end
|
data/test/action_test.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
describe Lotus::Action do
|
4
|
-
describe '#call' do
|
5
|
-
it 'calls an action' do
|
6
|
-
response = CallAction.new.call({})
|
7
|
-
|
8
|
-
response[0].must_equal 201
|
9
|
-
response[1].must_equal({'Content-Type' => 'application/octet-stream', 'X-Custom' => 'OK'})
|
10
|
-
response[2].must_equal ['Hi from TestAction!']
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'returns an HTTP 500 status code when an exception is raised' do
|
14
|
-
response = ErrorCallAction.new.call({})
|
15
|
-
|
16
|
-
response[0].must_equal 500
|
17
|
-
response[2].must_equal ['Internal Server Error']
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
describe '#expose' do
|
22
|
-
it 'creates a getter for the given ivar' do
|
23
|
-
action = ExposeAction.new
|
24
|
-
|
25
|
-
response = action.call({})
|
26
|
-
response[0].must_equal 200
|
27
|
-
|
28
|
-
action.exposures.must_equal({ film: '400 ASA', time: nil })
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
data/test/controller_test.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
describe Lotus::Controller do
|
4
|
-
describe '.action' do
|
5
|
-
it 'creates an action for the given name' do
|
6
|
-
action = TestController::Index.new
|
7
|
-
action.call({name: 'test'})
|
8
|
-
action.xyz.must_equal 'test'
|
9
|
-
end
|
10
|
-
|
11
|
-
it "raises an error when the given name isn't a valid Ruby identifier" do
|
12
|
-
-> {
|
13
|
-
class Controller
|
14
|
-
include Lotus::Controller
|
15
|
-
|
16
|
-
action 12 do
|
17
|
-
def call(params)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
}.must_raise TypeError
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
data/test/cookies_test.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
describe Lotus::Action do
|
4
|
-
describe 'cookies' do
|
5
|
-
it 'gets cookies' do
|
6
|
-
action = GetCookiesAction.new
|
7
|
-
response = action.call({'HTTP_COOKIE' => 'foo=bar'})
|
8
|
-
|
9
|
-
action.send(:cookies).must_equal({foo: 'bar'})
|
10
|
-
response[1].must_equal({'Content-Type' => 'application/octet-stream', 'Set-Cookie' => 'foo=bar'})
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'sets cookies' do
|
14
|
-
action = SetCookiesAction.new
|
15
|
-
response = action.call({})
|
16
|
-
|
17
|
-
response[2].must_equal(['yo'])
|
18
|
-
response[1].must_equal({'Content-Type' => 'application/octet-stream', 'Set-Cookie' => 'foo=yum%21'})
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'sets cookies with options' do
|
22
|
-
tomorrow = Time.now + 60 * 60 * 24
|
23
|
-
action = SetCookiesWithOptionsAction.new
|
24
|
-
response = action.call({expires: tomorrow})
|
25
|
-
|
26
|
-
response[1].must_equal({'Content-Type' => 'application/octet-stream', 'Set-Cookie' => "kukki=yum%21; domain=lotusrb.org; path=/controller; expires=#{ tomorrow.gmtime.rfc2822 }; secure; HttpOnly"})
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'removes cookies' do
|
30
|
-
action = RemoveCookiesAction.new
|
31
|
-
response = action.call({'HTTP_COOKIE' => 'foo=bar;rm=me'})
|
32
|
-
|
33
|
-
response[1].must_equal({'Content-Type' => 'application/octet-stream', 'Set-Cookie' => "foo=bar\nrm=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"})
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
data/test/fixtures.rb
DELETED
@@ -1,501 +0,0 @@
|
|
1
|
-
HTTP_TEST_STATUSES = {
|
2
|
-
100 => 'Continue',
|
3
|
-
101 => 'Switching Protocols',
|
4
|
-
102 => 'Processing (WebDAV) (RFC 2518)',
|
5
|
-
103 => 'Checkpoint',
|
6
|
-
122 => 'Request-URI too long',
|
7
|
-
200 => 'OK',
|
8
|
-
201 => 'Created',
|
9
|
-
202 => 'Accepted',
|
10
|
-
203 => 'Non-Authoritative Information',
|
11
|
-
204 => 'No Content',
|
12
|
-
205 => 'Reset Content',
|
13
|
-
206 => 'Partial Content',
|
14
|
-
207 => 'Multi-Status (WebDAV) (RFC 4918)',
|
15
|
-
208 => 'Already Reported (WebDAV) (RFC 5842)',
|
16
|
-
226 => 'IM Used (RFC 3229)',
|
17
|
-
300 => 'Multiple Choices',
|
18
|
-
301 => 'Moved Permanently',
|
19
|
-
302 => 'Found',
|
20
|
-
303 => 'See Other',
|
21
|
-
304 => 'Not Modified',
|
22
|
-
305 => 'Use Proxy',
|
23
|
-
306 => 'Switch Proxy',
|
24
|
-
307 => 'Temporary Redirect',
|
25
|
-
308 => 'Resume Incomplete',
|
26
|
-
400 => 'Bad Request',
|
27
|
-
401 => 'Unauthorized',
|
28
|
-
402 => 'Payment Required',
|
29
|
-
403 => 'Forbidden',
|
30
|
-
404 => 'Not Found',
|
31
|
-
405 => 'Method Not Allowed',
|
32
|
-
406 => 'Not Acceptable',
|
33
|
-
407 => 'Proxy Authentication Required',
|
34
|
-
408 => 'Request Timeout',
|
35
|
-
409 => 'Conflict',
|
36
|
-
410 => 'Gone',
|
37
|
-
411 => 'Length Required',
|
38
|
-
412 => 'Precondition Failed',
|
39
|
-
413 => 'Request Entity Too Large',
|
40
|
-
414 => 'Request-URI Too Long',
|
41
|
-
415 => 'Unsupported Media Type',
|
42
|
-
416 => 'Requested Range Not Satisfiable',
|
43
|
-
417 => 'Expectation Failed',
|
44
|
-
418 => 'I\'m a teapot (RFC 2324)',
|
45
|
-
420 => 'Enhance Your Calm',
|
46
|
-
422 => 'Unprocessable Entity (WebDAV) (RFC 4918)',
|
47
|
-
423 => 'Locked (WebDAV) (RFC 4918)',
|
48
|
-
424 => 'Failed Dependency (WebDAV) (RFC 4918)',
|
49
|
-
426 => 'Upgrade Required (RFC 2817)',
|
50
|
-
428 => 'Precondition Required',
|
51
|
-
429 => 'Too Many Requests',
|
52
|
-
431 => 'Request Header Fields Too Large',
|
53
|
-
444 => 'No Response',
|
54
|
-
449 => 'Retry With',
|
55
|
-
450 => 'Blocked by Windows Parental Controls',
|
56
|
-
451 => 'Wrong Exchange server',
|
57
|
-
499 => 'Client Closed Request',
|
58
|
-
500 => 'Internal Server Error',
|
59
|
-
501 => 'Not Implemented',
|
60
|
-
502 => 'Bad Gateway',
|
61
|
-
503 => 'Service Unavailable',
|
62
|
-
504 => 'Gateway Timeout',
|
63
|
-
505 => 'HTTP Version Not Supported',
|
64
|
-
506 => 'Variant Also Negotiates (RFC 2295)',
|
65
|
-
507 => 'Insufficient Storage (WebDAV) (RFC 4918)',
|
66
|
-
508 => 'Loop Detected (WebDAV) (RFC 5842)',
|
67
|
-
509 => 'Bandwidth Limit Exceeded (Apache bw\/limited extension)',
|
68
|
-
510 => 'Not Extended (RFC 2774)',
|
69
|
-
511 => 'Network Authentication Required',
|
70
|
-
598 => 'Network read timeout error',
|
71
|
-
599 => 'Network connect timeout error'
|
72
|
-
}
|
73
|
-
|
74
|
-
class TestController
|
75
|
-
include Lotus::Controller
|
76
|
-
|
77
|
-
action 'Index' do
|
78
|
-
expose :xyz
|
79
|
-
|
80
|
-
def call(params)
|
81
|
-
@xyz = params[:name]
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
class CallAction
|
87
|
-
include Lotus::Action
|
88
|
-
|
89
|
-
def call(params)
|
90
|
-
self.status = 201
|
91
|
-
self.body = 'Hi from TestAction!'
|
92
|
-
self.headers.merge!({ 'X-Custom' => 'OK' })
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
class ErrorCallAction
|
97
|
-
include Lotus::Action
|
98
|
-
|
99
|
-
def call(params)
|
100
|
-
raise
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
class ExposeAction
|
105
|
-
include Lotus::Action
|
106
|
-
|
107
|
-
expose :film, :time
|
108
|
-
|
109
|
-
def call(params)
|
110
|
-
@film = '400 ASA'
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
class BeforeMethodAction
|
115
|
-
include Lotus::Action
|
116
|
-
|
117
|
-
expose :article
|
118
|
-
before :set_article, :reverse_article
|
119
|
-
|
120
|
-
def call(params)
|
121
|
-
end
|
122
|
-
|
123
|
-
private
|
124
|
-
def set_article
|
125
|
-
@article = 'Bonjour!'
|
126
|
-
end
|
127
|
-
|
128
|
-
def reverse_article
|
129
|
-
@article.reverse!
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
class SubclassBeforeMethodAction < BeforeMethodAction
|
134
|
-
before :upcase_article
|
135
|
-
|
136
|
-
private
|
137
|
-
def upcase_article
|
138
|
-
@article.upcase!
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
class ParamsBeforeMethodAction < BeforeMethodAction
|
143
|
-
expose :exposed_params
|
144
|
-
|
145
|
-
private
|
146
|
-
def set_article(params)
|
147
|
-
@exposed_params = params
|
148
|
-
@article = super() + params[:bang]
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
class ErrorBeforeMethodAction < BeforeMethodAction
|
153
|
-
private
|
154
|
-
def set_article
|
155
|
-
raise
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
class BeforeBlockAction
|
160
|
-
include Lotus::Action
|
161
|
-
|
162
|
-
expose :article
|
163
|
-
before { @article = 'Good morning!' }
|
164
|
-
before { @article.reverse! }
|
165
|
-
|
166
|
-
def call(params)
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
class YieldBeforeBlockAction < BeforeBlockAction
|
171
|
-
expose :yielded_params
|
172
|
-
before {|params| @yielded_params = params }
|
173
|
-
end
|
174
|
-
|
175
|
-
class AfterMethodAction
|
176
|
-
include Lotus::Action
|
177
|
-
|
178
|
-
expose :egg
|
179
|
-
after :set_egg, :scramble_egg
|
180
|
-
|
181
|
-
def call(params)
|
182
|
-
end
|
183
|
-
|
184
|
-
private
|
185
|
-
def set_egg
|
186
|
-
@egg = 'Egg!'
|
187
|
-
end
|
188
|
-
|
189
|
-
def scramble_egg
|
190
|
-
@egg = 'gE!g'
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
class SubclassAfterMethodAction < AfterMethodAction
|
195
|
-
after :upcase_egg
|
196
|
-
|
197
|
-
private
|
198
|
-
def upcase_egg
|
199
|
-
@egg.upcase!
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
203
|
-
class ParamsAfterMethodAction < AfterMethodAction
|
204
|
-
private
|
205
|
-
def scramble_egg(params)
|
206
|
-
@egg = super() + params[:question]
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
class ErrorAfterMethodAction < AfterMethodAction
|
211
|
-
private
|
212
|
-
def set_egg
|
213
|
-
raise
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
class AfterBlockAction
|
218
|
-
include Lotus::Action
|
219
|
-
|
220
|
-
expose :egg
|
221
|
-
after { @egg = 'Coque' }
|
222
|
-
after { @egg.reverse! }
|
223
|
-
|
224
|
-
def call(params)
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
class YieldAfterBlockAction < AfterBlockAction
|
229
|
-
expose :meaning_of_life_params
|
230
|
-
before {|params| @meaning_of_life_params = params }
|
231
|
-
end
|
232
|
-
|
233
|
-
class SessionAction
|
234
|
-
include Lotus::Action
|
235
|
-
include Lotus::Action::Session
|
236
|
-
|
237
|
-
def call(params)
|
238
|
-
end
|
239
|
-
end
|
240
|
-
|
241
|
-
class RedirectAction
|
242
|
-
include Lotus::Action
|
243
|
-
|
244
|
-
def call(params)
|
245
|
-
redirect_to '/destination'
|
246
|
-
end
|
247
|
-
end
|
248
|
-
|
249
|
-
class StatusRedirectAction
|
250
|
-
include Lotus::Action
|
251
|
-
|
252
|
-
def call(params)
|
253
|
-
redirect_to '/destination', status: 301
|
254
|
-
end
|
255
|
-
end
|
256
|
-
|
257
|
-
class GetCookiesAction
|
258
|
-
include Lotus::Action
|
259
|
-
include Lotus::Action::Cookies
|
260
|
-
|
261
|
-
def call(params)
|
262
|
-
end
|
263
|
-
end
|
264
|
-
|
265
|
-
class SetCookiesAction
|
266
|
-
include Lotus::Action
|
267
|
-
include Lotus::Action::Cookies
|
268
|
-
|
269
|
-
def call(params)
|
270
|
-
self.body = 'yo'
|
271
|
-
cookies[:foo] = 'yum!'
|
272
|
-
end
|
273
|
-
end
|
274
|
-
|
275
|
-
class SetCookiesWithOptionsAction
|
276
|
-
include Lotus::Action
|
277
|
-
include Lotus::Action::Cookies
|
278
|
-
|
279
|
-
def call(params)
|
280
|
-
cookies[:kukki] = { value: 'yum!', domain: 'lotusrb.org', path: '/controller', expires: params[:expires], secure: true, httponly: true }
|
281
|
-
end
|
282
|
-
end
|
283
|
-
|
284
|
-
class RemoveCookiesAction
|
285
|
-
include Lotus::Action
|
286
|
-
include Lotus::Action::Cookies
|
287
|
-
|
288
|
-
def call(params)
|
289
|
-
cookies[:rm] = nil
|
290
|
-
end
|
291
|
-
end
|
292
|
-
|
293
|
-
class ThrowCodeAction
|
294
|
-
include Lotus::Action
|
295
|
-
|
296
|
-
def call(params)
|
297
|
-
throw params[:status]
|
298
|
-
end
|
299
|
-
end
|
300
|
-
|
301
|
-
class ThrowBeforeMethodAction
|
302
|
-
include Lotus::Action
|
303
|
-
|
304
|
-
before :authorize!
|
305
|
-
before :set_body
|
306
|
-
|
307
|
-
def call(params)
|
308
|
-
self.body = 'Hello!'
|
309
|
-
end
|
310
|
-
|
311
|
-
private
|
312
|
-
def authorize!
|
313
|
-
throw 401
|
314
|
-
end
|
315
|
-
|
316
|
-
def set_body
|
317
|
-
self.body = 'Hi!'
|
318
|
-
end
|
319
|
-
end
|
320
|
-
|
321
|
-
class ThrowBeforeBlockAction
|
322
|
-
include Lotus::Action
|
323
|
-
|
324
|
-
before { throw 401 }
|
325
|
-
before { self.body = 'Hi!' }
|
326
|
-
|
327
|
-
def call(params)
|
328
|
-
self.body = 'Hello!'
|
329
|
-
end
|
330
|
-
end
|
331
|
-
|
332
|
-
class ThrowAfterMethodAction
|
333
|
-
include Lotus::Action
|
334
|
-
|
335
|
-
after :raise_timeout!
|
336
|
-
after :set_body
|
337
|
-
|
338
|
-
def call(params)
|
339
|
-
self.body = 'Hello!'
|
340
|
-
end
|
341
|
-
|
342
|
-
private
|
343
|
-
def raise_timeout!
|
344
|
-
throw 408
|
345
|
-
end
|
346
|
-
|
347
|
-
def set_body
|
348
|
-
self.body = 'Later!'
|
349
|
-
end
|
350
|
-
end
|
351
|
-
|
352
|
-
class ThrowAfterBlockAction
|
353
|
-
include Lotus::Action
|
354
|
-
|
355
|
-
after { throw 408 }
|
356
|
-
after { self.body = 'Later!' }
|
357
|
-
|
358
|
-
def call(params)
|
359
|
-
self.body = 'Hello!'
|
360
|
-
end
|
361
|
-
end
|
362
|
-
|
363
|
-
class RecordNotFound < StandardError
|
364
|
-
end
|
365
|
-
|
366
|
-
class HandledExceptionAction
|
367
|
-
include Lotus::Action
|
368
|
-
handle_exception RecordNotFound, 404
|
369
|
-
|
370
|
-
def call(params)
|
371
|
-
raise RecordNotFound.new
|
372
|
-
end
|
373
|
-
end
|
374
|
-
|
375
|
-
class UnhandledExceptionAction
|
376
|
-
include Lotus::Action
|
377
|
-
|
378
|
-
def call(params)
|
379
|
-
raise RecordNotFound.new
|
380
|
-
end
|
381
|
-
end
|
382
|
-
|
383
|
-
class ParamsAction
|
384
|
-
include Lotus::Action
|
385
|
-
|
386
|
-
def call(params)
|
387
|
-
self.body = params.inspect
|
388
|
-
end
|
389
|
-
end
|
390
|
-
|
391
|
-
class Root
|
392
|
-
include Lotus::Action
|
393
|
-
|
394
|
-
def call(params)
|
395
|
-
self.body = params.inspect
|
396
|
-
headers.merge!({'X-Test' => 'test'})
|
397
|
-
end
|
398
|
-
end
|
399
|
-
|
400
|
-
class AboutController
|
401
|
-
include Lotus::Controller
|
402
|
-
|
403
|
-
class Team < Root
|
404
|
-
end
|
405
|
-
|
406
|
-
action 'Contacts' do
|
407
|
-
def call(params)
|
408
|
-
self.body = params.inspect
|
409
|
-
end
|
410
|
-
end
|
411
|
-
end
|
412
|
-
|
413
|
-
class IdentityController
|
414
|
-
include Lotus::Controller
|
415
|
-
|
416
|
-
class Action
|
417
|
-
include Lotus::Action
|
418
|
-
|
419
|
-
def call(params)
|
420
|
-
self.body = params.inspect
|
421
|
-
end
|
422
|
-
end
|
423
|
-
|
424
|
-
Show = Class.new(Action)
|
425
|
-
New = Class.new(Action)
|
426
|
-
Create = Class.new(Action)
|
427
|
-
Edit = Class.new(Action)
|
428
|
-
Update = Class.new(Action)
|
429
|
-
Destroy = Class.new(Action)
|
430
|
-
end
|
431
|
-
|
432
|
-
class FlowersController
|
433
|
-
include Lotus::Controller
|
434
|
-
|
435
|
-
class Action
|
436
|
-
include Lotus::Action
|
437
|
-
|
438
|
-
def call(params)
|
439
|
-
self.body = params.inspect
|
440
|
-
end
|
441
|
-
end
|
442
|
-
|
443
|
-
Index = Class.new(Action)
|
444
|
-
Show = Class.new(Action)
|
445
|
-
New = Class.new(Action)
|
446
|
-
Create = Class.new(Action)
|
447
|
-
Edit = Class.new(Action)
|
448
|
-
Update = Class.new(Action)
|
449
|
-
Destroy = Class.new(Action)
|
450
|
-
end
|
451
|
-
|
452
|
-
class DashboardController
|
453
|
-
include Lotus::Controller
|
454
|
-
|
455
|
-
action 'Index' do
|
456
|
-
include Lotus::Action::Session
|
457
|
-
before :authenticate!
|
458
|
-
|
459
|
-
def call(params)
|
460
|
-
end
|
461
|
-
|
462
|
-
private
|
463
|
-
def authenticate!
|
464
|
-
throw 401 unless loggedin?
|
465
|
-
end
|
466
|
-
|
467
|
-
def loggedin?
|
468
|
-
session.has_key?(:user_id)
|
469
|
-
end
|
470
|
-
end
|
471
|
-
end
|
472
|
-
|
473
|
-
class SessionsController
|
474
|
-
include Lotus::Controller
|
475
|
-
|
476
|
-
action 'Create' do
|
477
|
-
include Lotus::Action::Session
|
478
|
-
|
479
|
-
def call(params)
|
480
|
-
session[:user_id] = 23
|
481
|
-
redirect_to '/'
|
482
|
-
end
|
483
|
-
end
|
484
|
-
|
485
|
-
action 'Destroy' do
|
486
|
-
include Lotus::Action::Session
|
487
|
-
|
488
|
-
def call(params)
|
489
|
-
session[:user_id] = nil
|
490
|
-
end
|
491
|
-
end
|
492
|
-
end
|
493
|
-
|
494
|
-
class StandaloneSession
|
495
|
-
include Lotus::Action
|
496
|
-
include Lotus::Action::Session
|
497
|
-
|
498
|
-
def call(params)
|
499
|
-
session[:age] = Time.now.year - 1982
|
500
|
-
end
|
501
|
-
end
|