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.

Files changed (244) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +412 -503
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +11 -294
  5. data/lib/abstract_controller/asset_paths.rb +2 -2
  6. data/lib/abstract_controller/base.rb +52 -18
  7. data/lib/abstract_controller/callbacks.rb +87 -89
  8. data/lib/abstract_controller/collector.rb +17 -3
  9. data/lib/abstract_controller/helpers.rb +41 -14
  10. data/lib/abstract_controller/logger.rb +1 -2
  11. data/lib/abstract_controller/railties/routes_helpers.rb +3 -3
  12. data/lib/abstract_controller/rendering.rb +65 -118
  13. data/lib/abstract_controller/translation.rb +16 -1
  14. data/lib/abstract_controller/url_for.rb +7 -7
  15. data/lib/abstract_controller.rb +2 -10
  16. data/lib/action_controller/base.rb +61 -28
  17. data/lib/action_controller/caching/fragments.rb +30 -54
  18. data/lib/action_controller/caching.rb +38 -35
  19. data/lib/action_controller/log_subscriber.rb +35 -18
  20. data/lib/action_controller/metal/conditional_get.rb +103 -34
  21. data/lib/action_controller/metal/data_streaming.rb +20 -26
  22. data/lib/action_controller/metal/etag_with_template_digest.rb +50 -0
  23. data/lib/action_controller/metal/exceptions.rb +19 -6
  24. data/lib/action_controller/metal/flash.rb +41 -9
  25. data/lib/action_controller/metal/force_ssl.rb +70 -12
  26. data/lib/action_controller/metal/head.rb +30 -7
  27. data/lib/action_controller/metal/helpers.rb +11 -11
  28. data/lib/action_controller/metal/hide_actions.rb +0 -1
  29. data/lib/action_controller/metal/http_authentication.rb +140 -94
  30. data/lib/action_controller/metal/implicit_render.rb +1 -1
  31. data/lib/action_controller/metal/instrumentation.rb +11 -7
  32. data/lib/action_controller/metal/live.rb +328 -0
  33. data/lib/action_controller/metal/mime_responds.rb +161 -152
  34. data/lib/action_controller/metal/params_wrapper.rb +126 -81
  35. data/lib/action_controller/metal/rack_delegation.rb +10 -4
  36. data/lib/action_controller/metal/redirecting.rb +44 -41
  37. data/lib/action_controller/metal/renderers.rb +48 -19
  38. data/lib/action_controller/metal/rendering.rb +46 -11
  39. data/lib/action_controller/metal/request_forgery_protection.rb +250 -29
  40. data/lib/action_controller/metal/streaming.rb +30 -38
  41. data/lib/action_controller/metal/strong_parameters.rb +669 -0
  42. data/lib/action_controller/metal/testing.rb +12 -18
  43. data/lib/action_controller/metal/url_for.rb +31 -29
  44. data/lib/action_controller/metal.rb +31 -40
  45. data/lib/action_controller/model_naming.rb +12 -0
  46. data/lib/action_controller/railtie.rb +38 -18
  47. data/lib/action_controller/railties/helpers.rb +22 -0
  48. data/lib/action_controller/test_case.rb +359 -173
  49. data/lib/action_controller.rb +9 -16
  50. data/lib/action_dispatch/http/cache.rb +64 -11
  51. data/lib/action_dispatch/http/filter_parameters.rb +20 -10
  52. data/lib/action_dispatch/http/filter_redirect.rb +38 -0
  53. data/lib/action_dispatch/http/headers.rb +85 -17
  54. data/lib/action_dispatch/http/mime_negotiation.rb +55 -5
  55. data/lib/action_dispatch/http/mime_type.rb +167 -114
  56. data/lib/action_dispatch/http/mime_types.rb +2 -1
  57. data/lib/action_dispatch/http/parameter_filter.rb +44 -46
  58. data/lib/action_dispatch/http/parameters.rb +30 -46
  59. data/lib/action_dispatch/http/rack_cache.rb +2 -3
  60. data/lib/action_dispatch/http/request.rb +108 -45
  61. data/lib/action_dispatch/http/response.rb +247 -48
  62. data/lib/action_dispatch/http/upload.rb +60 -29
  63. data/lib/action_dispatch/http/url.rb +135 -45
  64. data/lib/action_dispatch/journey/backwards.rb +5 -0
  65. data/lib/action_dispatch/journey/formatter.rb +166 -0
  66. data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
  67. data/lib/action_dispatch/journey/gtg/simulator.rb +47 -0
  68. data/lib/action_dispatch/journey/gtg/transition_table.rb +157 -0
  69. data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
  70. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  71. data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
  72. data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
  73. data/lib/action_dispatch/journey/nodes/node.rb +128 -0
  74. data/lib/action_dispatch/journey/parser.rb +198 -0
  75. data/lib/action_dispatch/journey/parser.y +49 -0
  76. data/lib/action_dispatch/journey/parser_extras.rb +23 -0
  77. data/lib/action_dispatch/journey/path/pattern.rb +193 -0
  78. data/lib/action_dispatch/journey/route.rb +125 -0
  79. data/lib/action_dispatch/journey/router/strexp.rb +27 -0
  80. data/lib/action_dispatch/journey/router/utils.rb +93 -0
  81. data/lib/action_dispatch/journey/router.rb +144 -0
  82. data/lib/action_dispatch/journey/routes.rb +80 -0
  83. data/lib/action_dispatch/journey/scanner.rb +61 -0
  84. data/lib/action_dispatch/journey/visitors.rb +221 -0
  85. data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
  86. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  87. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  88. data/lib/action_dispatch/journey.rb +5 -0
  89. data/lib/action_dispatch/middleware/callbacks.rb +16 -11
  90. data/lib/action_dispatch/middleware/cookies.rb +346 -125
  91. data/lib/action_dispatch/middleware/debug_exceptions.rb +52 -24
  92. data/lib/action_dispatch/middleware/exception_wrapper.rb +75 -9
  93. data/lib/action_dispatch/middleware/flash.rb +85 -72
  94. data/lib/action_dispatch/middleware/params_parser.rb +16 -31
  95. data/lib/action_dispatch/middleware/public_exceptions.rb +39 -14
  96. data/lib/action_dispatch/middleware/reloader.rb +16 -7
  97. data/lib/action_dispatch/middleware/remote_ip.rb +132 -40
  98. data/lib/action_dispatch/middleware/request_id.rb +3 -7
  99. data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
  100. data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
  101. data/lib/action_dispatch/middleware/session/cookie_store.rb +84 -29
  102. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
  103. data/lib/action_dispatch/middleware/show_exceptions.rb +15 -44
  104. data/lib/action_dispatch/middleware/ssl.rb +72 -0
  105. data/lib/action_dispatch/middleware/stack.rb +6 -1
  106. data/lib/action_dispatch/middleware/static.rb +80 -23
  107. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +34 -0
  108. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
  109. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +27 -0
  110. data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
  111. data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
  112. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +16 -0
  113. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
  114. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +133 -5
  115. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
  116. data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
  117. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
  118. data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
  119. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
  120. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
  121. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
  122. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
  123. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  124. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +200 -0
  125. data/lib/action_dispatch/railtie.rb +19 -6
  126. data/lib/action_dispatch/request/session.rb +193 -0
  127. data/lib/action_dispatch/request/utils.rb +35 -0
  128. data/lib/action_dispatch/routing/endpoint.rb +10 -0
  129. data/lib/action_dispatch/routing/inspector.rb +234 -0
  130. data/lib/action_dispatch/routing/mapper.rb +897 -436
  131. data/lib/action_dispatch/routing/polymorphic_routes.rb +213 -92
  132. data/lib/action_dispatch/routing/redirection.rb +97 -37
  133. data/lib/action_dispatch/routing/route_set.rb +432 -239
  134. data/lib/action_dispatch/routing/routes_proxy.rb +7 -4
  135. data/lib/action_dispatch/routing/url_for.rb +63 -34
  136. data/lib/action_dispatch/routing.rb +57 -89
  137. data/lib/action_dispatch/testing/assertions/dom.rb +2 -36
  138. data/lib/action_dispatch/testing/assertions/response.rb +24 -38
  139. data/lib/action_dispatch/testing/assertions/routing.rb +55 -54
  140. data/lib/action_dispatch/testing/assertions/selector.rb +2 -434
  141. data/lib/action_dispatch/testing/assertions/tag.rb +2 -137
  142. data/lib/action_dispatch/testing/assertions.rb +11 -7
  143. data/lib/action_dispatch/testing/integration.rb +88 -72
  144. data/lib/action_dispatch/testing/test_process.rb +9 -6
  145. data/lib/action_dispatch/testing/test_request.rb +13 -9
  146. data/lib/action_dispatch/testing/test_response.rb +1 -5
  147. data/lib/action_dispatch.rb +24 -21
  148. data/lib/action_pack/gem_version.rb +15 -0
  149. data/lib/action_pack/version.rb +5 -7
  150. data/lib/action_pack.rb +1 -1
  151. metadata +181 -292
  152. data/lib/abstract_controller/layouts.rb +0 -423
  153. data/lib/abstract_controller/view_paths.rb +0 -96
  154. data/lib/action_controller/caching/actions.rb +0 -185
  155. data/lib/action_controller/caching/pages.rb +0 -187
  156. data/lib/action_controller/caching/sweeping.rb +0 -97
  157. data/lib/action_controller/deprecated/integration_test.rb +0 -2
  158. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  159. data/lib/action_controller/deprecated.rb +0 -3
  160. data/lib/action_controller/metal/compatibility.rb +0 -65
  161. data/lib/action_controller/metal/responder.rb +0 -286
  162. data/lib/action_controller/metal/session_management.rb +0 -14
  163. data/lib/action_controller/railties/paths.rb +0 -25
  164. data/lib/action_controller/record_identifier.rb +0 -85
  165. data/lib/action_controller/vendor/html-scanner/html/document.rb +0 -68
  166. data/lib/action_controller/vendor/html-scanner/html/node.rb +0 -532
  167. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +0 -177
  168. data/lib/action_controller/vendor/html-scanner/html/selector.rb +0 -830
  169. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +0 -107
  170. data/lib/action_controller/vendor/html-scanner/html/version.rb +0 -11
  171. data/lib/action_controller/vendor/html-scanner.rb +0 -20
  172. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  173. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  174. data/lib/action_dispatch/middleware/head.rb +0 -18
  175. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  176. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +0 -31
  177. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -26
  178. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +0 -10
  179. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -2
  180. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +0 -15
  181. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -17
  182. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +0 -2
  183. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  184. data/lib/action_view/asset_paths.rb +0 -142
  185. data/lib/action_view/base.rb +0 -220
  186. data/lib/action_view/buffers.rb +0 -43
  187. data/lib/action_view/context.rb +0 -36
  188. data/lib/action_view/flows.rb +0 -79
  189. data/lib/action_view/helpers/active_model_helper.rb +0 -50
  190. data/lib/action_view/helpers/asset_paths.rb +0 -7
  191. data/lib/action_view/helpers/asset_tag_helper.rb +0 -457
  192. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  193. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  194. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  195. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  196. data/lib/action_view/helpers/atom_feed_helper.rb +0 -200
  197. data/lib/action_view/helpers/cache_helper.rb +0 -64
  198. data/lib/action_view/helpers/capture_helper.rb +0 -203
  199. data/lib/action_view/helpers/controller_helper.rb +0 -25
  200. data/lib/action_view/helpers/csrf_helper.rb +0 -32
  201. data/lib/action_view/helpers/date_helper.rb +0 -1062
  202. data/lib/action_view/helpers/debug_helper.rb +0 -40
  203. data/lib/action_view/helpers/form_helper.rb +0 -1486
  204. data/lib/action_view/helpers/form_options_helper.rb +0 -658
  205. data/lib/action_view/helpers/form_tag_helper.rb +0 -685
  206. data/lib/action_view/helpers/javascript_helper.rb +0 -110
  207. data/lib/action_view/helpers/number_helper.rb +0 -622
  208. data/lib/action_view/helpers/output_safety_helper.rb +0 -38
  209. data/lib/action_view/helpers/record_tag_helper.rb +0 -111
  210. data/lib/action_view/helpers/rendering_helper.rb +0 -90
  211. data/lib/action_view/helpers/sanitize_helper.rb +0 -259
  212. data/lib/action_view/helpers/tag_helper.rb +0 -160
  213. data/lib/action_view/helpers/text_helper.rb +0 -426
  214. data/lib/action_view/helpers/translation_helper.rb +0 -91
  215. data/lib/action_view/helpers/url_helper.rb +0 -693
  216. data/lib/action_view/helpers.rb +0 -60
  217. data/lib/action_view/locale/en.yml +0 -160
  218. data/lib/action_view/log_subscriber.rb +0 -28
  219. data/lib/action_view/lookup_context.rb +0 -254
  220. data/lib/action_view/path_set.rb +0 -89
  221. data/lib/action_view/railtie.rb +0 -55
  222. data/lib/action_view/renderer/abstract_renderer.rb +0 -41
  223. data/lib/action_view/renderer/partial_renderer.rb +0 -415
  224. data/lib/action_view/renderer/renderer.rb +0 -54
  225. data/lib/action_view/renderer/streaming_template_renderer.rb +0 -106
  226. data/lib/action_view/renderer/template_renderer.rb +0 -94
  227. data/lib/action_view/template/error.rb +0 -128
  228. data/lib/action_view/template/handlers/builder.rb +0 -26
  229. data/lib/action_view/template/handlers/erb.rb +0 -125
  230. data/lib/action_view/template/handlers.rb +0 -50
  231. data/lib/action_view/template/resolver.rb +0 -272
  232. data/lib/action_view/template/text.rb +0 -30
  233. data/lib/action_view/template.rb +0 -337
  234. data/lib/action_view/test_case.rb +0 -245
  235. data/lib/action_view/testing/resolvers.rb +0 -50
  236. data/lib/action_view.rb +0 -84
  237. data/lib/sprockets/assets.rake +0 -99
  238. data/lib/sprockets/bootstrap.rb +0 -37
  239. data/lib/sprockets/compressors.rb +0 -83
  240. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  241. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  242. data/lib/sprockets/helpers.rb +0 -6
  243. data/lib/sprockets/railtie.rb +0 -62
  244. 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, :terminator => "response_body"
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, action_name) do
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
- # primitive form (:per_key) used by ActiveSupport::Callbacks.
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" }, but that the
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
- if only = options[:only]
35
- only = Array(only).map {|o| "action_name == '#{o}'"}.join(" || ")
36
- options[:per_key] = {:if => only}
37
- end
38
- if except = options[:except]
39
- except = Array(except).map {|e| "action_name == '#{e}'"}.join(" || ")
40
- options[:per_key] = {:unless => except}
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 filters matching any of the names
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 #skip_filter
51
- def skip_filter(*names, &blk)
52
- skip_before_filter(*names)
53
- skip_after_filter(*names)
54
- skip_around_filter(*names)
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.last.is_a?(Hash) ? callbacks.pop : {}
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: before_filter
81
+ # :method: before_action
80
82
  #
