actionpack 3.2.19 → 4.2.11.3
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of actionpack might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/CHANGELOG.md +412 -503
- data/MIT-LICENSE +1 -1
- data/README.rdoc +11 -294
- data/lib/abstract_controller/asset_paths.rb +2 -2
- data/lib/abstract_controller/base.rb +52 -18
- data/lib/abstract_controller/callbacks.rb +87 -89
- data/lib/abstract_controller/collector.rb +17 -3
- data/lib/abstract_controller/helpers.rb +41 -14
- data/lib/abstract_controller/logger.rb +1 -2
- data/lib/abstract_controller/railties/routes_helpers.rb +3 -3
- data/lib/abstract_controller/rendering.rb +65 -118
- data/lib/abstract_controller/translation.rb +16 -1
- data/lib/abstract_controller/url_for.rb +7 -7
- data/lib/abstract_controller.rb +2 -10
- data/lib/action_controller/base.rb +61 -28
- data/lib/action_controller/caching/fragments.rb +30 -54
- data/lib/action_controller/caching.rb +38 -35
- data/lib/action_controller/log_subscriber.rb +35 -18
- data/lib/action_controller/metal/conditional_get.rb +103 -34
- data/lib/action_controller/metal/data_streaming.rb +20 -26
- data/lib/action_controller/metal/etag_with_template_digest.rb +50 -0
- data/lib/action_controller/metal/exceptions.rb +19 -6
- data/lib/action_controller/metal/flash.rb +41 -9
- data/lib/action_controller/metal/force_ssl.rb +70 -12
- data/lib/action_controller/metal/head.rb +30 -7
- data/lib/action_controller/metal/helpers.rb +11 -11
- data/lib/action_controller/metal/hide_actions.rb +0 -1
- data/lib/action_controller/metal/http_authentication.rb +140 -94
- data/lib/action_controller/metal/implicit_render.rb +1 -1
- data/lib/action_controller/metal/instrumentation.rb +11 -7
- data/lib/action_controller/metal/live.rb +328 -0
- data/lib/action_controller/metal/mime_responds.rb +161 -152
- data/lib/action_controller/metal/params_wrapper.rb +126 -81
- data/lib/action_controller/metal/rack_delegation.rb +10 -4
- data/lib/action_controller/metal/redirecting.rb +44 -41
- data/lib/action_controller/metal/renderers.rb +48 -19
- data/lib/action_controller/metal/rendering.rb +46 -11
- data/lib/action_controller/metal/request_forgery_protection.rb +250 -29
- data/lib/action_controller/metal/streaming.rb +30 -38
- data/lib/action_controller/metal/strong_parameters.rb +669 -0
- data/lib/action_controller/metal/testing.rb +12 -18
- data/lib/action_controller/metal/url_for.rb +31 -29
- data/lib/action_controller/metal.rb +31 -40
- data/lib/action_controller/model_naming.rb +12 -0
- data/lib/action_controller/railtie.rb +38 -18
- data/lib/action_controller/railties/helpers.rb +22 -0
- data/lib/action_controller/test_case.rb +359 -173
- data/lib/action_controller.rb +9 -16
- data/lib/action_dispatch/http/cache.rb +64 -11
- data/lib/action_dispatch/http/filter_parameters.rb +20 -10
- data/lib/action_dispatch/http/filter_redirect.rb +38 -0
- data/lib/action_dispatch/http/headers.rb +85 -17
- data/lib/action_dispatch/http/mime_negotiation.rb +55 -5
- data/lib/action_dispatch/http/mime_type.rb +167 -114
- data/lib/action_dispatch/http/mime_types.rb +2 -1
- data/lib/action_dispatch/http/parameter_filter.rb +44 -46
- data/lib/action_dispatch/http/parameters.rb +30 -46
- data/lib/action_dispatch/http/rack_cache.rb +2 -3
- data/lib/action_dispatch/http/request.rb +108 -45
- data/lib/action_dispatch/http/response.rb +247 -48
- data/lib/action_dispatch/http/upload.rb +60 -29
- data/lib/action_dispatch/http/url.rb +135 -45
- data/lib/action_dispatch/journey/backwards.rb +5 -0
- data/lib/action_dispatch/journey/formatter.rb +166 -0
- data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
- data/lib/action_dispatch/journey/gtg/simulator.rb +47 -0
- data/lib/action_dispatch/journey/gtg/transition_table.rb +157 -0
- data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
- data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
- data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
- data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
- data/lib/action_dispatch/journey/nodes/node.rb +128 -0
- data/lib/action_dispatch/journey/parser.rb +198 -0
- data/lib/action_dispatch/journey/parser.y +49 -0
- data/lib/action_dispatch/journey/parser_extras.rb +23 -0
- data/lib/action_dispatch/journey/path/pattern.rb +193 -0
- data/lib/action_dispatch/journey/route.rb +125 -0
- data/lib/action_dispatch/journey/router/strexp.rb +27 -0
- data/lib/action_dispatch/journey/router/utils.rb +93 -0
- data/lib/action_dispatch/journey/router.rb +144 -0
- data/lib/action_dispatch/journey/routes.rb +80 -0
- data/lib/action_dispatch/journey/scanner.rb +61 -0
- data/lib/action_dispatch/journey/visitors.rb +221 -0
- data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
- data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
- data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
- data/lib/action_dispatch/journey.rb +5 -0
- data/lib/action_dispatch/middleware/callbacks.rb +16 -11
- data/lib/action_dispatch/middleware/cookies.rb +346 -125
- data/lib/action_dispatch/middleware/debug_exceptions.rb +52 -24
- data/lib/action_dispatch/middleware/exception_wrapper.rb +75 -9
- data/lib/action_dispatch/middleware/flash.rb +85 -72
- data/lib/action_dispatch/middleware/params_parser.rb +16 -31
- data/lib/action_dispatch/middleware/public_exceptions.rb +39 -14
- data/lib/action_dispatch/middleware/reloader.rb +16 -7
- data/lib/action_dispatch/middleware/remote_ip.rb +132 -40
- data/lib/action_dispatch/middleware/request_id.rb +3 -7
- data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
- data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
- data/lib/action_dispatch/middleware/session/cookie_store.rb +84 -29
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
- data/lib/action_dispatch/middleware/show_exceptions.rb +15 -44
- data/lib/action_dispatch/middleware/ssl.rb +72 -0
- data/lib/action_dispatch/middleware/stack.rb +6 -1
- data/lib/action_dispatch/middleware/static.rb +80 -23
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +34 -0
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
- data/lib/action_dispatch/middleware/templates/rescues/_source.erb +27 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +16 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +133 -5
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +200 -0
- data/lib/action_dispatch/railtie.rb +19 -6
- data/lib/action_dispatch/request/session.rb +193 -0
- data/lib/action_dispatch/request/utils.rb +35 -0
- data/lib/action_dispatch/routing/endpoint.rb +10 -0
- data/lib/action_dispatch/routing/inspector.rb +234 -0
- data/lib/action_dispatch/routing/mapper.rb +897 -436
- data/lib/action_dispatch/routing/polymorphic_routes.rb +213 -92
- data/lib/action_dispatch/routing/redirection.rb +97 -37
- data/lib/action_dispatch/routing/route_set.rb +432 -239
- data/lib/action_dispatch/routing/routes_proxy.rb +7 -4
- data/lib/action_dispatch/routing/url_for.rb +63 -34
- data/lib/action_dispatch/routing.rb +57 -89
- data/lib/action_dispatch/testing/assertions/dom.rb +2 -36
- data/lib/action_dispatch/testing/assertions/response.rb +24 -38
- data/lib/action_dispatch/testing/assertions/routing.rb +55 -54
- data/lib/action_dispatch/testing/assertions/selector.rb +2 -434
- data/lib/action_dispatch/testing/assertions/tag.rb +2 -137
- data/lib/action_dispatch/testing/assertions.rb +11 -7
- data/lib/action_dispatch/testing/integration.rb +88 -72
- data/lib/action_dispatch/testing/test_process.rb +9 -6
- data/lib/action_dispatch/testing/test_request.rb +13 -9
- data/lib/action_dispatch/testing/test_response.rb +1 -5
- data/lib/action_dispatch.rb +24 -21
- data/lib/action_pack/gem_version.rb +15 -0
- data/lib/action_pack/version.rb +5 -7
- data/lib/action_pack.rb +1 -1
- metadata +181 -292
- data/lib/abstract_controller/layouts.rb +0 -423
- data/lib/abstract_controller/view_paths.rb +0 -96
- data/lib/action_controller/caching/actions.rb +0 -185
- data/lib/action_controller/caching/pages.rb +0 -187
- data/lib/action_controller/caching/sweeping.rb +0 -97
- data/lib/action_controller/deprecated/integration_test.rb +0 -2
- data/lib/action_controller/deprecated/performance_test.rb +0 -1
- data/lib/action_controller/deprecated.rb +0 -3
- data/lib/action_controller/metal/compatibility.rb +0 -65
- data/lib/action_controller/metal/responder.rb +0 -286
- data/lib/action_controller/metal/session_management.rb +0 -14
- data/lib/action_controller/railties/paths.rb +0 -25
- data/lib/action_controller/record_identifier.rb +0 -85
- data/lib/action_controller/vendor/html-scanner/html/document.rb +0 -68
- data/lib/action_controller/vendor/html-scanner/html/node.rb +0 -532
- data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +0 -177
- data/lib/action_controller/vendor/html-scanner/html/selector.rb +0 -830
- data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +0 -107
- data/lib/action_controller/vendor/html-scanner/html/version.rb +0 -11
- data/lib/action_controller/vendor/html-scanner.rb +0 -20
- data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
- data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
- data/lib/action_dispatch/middleware/head.rb +0 -18
- data/lib/action_dispatch/middleware/rescue.rb +0 -26
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +0 -31
- data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -26
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +0 -10
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -2
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +0 -15
- data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -17
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +0 -2
- data/lib/action_dispatch/testing/performance_test.rb +0 -10
- data/lib/action_view/asset_paths.rb +0 -142
- data/lib/action_view/base.rb +0 -220
- data/lib/action_view/buffers.rb +0 -43
- data/lib/action_view/context.rb +0 -36
- data/lib/action_view/flows.rb +0 -79
- data/lib/action_view/helpers/active_model_helper.rb +0 -50
- data/lib/action_view/helpers/asset_paths.rb +0 -7
- data/lib/action_view/helpers/asset_tag_helper.rb +0 -457
- data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
- data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
- data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
- data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
- data/lib/action_view/helpers/atom_feed_helper.rb +0 -200
- data/lib/action_view/helpers/cache_helper.rb +0 -64
- data/lib/action_view/helpers/capture_helper.rb +0 -203
- data/lib/action_view/helpers/controller_helper.rb +0 -25
- data/lib/action_view/helpers/csrf_helper.rb +0 -32
- data/lib/action_view/helpers/date_helper.rb +0 -1062
- data/lib/action_view/helpers/debug_helper.rb +0 -40
- data/lib/action_view/helpers/form_helper.rb +0 -1486
- data/lib/action_view/helpers/form_options_helper.rb +0 -658
- data/lib/action_view/helpers/form_tag_helper.rb +0 -685
- data/lib/action_view/helpers/javascript_helper.rb +0 -110
- data/lib/action_view/helpers/number_helper.rb +0 -622
- data/lib/action_view/helpers/output_safety_helper.rb +0 -38
- data/lib/action_view/helpers/record_tag_helper.rb +0 -111
- data/lib/action_view/helpers/rendering_helper.rb +0 -90
- data/lib/action_view/helpers/sanitize_helper.rb +0 -259
- data/lib/action_view/helpers/tag_helper.rb +0 -160
- data/lib/action_view/helpers/text_helper.rb +0 -426
- data/lib/action_view/helpers/translation_helper.rb +0 -91
- data/lib/action_view/helpers/url_helper.rb +0 -693
- data/lib/action_view/helpers.rb +0 -60
- data/lib/action_view/locale/en.yml +0 -160
- data/lib/action_view/log_subscriber.rb +0 -28
- data/lib/action_view/lookup_context.rb +0 -254
- data/lib/action_view/path_set.rb +0 -89
- data/lib/action_view/railtie.rb +0 -55
- data/lib/action_view/renderer/abstract_renderer.rb +0 -41
- data/lib/action_view/renderer/partial_renderer.rb +0 -415
- data/lib/action_view/renderer/renderer.rb +0 -54
- data/lib/action_view/renderer/streaming_template_renderer.rb +0 -106
- data/lib/action_view/renderer/template_renderer.rb +0 -94
- data/lib/action_view/template/error.rb +0 -128
- data/lib/action_view/template/handlers/builder.rb +0 -26
- data/lib/action_view/template/handlers/erb.rb +0 -125
- data/lib/action_view/template/handlers.rb +0 -50
- data/lib/action_view/template/resolver.rb +0 -272
- data/lib/action_view/template/text.rb +0 -30
- data/lib/action_view/template.rb +0 -337
- data/lib/action_view/test_case.rb +0 -245
- data/lib/action_view/testing/resolvers.rb +0 -50
- data/lib/action_view.rb +0 -84
- data/lib/sprockets/assets.rake +0 -99
- data/lib/sprockets/bootstrap.rb +0 -37
- data/lib/sprockets/compressors.rb +0 -83
- data/lib/sprockets/helpers/isolated_helper.rb +0 -13
- data/lib/sprockets/helpers/rails_helper.rb +0 -182
- data/lib/sprockets/helpers.rb +0 -6
- data/lib/sprockets/railtie.rb +0 -62
- data/lib/sprockets/static_compiler.rb +0 -56
@@ -8,51 +8,53 @@ module AbstractController
|
|
8
8
|
include ActiveSupport::Callbacks
|
9
9
|
|
10
10
|
included do
|
11
|
-
define_callbacks :process_action,
|
11
|
+
define_callbacks :process_action,
|
12
|
+
terminator: ->(controller,_) { controller.response_body },
|
13
|
+
skip_after_callbacks_if_terminated: true
|
12
14
|
end
|
13
15
|
|
14
16
|
# Override AbstractController::Base's process_action to run the
|
15
17
|
# process_action callbacks around the normal behavior.
|
16
18
|
def process_action(*args)
|
17
|
-
run_callbacks(:process_action
|
19
|
+
run_callbacks(:process_action) do
|
18
20
|
super
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
22
24
|
module ClassMethods
|
23
25
|
# If :only or :except are used, convert the options into the
|
24
|
-
#
|
26
|
+
# :unless and :if options of ActiveSupport::Callbacks.
|
25
27
|
# The basic idea is that :only => :index gets converted to
|
26
|
-
# :if => proc {|c| c.action_name == "index" }
|
27
|
-
# proc is only evaluated once per action for the lifetime of
|
28
|
-
# a Rails process.
|
28
|
+
# :if => proc {|c| c.action_name == "index" }.
|
29
29
|
#
|
30
30
|
# ==== Options
|
31
31
|
# * <tt>only</tt> - The callback should be run only for this action
|
32
32
|
# * <tt>except</tt> - The callback should be run for all actions except this action
|
33
33
|
def _normalize_callback_options(options)
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
34
|
+
_normalize_callback_option(options, :only, :if)
|
35
|
+
_normalize_callback_option(options, :except, :unless)
|
36
|
+
end
|
37
|
+
|
38
|
+
def _normalize_callback_option(options, from, to) # :nodoc:
|
39
|
+
if from = options[from]
|
40
|
+
from = Array(from).map {|o| "action_name == '#{o}'"}.join(" || ")
|
41
|
+
options[to] = Array(options[to]).unshift(from)
|
41
42
|
end
|
42
43
|
end
|
43
44
|
|
44
|
-
# Skip before, after, and around
|
45
|
+
# Skip before, after, and around action callbacks matching any of the names.
|
45
46
|
#
|
46
47
|
# ==== Parameters
|
47
48
|
# * <tt>names</tt> - A list of valid names that could be used for
|
48
49
|
# callbacks. Note that skipping uses Ruby equality, so it's
|
49
50
|
# impossible to skip a callback defined using an anonymous proc
|
50
|
-
# using #
|
51
|
-
def
|
52
|
-
|
53
|
-
|
54
|
-
|
51
|
+
# using #skip_action_callback
|
52
|
+
def skip_action_callback(*names)
|
53
|
+
skip_before_action(*names)
|
54
|
+
skip_after_action(*names)
|
55
|
+
skip_around_action(*names)
|
55
56
|
end
|
57
|
+
alias_method :skip_filter, :skip_action_callback
|
56
58
|
|
57
59
|
# Take callback names and an optional callback proc, normalize them,
|
58
60
|
# then call the block with each callback. This allows us to abstract
|
@@ -66,8 +68,8 @@ module AbstractController
|
|
66
68
|
# ==== Block Parameters
|
67
69
|
# * <tt>name</tt> - The callback to be added
|
68
70
|
# * <tt>options</tt> - A hash of options to be used when adding the callback
|
69
|
-
def _insert_callbacks(callbacks, block)
|
70
|
-
options = callbacks.
|
71
|
+
def _insert_callbacks(callbacks, block = nil)
|
72
|
+
options = callbacks.extract_options!
|
71
73
|
_normalize_callback_options(options)
|
72
74
|
callbacks.push(block) if block
|
73
75
|
callbacks.each do |callback|
|
@@ -76,122 +78,118 @@ module AbstractController
|
|
76
78
|
end
|
77
79
|
|
78
80
|
##
|
79
|
-
# :method:
|
81
|
+
# :method: before_action
|
80
82
|
#
|
81
|
-
# :call-seq:
|
83
|
+
# :call-seq: before_action(names, block)
|
82
84
|
#
|
83
|
-
# Append a before
|
85
|
+
# Append a callback before actions. See _insert_callbacks for parameter details.
|
84
86
|
|
85
87
|
##
|
86
|
-
# :method:
|
88
|
+
# :method: prepend_before_action
|
87
89
|
#
|
88
|
-
# :call-seq:
|
90
|
+
# :call-seq: prepend_before_action(names, block)
|
89
91
|
#
|
90
|
-
# Prepend a before
|
92
|
+
# Prepend a callback before actions. See _insert_callbacks for parameter details.
|
91
93
|
|
92
94
|
##
|
93
|
-
# :method:
|
95
|
+
# :method: skip_before_action
|
94
96
|
#
|
95
|
-
# :call-seq:
|
97
|
+
# :call-seq: skip_before_action(names)
|
96
98
|
#
|
97
|
-
# Skip a before
|
99
|
+
# Skip a callback before actions. See _insert_callbacks for parameter details.
|
98
100
|
|
99
101
|
##
|
100
|
-
# :method:
|
102
|
+
# :method: append_before_action
|
101
103
|
#
|
102
|
-
# :call-seq:
|
104
|
+
# :call-seq: append_before_action(names, block)
|
103
105
|
#
|
104
|
-
# Append a before
|
106
|
+
# Append a callback before actions. See _insert_callbacks for parameter details.
|
105
107
|
|
106
108
|
##
|
107
|
-
# :method:
|
109
|
+
# :method: after_action
|
108
110
|
#
|
109
|
-
# :call-seq:
|
111
|
+
# :call-seq: after_action(names, block)
|
110
112
|
#
|
111
|
-
# Append
|
113
|
+
# Append a callback after actions. See _insert_callbacks for parameter details.
|
112
114
|
|
113
115
|
##
|
114
|
-
# :method:
|
116
|
+
# :method: prepend_after_action
|
115
117
|
#
|
116
|
-
# :call-seq:
|
118
|
+
# :call-seq: prepend_after_action(names, block)
|
117
119
|
#
|
118
|
-
# Prepend
|
120
|
+
# Prepend a callback after actions. See _insert_callbacks for parameter details.
|
119
121
|
|
120
122
|
##
|
121
|
-
# :method:
|
123
|
+
# :method: skip_after_action
|
122
124
|
#
|
123
|
-
# :call-seq:
|
125
|
+
# :call-seq: skip_after_action(names)
|
124
126
|
#
|
125
|
-
# Skip
|
127
|
+
# Skip a callback after actions. See _insert_callbacks for parameter details.
|
126
128
|
|
127
129
|
##
|
128
|
-
# :method:
|
130
|
+
# :method: append_after_action
|
129
131
|
#
|
130
|
-
# :call-seq:
|
132
|
+
# :call-seq: append_after_action(names, block)
|
131
133
|
#
|
132
|
-
# Append
|
134
|
+
# Append a callback after actions. See _insert_callbacks for parameter details.
|
133
135
|
|
134
136
|
##
|
135
|
-
# :method:
|
137
|
+
# :method: around_action
|
136
138
|
#
|
137
|
-
# :call-seq:
|
139
|
+
# :call-seq: around_action(names, block)
|
138
140
|
#
|
139
|
-
# Append
|
141
|
+
# Append a callback around actions. See _insert_callbacks for parameter details.
|
140
142
|
|
141
143
|
##
|
142
|
-
# :method:
|
144
|
+
# :method: prepend_around_action
|
143
145
|
#
|
144
|
-
# :call-seq:
|
146
|
+
# :call-seq: prepend_around_action(names, block)
|
145
147
|
#
|
146
|
-
# Prepend
|
148
|
+
# Prepend a callback around actions. See _insert_callbacks for parameter details.
|
147
149
|
|
148
150
|
##
|
149
|
-
# :method:
|
151
|
+
# :method: skip_around_action
|
150
152
|
#
|
151
|
-
# :call-seq:
|
153
|
+
# :call-seq: skip_around_action(names)
|
152
154
|
#
|
153
|
-
# Skip
|
155
|
+
# Skip a callback around actions. See _insert_callbacks for parameter details.
|
154
156
|
|
155
157
|
##
|
156
|
-
# :method:
|
158
|
+
# :method: append_around_action
|
157
159
|
#
|
158
|
-
# :call-seq:
|
160
|
+
# :call-seq: append_around_action(names, block)
|
159
161
|
#
|
160
|
-
# Append
|
162
|
+
# Append a callback around actions. See _insert_callbacks for parameter details.
|
161
163
|
|
162
|
-
# set up
|
164
|
+
# set up before_action, prepend_before_action, skip_before_action, etc.
|
163
165
|
# for each of before, after, and around.
|
164
|
-
[:before, :after, :around].each do |
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
# *_filter is the same as append_*_filter
|
193
|
-
alias_method :append_#{filter}_filter, :#{filter}_filter # alias_method :append_before_filter, :before_filter
|
194
|
-
RUBY_EVAL
|
166
|
+
[:before, :after, :around].each do |callback|
|
167
|
+
define_method "#{callback}_action" do |*names, &blk|
|
168
|
+
_insert_callbacks(names, blk) do |name, options|
|
169
|
+
set_callback(:process_action, callback, name, options)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
alias_method :"#{callback}_filter", :"#{callback}_action"
|
173
|
+
|
174
|
+
define_method "prepend_#{callback}_action" do |*names, &blk|
|
175
|
+
_insert_callbacks(names, blk) do |name, options|
|
176
|
+
set_callback(:process_action, callback, name, options.merge(:prepend => true))
|
177
|
+
end
|
178
|
+
end
|
179
|
+
alias_method :"prepend_#{callback}_filter", :"prepend_#{callback}_action"
|
180
|
+
|
181
|
+
# Skip a before, after or around callback. See _insert_callbacks
|
182
|
+
# for details on the allowed parameters.
|
183
|
+
define_method "skip_#{callback}_action" do |*names|
|
184
|
+
_insert_callbacks(names) do |name, options|
|
185
|
+
skip_callback(:process_action, callback, name, options)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
alias_method :"skip_#{callback}_filter", :"skip_#{callback}_action"
|
189
|
+
|
190
|
+
# *_action is the same as append_*_action
|
191
|
+
alias_method :"append_#{callback}_action", :"#{callback}_action"
|
192
|
+
alias_method :"append_#{callback}_filter", :"#{callback}_action"
|
195
193
|
end
|
196
194
|
end
|
197
195
|
end
|
@@ -4,7 +4,7 @@ module AbstractController
|
|
4
4
|
module Collector
|
5
5
|
def self.generate_method_for_mime(mime)
|
6
6
|
sym = mime.is_a?(Symbol) ? mime : mime.to_sym
|
7
|
-
const = sym.
|
7
|
+
const = sym.upcase
|
8
8
|
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
9
9
|
def #{sym}(*args, &block) # def html(*args, &block)
|
10
10
|
custom(Mime::#{const}, *args, &block) # custom(Mime::HTML, *args, &block)
|
@@ -16,10 +16,24 @@ module AbstractController
|
|
16
16
|
generate_method_for_mime(mime)
|
17
17
|
end
|
18
18
|
|
19
|
+
Mime::Type.register_callback do |mime|
|
20
|
+
generate_method_for_mime(mime) unless self.instance_methods.include?(mime.to_sym)
|
21
|
+
end
|
22
|
+
|
19
23
|
protected
|
20
24
|
|
21
25
|
def method_missing(symbol, &block)
|
22
|
-
|
26
|
+
const_name = symbol.upcase
|
27
|
+
|
28
|
+
unless Mime.const_defined?(const_name)
|
29
|
+
raise NoMethodError, "To respond to a custom format, register it as a MIME type first: " \
|
30
|
+
"http://guides.rubyonrails.org/action_controller_overview.html#restful-downloads. " \
|
31
|
+
"If you meant to respond to a variant like :tablet or :phone, not a custom format, " \
|
32
|
+
"be sure to nest your variant response within a format response: " \
|
33
|
+
"format.html { |html| html.tablet { ... } }"
|
34
|
+
end
|
35
|
+
|
36
|
+
mime_constant = Mime.const_get(const_name)
|
23
37
|
|
24
38
|
if Mime::SET.include?(mime_constant)
|
25
39
|
AbstractController::Collector.generate_method_for_mime(mime_constant)
|
@@ -29,4 +43,4 @@ module AbstractController
|
|
29
43
|
end
|
30
44
|
end
|
31
45
|
end
|
32
|
-
end
|
46
|
+
end
|
@@ -12,6 +12,20 @@ module AbstractController
|
|
12
12
|
self._helper_methods = Array.new
|
13
13
|
end
|
14
14
|
|
15
|
+
class MissingHelperError < LoadError
|
16
|
+
def initialize(error, path)
|
17
|
+
@error = error
|
18
|
+
@path = "helpers/#{path}.rb"
|
19
|
+
set_backtrace error.backtrace
|
20
|
+
|
21
|
+
if error.path =~ /^#{path}(\.rb)?$/
|
22
|
+
super("Missing helper file helpers/%s.rb" % path)
|
23
|
+
else
|
24
|
+
raise error
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
15
29
|
module ClassMethods
|
16
30
|
# When a class is inherited, wrap its helper module in a new module.
|
17
31
|
# This ensures that the parent class's module can be changed
|
@@ -19,7 +33,7 @@ module AbstractController
|
|
19
33
|
def inherited(klass)
|
20
34
|
helpers = _helpers
|
21
35
|
klass._helpers = Module.new { include helpers }
|
22
|
-
klass.class_eval { default_helper_module! unless anonymous?
|
36
|
+
klass.class_eval { default_helper_module! } unless klass.anonymous?
|
23
37
|
super
|
24
38
|
end
|
25
39
|
|
@@ -29,12 +43,12 @@ module AbstractController
|
|
29
43
|
# helper_method :current_user, :logged_in?
|
30
44
|
#
|
31
45
|
# def current_user
|
32
|
-
# @current_user ||= User.
|
46
|
+
# @current_user ||= User.find_by(id: session[:user])
|
33
47
|
# end
|
34
48
|
#
|
35
|
-
#
|
36
|
-
#
|
37
|
-
#
|
49
|
+
# def logged_in?
|
50
|
+
# current_user != nil
|
51
|
+
# end
|
38
52
|
# end
|
39
53
|
#
|
40
54
|
# In a view:
|
@@ -49,20 +63,19 @@ module AbstractController
|
|
49
63
|
|
50
64
|
meths.each do |meth|
|
51
65
|
_helpers.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1
|
52
|
-
def #{meth}(*args, &blk)
|
53
|
-
controller.send(%(#{meth}), *args, &blk)
|
54
|
-
end
|
66
|
+
def #{meth}(*args, &blk) # def current_user(*args, &blk)
|
67
|
+
controller.send(%(#{meth}), *args, &blk) # controller.send(:current_user, *args, &blk)
|
68
|
+
end # end
|
55
69
|
ruby_eval
|
56
70
|
end
|
57
71
|
end
|
58
72
|
|
59
73
|
# The +helper+ class method can take a series of helper module names, a block, or both.
|
60
74
|
#
|
61
|
-
# ====
|
62
|
-
# * <tt>*args</tt> - Module, Symbol, String
|
75
|
+
# ==== Options
|
76
|
+
# * <tt>*args</tt> - Module, Symbol, String
|
63
77
|
# * <tt>block</tt> - A block defining helper methods
|
64
78
|
#
|
65
|
-
# ==== Examples
|
66
79
|
# When the argument is a module it will be included directly in the template class.
|
67
80
|
# helper FooHelper # => includes FooHelper
|
68
81
|
#
|
@@ -114,7 +127,7 @@ module AbstractController
|
|
114
127
|
# helpers with the following behavior:
|
115
128
|
#
|
116
129
|
# String or Symbol:: :FooBar or "FooBar" becomes "foo_bar_helper",
|
117
|
-
#
|
130
|
+
# and "foo_bar_helper.rb" is loaded using require_dependency.
|
118
131
|
#
|
119
132
|
# Module:: No further processing
|
120
133
|
#
|
@@ -132,8 +145,22 @@ module AbstractController
|
|
132
145
|
case arg
|
133
146
|
when String, Symbol
|
134
147
|
file_name = "#{arg.to_s.underscore}_helper"
|
135
|
-
|
136
|
-
|
148
|
+
begin
|
149
|
+
require_dependency(file_name)
|
150
|
+
rescue LoadError => e
|
151
|
+
raise AbstractController::Helpers::MissingHelperError.new(e, file_name)
|
152
|
+
end
|
153
|
+
|
154
|
+
mod_name = file_name.camelize
|
155
|
+
begin
|
156
|
+
mod_name.constantize
|
157
|
+
rescue LoadError
|
158
|
+
# dependencies.rb gives a similar error message but its wording is
|
159
|
+
# not as clear because it mentions autoloading. To the user all it
|
160
|
+
# matters is that a helper module couldn't be loaded, autoloading
|
161
|
+
# is an internal mechanism that should not leak.
|
162
|
+
raise NameError, "Couldn't find #{mod_name}, expected it to be defined in helpers/#{file_name}.rb"
|
163
|
+
end
|
137
164
|
when Module
|
138
165
|
arg
|
139
166
|
else
|
@@ -1,14 +1,14 @@
|
|
1
1
|
module AbstractController
|
2
2
|
module Railties
|
3
3
|
module RoutesHelpers
|
4
|
-
def self.with(routes)
|
4
|
+
def self.with(routes, include_path_helpers = true)
|
5
5
|
Module.new do
|
6
6
|
define_method(:inherited) do |klass|
|
7
7
|
super(klass)
|
8
8
|
if namespace = klass.parents.detect { |m| m.respond_to?(:railtie_routes_url_helpers) }
|
9
|
-
klass.send(:include, namespace.railtie_routes_url_helpers)
|
9
|
+
klass.send(:include, namespace.railtie_routes_url_helpers(include_path_helpers))
|
10
10
|
else
|
11
|
-
klass.send(:include, routes.url_helpers)
|
11
|
+
klass.send(:include, routes.url_helpers(include_path_helpers))
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|