simple_controller 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +38 -1
- data/lib/simple_controller/base/callbacks.rb +190 -0
- data/lib/simple_controller/base/core.rb +30 -0
- data/lib/simple_controller/base.rb +2 -2
- data/lib/simple_controller/router/mapper.rb +68 -0
- data/lib/simple_controller/router/route.rb +20 -0
- data/lib/simple_controller/router.rb +55 -0
- data/lib/simple_controller/version.rb +1 -1
- data/lib/simple_controller.rb +2 -0
- metadata +7 -4
- data/lib/simple_controller/callbacks.rb +0 -188
- data/lib/simple_controller/core.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 022feec11ef15f421596afc8ab71a0f69dd271ed
|
4
|
+
data.tar.gz: e048c155d5ad1b659a0a5dd45eada31a64f46916
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 52542cc33f334c554d80e15dbb635993c2562e77b3ea3d7536ddd8ec2be80c28105e5cabd0e9d5774717965cdd78c1d7a4e20168e07d1518d847454336cdbf55
|
7
|
+
data.tar.gz: eb967704ba637c82038b0ce0611fe8eecdf07d50320dead670c0123f9c7b4f53f4da0a3b10b71617e4d834350b5cf84207f11facffbf19b31a4a859ffac9acc9
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -39,4 +39,41 @@ UserController.new.call(:touch, user_id: 1) # => same as above
|
|
39
39
|
It works like a Rails Controller, but has only has the following features:
|
40
40
|
- Callbacks
|
41
41
|
- `params`
|
42
|
-
- `action_name`
|
42
|
+
- `action_name`
|
43
|
+
|
44
|
+
## Router
|
45
|
+
A router is provided to decouple controller classes from identifiers.
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
class Router < SimpleController::Router
|
49
|
+
end
|
50
|
+
|
51
|
+
# Router.instance is a singleton for ease of use
|
52
|
+
Router.instance.draw do
|
53
|
+
match "threes/multiply"
|
54
|
+
match "threes/dividing" => "threes#divide"
|
55
|
+
|
56
|
+
controller :threes do
|
57
|
+
match :add
|
58
|
+
match subtracting: "subtract"
|
59
|
+
end
|
60
|
+
# custom syntax
|
61
|
+
controller :threes, actions: %i[power]
|
62
|
+
|
63
|
+
namespace :some_namespace do
|
64
|
+
match :magic
|
65
|
+
end
|
66
|
+
|
67
|
+
# no other Rails-like syntax is available
|
68
|
+
end
|
69
|
+
|
70
|
+
Router.call("threes/multiply", number: 6) # calls ThreesController.call(:multiply, number: 6)
|
71
|
+
Router.instance.call("threes/multiply", number: 6) # same as above
|
72
|
+
```
|
73
|
+
|
74
|
+
To custom namespace the controller:
|
75
|
+
```ruby
|
76
|
+
Router.instance.parse_controller_name {|controller_name| "#{controller_name}_suffix_controller".classify.constantize }
|
77
|
+
|
78
|
+
Router.call("threes/multiply", number: 6) # calls ThreesSuffixController.call(:multiply, number: 6)
|
79
|
+
```
|
@@ -0,0 +1,190 @@
|
|
1
|
+
# based on: https://github.com/rails/rails/blob/d2876141d08341ec67cf6a11a073d1acfb920de7/actionpack/lib/abstract_controller/callbacks.rb
|
2
|
+
module SimpleController
|
3
|
+
class Base
|
4
|
+
module Callbacks
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
# Uses ActiveSupport::Callbacks as the base functionality. For
|
8
|
+
# more details on the whole callback system, read the documentation
|
9
|
+
# for ActiveSupport::Callbacks.
|
10
|
+
include ActiveSupport::Callbacks
|
11
|
+
|
12
|
+
included do
|
13
|
+
define_callbacks :call_action
|
14
|
+
end
|
15
|
+
|
16
|
+
# Override SimpleController::Base's call to run the
|
17
|
+
# call callbacks around the normal behavior.
|
18
|
+
def call_action(*args)
|
19
|
+
run_callbacks(:call_action) do
|
20
|
+
super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
module ClassMethods
|
25
|
+
# If +:only+ or +:except+ are used, convert the options into the
|
26
|
+
# +:if+ and +:unless+ options of ActiveSupport::Callbacks.
|
27
|
+
#
|
28
|
+
# The basic idea is that <tt>:only => :index</tt> gets converted to
|
29
|
+
# <tt>:if => proc {|c| c.action_name == "index" }</tt>.
|
30
|
+
#
|
31
|
+
# Note that <tt>:only</tt> has priority over <tt>:if</tt> in case they
|
32
|
+
# are used together.
|
33
|
+
#
|
34
|
+
# only: :index, if: -> { true } # the :if option will be ignored.
|
35
|
+
#
|
36
|
+
# Note that <tt>:if</tt> has priority over <tt>:except</tt> in case they
|
37
|
+
# are used together.
|
38
|
+
#
|
39
|
+
# except: :index, if: -> { true } # the :except option will be ignored.
|
40
|
+
#
|
41
|
+
# ==== Options
|
42
|
+
# * <tt>only</tt> - The callback should be run only for this action
|
43
|
+
# * <tt>except</tt> - The callback should be run for all actions except this action
|
44
|
+
def _normalize_callback_options(options)
|
45
|
+
_normalize_callback_option(options, :only, :if)
|
46
|
+
_normalize_callback_option(options, :except, :unless)
|
47
|
+
end
|
48
|
+
|
49
|
+
def _normalize_callback_option(options, from, to) # :nodoc:
|
50
|
+
if from = options[from]
|
51
|
+
from = Array(from).map {|o| "action_name == '#{o}'"}.join(" || ")
|
52
|
+
options[to] = Array(options[to]).unshift(from)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Take callback names and an optional callback proc, normalize them,
|
57
|
+
# then call the block with each callback. This allows us to abstract
|
58
|
+
# the normalization across several methods that use it.
|
59
|
+
#
|
60
|
+
# ==== Parameters
|
61
|
+
# * <tt>callbacks</tt> - An array of callbacks, with an optional
|
62
|
+
# options hash as the last parameter.
|
63
|
+
# * <tt>block</tt> - A proc that should be added to the callbacks.
|
64
|
+
#
|
65
|
+
# ==== Block Parameters
|
66
|
+
# * <tt>name</tt> - The callback to be added
|
67
|
+
# * <tt>options</tt> - A hash of options to be used when adding the callback
|
68
|
+
def _insert_callbacks(callbacks, block = nil)
|
69
|
+
options = callbacks.extract_options!
|
70
|
+
_normalize_callback_options(options)
|
71
|
+
callbacks.push(block) if block
|
72
|
+
callbacks.each do |callback|
|
73
|
+
yield callback, options
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
##
|
78
|
+
# :method: before_action
|
79
|
+
#
|
80
|
+
# :call-seq: before_action(names, block)
|
81
|
+
#
|
82
|
+
# Append a callback before actions. See _insert_callbacks for parameter details.
|
83
|
+
|
84
|
+
##
|
85
|
+
# :method: prepend_before_action
|
86
|
+
#
|
87
|
+
# :call-seq: prepend_before_action(names, block)
|
88
|
+
#
|
89
|
+
# Prepend a callback before actions. See _insert_callbacks for parameter details.
|
90
|
+
|
91
|
+
##
|
92
|
+
# :method: skip_before_action
|
93
|
+
#
|
94
|
+
# :call-seq: skip_before_action(names)
|
95
|
+
#
|
96
|
+
# Skip a callback before actions. See _insert_callbacks for parameter details.
|
97
|
+
|
98
|
+
##
|
99
|
+
# :method: append_before_action
|
100
|
+
#
|
101
|
+
# :call-seq: append_before_action(names, block)
|
102
|
+
#
|
103
|
+
# Append a callback before actions. See _insert_callbacks for parameter details.
|
104
|
+
|
105
|
+
##
|
106
|
+
# :method: after_action
|
107
|
+
#
|
108
|
+
# :call-seq: after_action(names, block)
|
109
|
+
#
|
110
|
+
# Append a callback after actions. See _insert_callbacks for parameter details.
|
111
|
+
|
112
|
+
##
|
113
|
+
# :method: prepend_after_action
|
114
|
+
#
|
115
|
+
# :call-seq: prepend_after_action(names, block)
|
116
|
+
#
|
117
|
+
# Prepend a callback after actions. See _insert_callbacks for parameter details.
|
118
|
+
|
119
|
+
##
|
120
|
+
# :method: skip_after_action
|
121
|
+
#
|
122
|
+
# :call-seq: skip_after_action(names)
|
123
|
+
#
|
124
|
+
# Skip a callback after actions. See _insert_callbacks for parameter details.
|
125
|
+
|
126
|
+
##
|
127
|
+
# :method: append_after_action
|
128
|
+
#
|
129
|
+
# :call-seq: append_after_action(names, block)
|
130
|
+
#
|
131
|
+
# Append a callback after actions. See _insert_callbacks for parameter details.
|
132
|
+
|
133
|
+
##
|
134
|
+
# :method: around_action
|
135
|
+
#
|
136
|
+
# :call-seq: around_action(names, block)
|
137
|
+
#
|
138
|
+
# Append a callback around actions. See _insert_callbacks for parameter details.
|
139
|
+
|
140
|
+
##
|
141
|
+
# :method: prepend_around_action
|
142
|
+
#
|
143
|
+
# :call-seq: prepend_around_action(names, block)
|
144
|
+
#
|
145
|
+
# Prepend a callback around actions. See _insert_callbacks for parameter details.
|
146
|
+
|
147
|
+
##
|
148
|
+
# :method: skip_around_action
|
149
|
+
#
|
150
|
+
# :call-seq: skip_around_action(names)
|
151
|
+
#
|
152
|
+
# Skip a callback around actions. See _insert_callbacks for parameter details.
|
153
|
+
|
154
|
+
##
|
155
|
+
# :method: append_around_action
|
156
|
+
#
|
157
|
+
# :call-seq: append_around_action(names, block)
|
158
|
+
#
|
159
|
+
# Append a callback around actions. See _insert_callbacks for parameter details.
|
160
|
+
|
161
|
+
# set up before_action, prepend_before_action, skip_before_action, etc.
|
162
|
+
# for each of before, after, and around.
|
163
|
+
[:before, :after, :around].each do |callback|
|
164
|
+
define_method "#{callback}_action" do |*names, &blk|
|
165
|
+
_insert_callbacks(names, blk) do |name, options|
|
166
|
+
set_callback(:call_action, callback, name, options)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
define_method "prepend_#{callback}_action" do |*names, &blk|
|
171
|
+
_insert_callbacks(names, blk) do |name, options|
|
172
|
+
set_callback(:call_action, callback, name, options.merge(:prepend => true))
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
# Skip a before, after or around callback. See _insert_callbacks
|
177
|
+
# for details on the allowed parameters.
|
178
|
+
define_method "skip_#{callback}_action" do |*names|
|
179
|
+
_insert_callbacks(names) do |name, options|
|
180
|
+
skip_callback(:call_action, callback, name, options)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
# *_action is the same as append_*_action
|
185
|
+
alias_method :"append_#{callback}_action", :"#{callback}_action"
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module SimpleController
|
2
|
+
class Base
|
3
|
+
module Core
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
attr_reader :params, :action_name
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(action_name, params={})
|
11
|
+
@params ||= ActiveSupport::HashWithIndifferentAccess.new(params)
|
12
|
+
@action_name ||= action_name.to_s
|
13
|
+
|
14
|
+
call_action
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def call_action
|
20
|
+
public_send action_name
|
21
|
+
end
|
22
|
+
|
23
|
+
module ClassMethods
|
24
|
+
def call(*args)
|
25
|
+
new.call *args
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'simple_controller/router/route'
|
2
|
+
|
3
|
+
module SimpleController
|
4
|
+
class Router
|
5
|
+
class Mapper
|
6
|
+
attr_reader :router, :namespaces, :controller_name
|
7
|
+
|
8
|
+
def initialize(router, namespaces=[], controller_name=nil)
|
9
|
+
@router, @namespaces, @controller_name = router, namespaces, controller_name
|
10
|
+
end
|
11
|
+
|
12
|
+
def namespace(namespace, &block)
|
13
|
+
@namespaces << namespace
|
14
|
+
|
15
|
+
mapper = self.class.new(router, namespaces, controller_name)
|
16
|
+
mapper.instance_eval(&block)
|
17
|
+
ensure
|
18
|
+
@namespaces.pop
|
19
|
+
end
|
20
|
+
|
21
|
+
def controller(controller_name, options={}, &block)
|
22
|
+
raise "can't have multiple controller scopes" if self.controller_name
|
23
|
+
|
24
|
+
mapper = self.class.new(router, namespaces, controller_name)
|
25
|
+
Array(options[:actions]).each { |action| mapper.match(action) }
|
26
|
+
|
27
|
+
mapper.instance_eval(&block) if block_given?
|
28
|
+
end
|
29
|
+
|
30
|
+
def match(arg)
|
31
|
+
route_path, partition = parse_match_arg(arg)
|
32
|
+
|
33
|
+
route_parts = [route_path]
|
34
|
+
route_parts.unshift(self.controller_name) if self.controller_name
|
35
|
+
route_parts.unshift(*namespaces)
|
36
|
+
|
37
|
+
controller_name_parts = [self.controller_name || partition.first]
|
38
|
+
controller_name_parts.unshift(*namespaces)
|
39
|
+
|
40
|
+
action_name = partition.last
|
41
|
+
|
42
|
+
router.add_route join_parts(route_parts), Route.new(join_parts(controller_name_parts), action_name)
|
43
|
+
end
|
44
|
+
|
45
|
+
protected
|
46
|
+
def join_parts(parts)
|
47
|
+
parts.map do |part|
|
48
|
+
s = part.to_s.dup
|
49
|
+
s.chomp!("/")
|
50
|
+
s.slice!(0) if part[0] == "/"
|
51
|
+
s
|
52
|
+
end.join("/")
|
53
|
+
end
|
54
|
+
|
55
|
+
def parse_match_arg(arg)
|
56
|
+
if arg.class == Hash
|
57
|
+
raise "takes only one option" unless arg.size == 1
|
58
|
+
route_path = arg.keys.first.to_s
|
59
|
+
partition = arg.values.first.to_s.rpartition("#")
|
60
|
+
else
|
61
|
+
route_path = arg.to_s
|
62
|
+
partition = route_path.rpartition("/")
|
63
|
+
end
|
64
|
+
[route_path, partition]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module SimpleController
|
2
|
+
class Router
|
3
|
+
class Route
|
4
|
+
attr_reader :controller_name, :action_name
|
5
|
+
attr_accessor :controller_name_block
|
6
|
+
|
7
|
+
def initialize(controller_name, action_name)
|
8
|
+
@controller_name, @action_name = controller_name, action_name
|
9
|
+
end
|
10
|
+
|
11
|
+
def controller(controller_name_block=nil)
|
12
|
+
controller_name_block ? controller_name_block.call(controller_name) : "#{controller_name}_controller".classify.constantize
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(params, controller_name_block=nil)
|
16
|
+
controller(controller_name_block).call action_name, params
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'simple_controller/router/mapper'
|
2
|
+
|
3
|
+
module SimpleController
|
4
|
+
class Router
|
5
|
+
attr_reader :route_mapping, :route, :route_path, :controller_name_block
|
6
|
+
|
7
|
+
include ActiveSupport::Callbacks
|
8
|
+
define_callbacks :call
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@route_mapping = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(route_path, params={})
|
15
|
+
@route_path = route_path.to_s
|
16
|
+
@route = @route_mapping[@route_path]
|
17
|
+
|
18
|
+
raise "#{self.class} route for '#{@route_path}' not found" unless route
|
19
|
+
|
20
|
+
run_callbacks(:call) do
|
21
|
+
@route.call params, controller_name_block
|
22
|
+
end
|
23
|
+
ensure
|
24
|
+
@route_path = nil
|
25
|
+
@route = nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def route_paths
|
29
|
+
route_mapping.keys
|
30
|
+
end
|
31
|
+
|
32
|
+
def draw(&block)
|
33
|
+
mapper = Mapper.new(self)
|
34
|
+
mapper.instance_eval(&block)
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_route(route_path, route)
|
38
|
+
@route_mapping[route_path] = route
|
39
|
+
end
|
40
|
+
|
41
|
+
def parse_controller_name(&block)
|
42
|
+
@controller_name_block = block
|
43
|
+
end
|
44
|
+
|
45
|
+
class << self
|
46
|
+
def instance
|
47
|
+
@instance ||= new
|
48
|
+
end
|
49
|
+
|
50
|
+
def call(*args)
|
51
|
+
instance.call(*args)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/simple_controller.rb
CHANGED
@@ -5,11 +5,13 @@ require "simple_controller/version"
|
|
5
5
|
|
6
6
|
require 'active_support/callbacks'
|
7
7
|
require 'active_support/hash_with_indifferent_access'
|
8
|
+
require 'active_support/inflector'
|
8
9
|
|
9
10
|
if autoload && defined?(Rails)
|
10
11
|
require 'simple_controller/engine'
|
11
12
|
else
|
12
13
|
require 'simple_controller/base'
|
14
|
+
require 'simple_controller/router'
|
13
15
|
end
|
14
16
|
|
15
17
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_controller
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steve Chung
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -42,9 +42,12 @@ files:
|
|
42
42
|
- bin/setup
|
43
43
|
- lib/simple_controller.rb
|
44
44
|
- lib/simple_controller/base.rb
|
45
|
-
- lib/simple_controller/callbacks.rb
|
46
|
-
- lib/simple_controller/core.rb
|
45
|
+
- lib/simple_controller/base/callbacks.rb
|
46
|
+
- lib/simple_controller/base/core.rb
|
47
47
|
- lib/simple_controller/engine.rb
|
48
|
+
- lib/simple_controller/router.rb
|
49
|
+
- lib/simple_controller/router/mapper.rb
|
50
|
+
- lib/simple_controller/router/route.rb
|
48
51
|
- lib/simple_controller/version.rb
|
49
52
|
- simple_controller.gemspec
|
50
53
|
homepage: https://github.com/FinalCAD/simple_controller
|
@@ -1,188 +0,0 @@
|
|
1
|
-
# based on: https://github.com/rails/rails/blob/d2876141d08341ec67cf6a11a073d1acfb920de7/actionpack/lib/abstract_controller/callbacks.rb
|
2
|
-
module SimpleController
|
3
|
-
module Callbacks
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
# Uses ActiveSupport::Callbacks as the base functionality. For
|
7
|
-
# more details on the whole callback system, read the documentation
|
8
|
-
# for ActiveSupport::Callbacks.
|
9
|
-
include ActiveSupport::Callbacks
|
10
|
-
|
11
|
-
included do
|
12
|
-
define_callbacks :call_action
|
13
|
-
end
|
14
|
-
|
15
|
-
# Override SimpleController::Base's call to run the
|
16
|
-
# call callbacks around the normal behavior.
|
17
|
-
def call_action(*args)
|
18
|
-
run_callbacks(:call_action) do
|
19
|
-
super
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
module ClassMethods
|
24
|
-
# If +:only+ or +:except+ are used, convert the options into the
|
25
|
-
# +:if+ and +:unless+ options of ActiveSupport::Callbacks.
|
26
|
-
#
|
27
|
-
# The basic idea is that <tt>:only => :index</tt> gets converted to
|
28
|
-
# <tt>:if => proc {|c| c.action_name == "index" }</tt>.
|
29
|
-
#
|
30
|
-
# Note that <tt>:only</tt> has priority over <tt>:if</tt> in case they
|
31
|
-
# are used together.
|
32
|
-
#
|
33
|
-
# only: :index, if: -> { true } # the :if option will be ignored.
|
34
|
-
#
|
35
|
-
# Note that <tt>:if</tt> has priority over <tt>:except</tt> in case they
|
36
|
-
# are used together.
|
37
|
-
#
|
38
|
-
# except: :index, if: -> { true } # the :except option will be ignored.
|
39
|
-
#
|
40
|
-
# ==== Options
|
41
|
-
# * <tt>only</tt> - The callback should be run only for this action
|
42
|
-
# * <tt>except</tt> - The callback should be run for all actions except this action
|
43
|
-
def _normalize_callback_options(options)
|
44
|
-
_normalize_callback_option(options, :only, :if)
|
45
|
-
_normalize_callback_option(options, :except, :unless)
|
46
|
-
end
|
47
|
-
|
48
|
-
def _normalize_callback_option(options, from, to) # :nodoc:
|
49
|
-
if from = options[from]
|
50
|
-
from = Array(from).map {|o| "action_name == '#{o}'"}.join(" || ")
|
51
|
-
options[to] = Array(options[to]).unshift(from)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
# Take callback names and an optional callback proc, normalize them,
|
56
|
-
# then call the block with each callback. This allows us to abstract
|
57
|
-
# the normalization across several methods that use it.
|
58
|
-
#
|
59
|
-
# ==== Parameters
|
60
|
-
# * <tt>callbacks</tt> - An array of callbacks, with an optional
|
61
|
-
# options hash as the last parameter.
|
62
|
-
# * <tt>block</tt> - A proc that should be added to the callbacks.
|
63
|
-
#
|
64
|
-
# ==== Block Parameters
|
65
|
-
# * <tt>name</tt> - The callback to be added
|
66
|
-
# * <tt>options</tt> - A hash of options to be used when adding the callback
|
67
|
-
def _insert_callbacks(callbacks, block = nil)
|
68
|
-
options = callbacks.extract_options!
|
69
|
-
_normalize_callback_options(options)
|
70
|
-
callbacks.push(block) if block
|
71
|
-
callbacks.each do |callback|
|
72
|
-
yield callback, options
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
##
|
77
|
-
# :method: before_action
|
78
|
-
#
|
79
|
-
# :call-seq: before_action(names, block)
|
80
|
-
#
|
81
|
-
# Append a callback before actions. See _insert_callbacks for parameter details.
|
82
|
-
|
83
|
-
##
|
84
|
-
# :method: prepend_before_action
|
85
|
-
#
|
86
|
-
# :call-seq: prepend_before_action(names, block)
|
87
|
-
#
|
88
|
-
# Prepend a callback before actions. See _insert_callbacks for parameter details.
|
89
|
-
|
90
|
-
##
|
91
|
-
# :method: skip_before_action
|
92
|
-
#
|
93
|
-
# :call-seq: skip_before_action(names)
|
94
|
-
#
|
95
|
-
# Skip a callback before actions. See _insert_callbacks for parameter details.
|
96
|
-
|
97
|
-
##
|
98
|
-
# :method: append_before_action
|
99
|
-
#
|
100
|
-
# :call-seq: append_before_action(names, block)
|
101
|
-
#
|
102
|
-
# Append a callback before actions. See _insert_callbacks for parameter details.
|
103
|
-
|
104
|
-
##
|
105
|
-
# :method: after_action
|
106
|
-
#
|
107
|
-
# :call-seq: after_action(names, block)
|
108
|
-
#
|
109
|
-
# Append a callback after actions. See _insert_callbacks for parameter details.
|
110
|
-
|
111
|
-
##
|
112
|
-
# :method: prepend_after_action
|
113
|
-
#
|
114
|
-
# :call-seq: prepend_after_action(names, block)
|
115
|
-
#
|
116
|
-
# Prepend a callback after actions. See _insert_callbacks for parameter details.
|
117
|
-
|
118
|
-
##
|
119
|
-
# :method: skip_after_action
|
120
|
-
#
|
121
|
-
# :call-seq: skip_after_action(names)
|
122
|
-
#
|
123
|
-
# Skip a callback after actions. See _insert_callbacks for parameter details.
|
124
|
-
|
125
|
-
##
|
126
|
-
# :method: append_after_action
|
127
|
-
#
|
128
|
-
# :call-seq: append_after_action(names, block)
|
129
|
-
#
|
130
|
-
# Append a callback after actions. See _insert_callbacks for parameter details.
|
131
|
-
|
132
|
-
##
|
133
|
-
# :method: around_action
|
134
|
-
#
|
135
|
-
# :call-seq: around_action(names, block)
|
136
|
-
#
|
137
|
-
# Append a callback around actions. See _insert_callbacks for parameter details.
|
138
|
-
|
139
|
-
##
|
140
|
-
# :method: prepend_around_action
|
141
|
-
#
|
142
|
-
# :call-seq: prepend_around_action(names, block)
|
143
|
-
#
|
144
|
-
# Prepend a callback around actions. See _insert_callbacks for parameter details.
|
145
|
-
|
146
|
-
##
|
147
|
-
# :method: skip_around_action
|
148
|
-
#
|
149
|
-
# :call-seq: skip_around_action(names)
|
150
|
-
#
|
151
|
-
# Skip a callback around actions. See _insert_callbacks for parameter details.
|
152
|
-
|
153
|
-
##
|
154
|
-
# :method: append_around_action
|
155
|
-
#
|
156
|
-
# :call-seq: append_around_action(names, block)
|
157
|
-
#
|
158
|
-
# Append a callback around actions. See _insert_callbacks for parameter details.
|
159
|
-
|
160
|
-
# set up before_action, prepend_before_action, skip_before_action, etc.
|
161
|
-
# for each of before, after, and around.
|
162
|
-
[:before, :after, :around].each do |callback|
|
163
|
-
define_method "#{callback}_action" do |*names, &blk|
|
164
|
-
_insert_callbacks(names, blk) do |name, options|
|
165
|
-
set_callback(:call_action, callback, name, options)
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
define_method "prepend_#{callback}_action" do |*names, &blk|
|
170
|
-
_insert_callbacks(names, blk) do |name, options|
|
171
|
-
set_callback(:call_action, callback, name, options.merge(:prepend => true))
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
# Skip a before, after or around callback. See _insert_callbacks
|
176
|
-
# for details on the allowed parameters.
|
177
|
-
define_method "skip_#{callback}_action" do |*names|
|
178
|
-
_insert_callbacks(names) do |name, options|
|
179
|
-
skip_callback(:call_action, callback, name, options)
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
# *_action is the same as append_*_action
|
184
|
-
alias_method :"append_#{callback}_action", :"#{callback}_action"
|
185
|
-
end
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module SimpleController
|
2
|
-
module Core
|
3
|
-
extend ActiveSupport::Concern
|
4
|
-
|
5
|
-
included do
|
6
|
-
attr_reader :params, :action_name
|
7
|
-
end
|
8
|
-
|
9
|
-
def call(action_name, params={})
|
10
|
-
@params ||= ActiveSupport::HashWithIndifferentAccess.new(params)
|
11
|
-
@action_name ||= action_name.to_s
|
12
|
-
|
13
|
-
call_action
|
14
|
-
end
|
15
|
-
|
16
|
-
protected
|
17
|
-
|
18
|
-
def call_action
|
19
|
-
public_send action_name
|
20
|
-
end
|
21
|
-
|
22
|
-
module ClassMethods
|
23
|
-
def call(*args)
|
24
|
-
new.call *args
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|