81
- # :call-seq: before_filter(names, block)
83
+ # :call-seq: before_action(names, block)
82
84
  #
83
- # Append a before filter. See _insert_callbacks for parameter details.
85
+ # Append a callback before actions. See _insert_callbacks for parameter details.
84
86
 
85
87
  ##
86
- # :method: prepend_before_filter
88
+ # :method: prepend_before_action
87
89
  #
88
- # :call-seq: prepend_before_filter(names, block)
90
+ # :call-seq: prepend_before_action(names, block)
89
91
  #
90
- # Prepend a before filter. See _insert_callbacks for parameter details.
92
+ # Prepend a callback before actions. See _insert_callbacks for parameter details.
91
93
 
92
94
  ##
93
- # :method: skip_before_filter
95
+ # :method: skip_before_action
94
96
  #
95
- # :call-seq: skip_before_filter(names, block)
97
+ # :call-seq: skip_before_action(names)
96
98
  #
97
- # Skip a before filter. See _insert_callbacks for parameter details.
99
+ # Skip a callback before actions. See _insert_callbacks for parameter details.
98
100
 
99
101
  ##
100
- # :method: append_before_filter
102
+ # :method: append_before_action
101
103
  #
102
- # :call-seq: append_before_filter(names, block)
104
+ # :call-seq: append_before_action(names, block)
103
105
  #
104
- # Append a before filter. See _insert_callbacks for parameter details.
106
+ # Append a callback before actions. See _insert_callbacks for parameter details.
105
107
 
106
108
  ##
107
- # :method: after_filter
109
+ # :method: after_action
108
110
  #
109
- # :call-seq: after_filter(names, block)
111
+ # :call-seq: after_action(names, block)
110
112
  #
111
- # Append an after filter. See _insert_callbacks for parameter details.
113
+ # Append a callback after actions. See _insert_callbacks for parameter details.
112
114
 
113
115
  ##
114
- # :method: prepend_after_filter
116
+ # :method: prepend_after_action
115
117
  #
116
- # :call-seq: prepend_after_filter(names, block)
118
+ # :call-seq: prepend_after_action(names, block)
117
119
  #
118
- # Prepend an after filter. See _insert_callbacks for parameter details.
120
+ # Prepend a callback after actions. See _insert_callbacks for parameter details.
119
121
 
120
122
  ##
121
- # :method: skip_after_filter
123
+ # :method: skip_after_action
122
124
  #
123
- # :call-seq: skip_after_filter(names, block)
125
+ # :call-seq: skip_after_action(names)
124
126
  #
125
- # Skip an after filter. See _insert_callbacks for parameter details.
127
+ # Skip a callback after actions. See _insert_callbacks for parameter details.
126
128
 
127
129
  ##
128
- # :method: append_after_filter
130
+ # :method: append_after_action
129
131
  #
130
- # :call-seq: append_after_filter(names, block)
132
+ # :call-seq: append_after_action(names, block)
131
133
  #
132
- # Append an after filter. See _insert_callbacks for parameter details.
134
+ # Append a callback after actions. See _insert_callbacks for parameter details.
133
135
 
134
136
  ##
135
- # :method: around_filter
137
+ # :method: around_action
136
138
  #
137
- # :call-seq: around_filter(names, block)
139
+ # :call-seq: around_action(names, block)
138
140
  #
139
- # Append an around filter. See _insert_callbacks for parameter details.
141
+ # Append a callback around actions. See _insert_callbacks for parameter details.
140
142
 
141
143
  ##
142
- # :method: prepend_around_filter
144
+ # :method: prepend_around_action
143
145
  #
144
- # :call-seq: prepend_around_filter(names, block)
146
+ # :call-seq: prepend_around_action(names, block)
145
147
  #
146
- # Prepend an around filter. See _insert_callbacks for parameter details.
148
+ # Prepend a callback around actions. See _insert_callbacks for parameter details.
147
149
 
148
150
  ##
149
- # :method: skip_around_filter
151
+ # :method: skip_around_action
150
152
  #
151
- # :call-seq: skip_around_filter(names, block)
153
+ # :call-seq: skip_around_action(names)
152
154
  #
153
- # Skip an around filter. See _insert_callbacks for parameter details.
155
+ # Skip a callback around actions. See _insert_callbacks for parameter details.
154
156
 
155
157
  ##
156
- # :method: append_around_filter
158
+ # :method: append_around_action
157
159
  #
158
- # :call-seq: append_around_filter(names, block)
160
+ # :call-seq: append_around_action(names, block)
159
161
  #
160
- # Append an around filter. See _insert_callbacks for parameter details.
162
+ # Append a callback around actions. See _insert_callbacks for parameter details.
161
163
 
162
- # set up before_filter, prepend_before_filter, skip_before_filter, etc.
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 |filter|
165
- class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
166
- # Append a before, after or around filter. See _insert_callbacks
167
- # for details on the allowed parameters.
168
- def #{filter}_filter(*names, &blk) # def before_filter(*names, &blk)
169
- _insert_callbacks(names, blk) do |name, options| # _insert_callbacks(names, blk) do |name, options|
170
- options[:if] = (Array.wrap(options[:if]) << "!halted") if #{filter == :after} # options[:if] = (Array.wrap(options[:if]) << "!halted") if false
171
- set_callback(:process_action, :#{filter}, name, options) # set_callback(:process_action, :before, name, options)
172
- end # end
173
- end # end
174
-
175
- # Prepend a before, after or around filter. See _insert_callbacks
176
- # for details on the allowed parameters.
177
- def prepend_#{filter}_filter(*names, &blk) # def prepend_before_filter(*names, &blk)
178
- _insert_callbacks(names, blk) do |name, options| # _insert_callbacks(names, blk) do |name, options|
179
- options[:if] = (Array.wrap(options[:if]) << "!halted") if #{filter == :after} # options[:if] = (Array.wrap(options[:if]) << "!halted") if false
180
- set_callback(:process_action, :#{filter}, name, options.merge(:prepend => true)) # set_callback(:process_action, :before, name, options.merge(:prepend => true))
181
- end # end
182
- end # end
183
-
184
- # Skip a before, after or around filter. See _insert_callbacks
185
- # for details on the allowed parameters.
186
- def skip_#{filter}_filter(*names, &blk) # def skip_before_filter(*names, &blk)
187
- _insert_callbacks(names, blk) do |name, options| # _insert_callbacks(names, blk) do |name, options|
188
- skip_callback(:process_action, :#{filter}, name, options) # skip_callback(:process_action, :before, name, options)
189
- end # end
190
- end # end
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.to_s.upcase
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
- mime_constant = Mime.const_get(symbol.to_s.upcase)
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.find_by_id(session[:user])
46
+ # @current_user ||= User.find_by(id: session[:user])
33
47
  # end
34
48
  #
35
- # def logged_in?
36
- # current_user != nil
37
- # end
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
- # ==== Parameters
62
- # * <tt>*args</tt> - Module, Symbol, String, :all
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
- # and "foo_bar_helper.rb" is loaded using require_dependency.
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
- require_dependency(file_name, "Missing helper file helpers/%s.rb")
136
- file_name.camelize.constantize
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,8 +1,7 @@
1
- require "active_support/core_ext/logger"
2
1
  require "active_support/benchmarkable"
3
2
 
4
3
  module AbstractController
5
- module Logger
4
+ module Logger #:nodoc:
6
5
  extend ActiveSupport::Concern
7
6
 
8
7
  included do
@@ -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