actionpack 3.2.19 → 4.0.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.
Files changed (263) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +850 -401
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +5 -288
  5. data/lib/abstract_controller/asset_paths.rb +2 -2
  6. data/lib/abstract_controller/base.rb +39 -37
  7. data/lib/abstract_controller/callbacks.rb +101 -82
  8. data/lib/abstract_controller/collector.rb +7 -3
  9. data/lib/abstract_controller/helpers.rb +25 -13
  10. data/lib/abstract_controller/layouts.rb +74 -74
  11. data/lib/abstract_controller/logger.rb +1 -2
  12. data/lib/abstract_controller/rendering.rb +30 -13
  13. data/lib/abstract_controller/translation.rb +16 -1
  14. data/lib/abstract_controller/url_for.rb +6 -6
  15. data/lib/abstract_controller/view_paths.rb +1 -1
  16. data/lib/abstract_controller.rb +1 -8
  17. data/lib/action_controller/base.rb +46 -22
  18. data/lib/action_controller/caching/fragments.rb +23 -53
  19. data/lib/action_controller/caching.rb +46 -33
  20. data/lib/action_controller/deprecated/integration_test.rb +3 -0
  21. data/lib/action_controller/deprecated.rb +5 -1
  22. data/lib/action_controller/log_subscriber.rb +16 -8
  23. data/lib/action_controller/metal/conditional_get.rb +76 -32
  24. data/lib/action_controller/metal/data_streaming.rb +20 -26
  25. data/lib/action_controller/metal/exceptions.rb +19 -6
  26. data/lib/action_controller/metal/flash.rb +24 -9
  27. data/lib/action_controller/metal/force_ssl.rb +70 -12
  28. data/lib/action_controller/metal/head.rb +25 -4
  29. data/lib/action_controller/metal/helpers.rb +5 -9
  30. data/lib/action_controller/metal/hide_actions.rb +0 -1
  31. data/lib/action_controller/metal/http_authentication.rb +107 -83
  32. data/lib/action_controller/metal/implicit_render.rb +1 -1
  33. data/lib/action_controller/metal/instrumentation.rb +2 -1
  34. data/lib/action_controller/metal/live.rb +175 -0
  35. data/lib/action_controller/metal/mime_responds.rb +161 -47
  36. data/lib/action_controller/metal/params_wrapper.rb +112 -74
  37. data/lib/action_controller/metal/rack_delegation.rb +9 -3
  38. data/lib/action_controller/metal/redirecting.rb +15 -20
  39. data/lib/action_controller/metal/renderers.rb +11 -9
  40. data/lib/action_controller/metal/rendering.rb +9 -1
  41. data/lib/action_controller/metal/request_forgery_protection.rb +112 -19
  42. data/lib/action_controller/metal/responder.rb +20 -19
  43. data/lib/action_controller/metal/streaming.rb +12 -18
  44. data/lib/action_controller/metal/strong_parameters.rb +520 -0
  45. data/lib/action_controller/metal/testing.rb +13 -18
  46. data/lib/action_controller/metal/url_for.rb +28 -25
  47. data/lib/action_controller/metal.rb +17 -32
  48. data/lib/action_controller/model_naming.rb +12 -0
  49. data/lib/action_controller/railtie.rb +33 -17
  50. data/lib/action_controller/railties/helpers.rb +22 -0
  51. data/lib/action_controller/record_identifier.rb +18 -72
  52. data/lib/action_controller/test_case.rb +251 -131
  53. data/lib/action_controller/vendor/html-scanner.rb +4 -19
  54. data/lib/action_controller.rb +15 -6
  55. data/lib/action_dispatch/http/cache.rb +63 -11
  56. data/lib/action_dispatch/http/filter_parameters.rb +18 -8
  57. data/lib/action_dispatch/http/filter_redirect.rb +37 -0
  58. data/lib/action_dispatch/http/headers.rb +49 -17
  59. data/lib/action_dispatch/http/mime_negotiation.rb +24 -1
  60. data/lib/action_dispatch/http/mime_type.rb +154 -100
  61. data/lib/action_dispatch/http/mime_types.rb +1 -1
  62. data/lib/action_dispatch/http/parameter_filter.rb +44 -46
  63. data/lib/action_dispatch/http/parameters.rb +28 -28
  64. data/lib/action_dispatch/http/rack_cache.rb +2 -3
  65. data/lib/action_dispatch/http/request.rb +64 -18
  66. data/lib/action_dispatch/http/response.rb +130 -35
  67. data/lib/action_dispatch/http/upload.rb +63 -20
  68. data/lib/action_dispatch/http/url.rb +98 -35
  69. data/lib/action_dispatch/journey/backwards.rb +5 -0
  70. data/lib/action_dispatch/journey/formatter.rb +146 -0
  71. data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
  72. data/lib/action_dispatch/journey/gtg/simulator.rb +44 -0
  73. data/lib/action_dispatch/journey/gtg/transition_table.rb +156 -0
  74. data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
  75. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  76. data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
  77. data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
  78. data/lib/action_dispatch/journey/nodes/node.rb +124 -0
  79. data/lib/action_dispatch/journey/parser.rb +206 -0
  80. data/lib/action_dispatch/journey/parser.y +47 -0
  81. data/lib/action_dispatch/journey/parser_extras.rb +23 -0
  82. data/lib/action_dispatch/journey/path/pattern.rb +196 -0
  83. data/lib/action_dispatch/journey/route.rb +124 -0
  84. data/lib/action_dispatch/journey/router/strexp.rb +24 -0
  85. data/lib/action_dispatch/journey/router/utils.rb +54 -0
  86. data/lib/action_dispatch/journey/router.rb +166 -0
  87. data/lib/action_dispatch/journey/routes.rb +75 -0
  88. data/lib/action_dispatch/journey/scanner.rb +61 -0
  89. data/lib/action_dispatch/journey/visitors.rb +197 -0
  90. data/lib/action_dispatch/journey/visualizer/fsm.css +34 -0
  91. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  92. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  93. data/lib/action_dispatch/journey.rb +5 -0
  94. data/lib/action_dispatch/middleware/callbacks.rb +9 -4
  95. data/lib/action_dispatch/middleware/cookies.rb +259 -114
  96. data/lib/action_dispatch/middleware/debug_exceptions.rb +26 -17
  97. data/lib/action_dispatch/middleware/exception_wrapper.rb +29 -3
  98. data/lib/action_dispatch/middleware/flash.rb +58 -58
  99. data/lib/action_dispatch/middleware/params_parser.rb +14 -29
  100. data/lib/action_dispatch/middleware/public_exceptions.rb +30 -14
  101. data/lib/action_dispatch/middleware/reloader.rb +6 -6
  102. data/lib/action_dispatch/middleware/remote_ip.rb +145 -39
  103. data/lib/action_dispatch/middleware/request_id.rb +2 -6
  104. data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
  105. data/lib/action_dispatch/middleware/session/cookie_store.rb +82 -28
  106. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
  107. data/lib/action_dispatch/middleware/show_exceptions.rb +12 -45
  108. data/lib/action_dispatch/middleware/ssl.rb +70 -0
  109. data/lib/action_dispatch/middleware/stack.rb +6 -1
  110. data/lib/action_dispatch/middleware/static.rb +2 -1
  111. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +14 -11
  112. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +25 -0
  113. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +7 -9
  114. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +15 -9
  115. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +127 -5
  116. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +7 -2
  117. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +30 -15
  118. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +39 -13
  119. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +6 -2
  120. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  121. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +144 -0
  122. data/lib/action_dispatch/railtie.rb +16 -6
  123. data/lib/action_dispatch/request/session.rb +181 -0
  124. data/lib/action_dispatch/routing/inspector.rb +240 -0
  125. data/lib/action_dispatch/routing/mapper.rb +540 -291
  126. data/lib/action_dispatch/routing/polymorphic_routes.rb +16 -20
  127. data/lib/action_dispatch/routing/redirection.rb +46 -29
  128. data/lib/action_dispatch/routing/route_set.rb +207 -164
  129. data/lib/action_dispatch/routing/routes_proxy.rb +2 -0
  130. data/lib/action_dispatch/routing/url_for.rb +48 -33
  131. data/lib/action_dispatch/routing.rb +48 -83
  132. data/lib/action_dispatch/testing/assertions/dom.rb +3 -13
  133. data/lib/action_dispatch/testing/assertions/response.rb +32 -40
  134. data/lib/action_dispatch/testing/assertions/routing.rb +42 -41
  135. data/lib/action_dispatch/testing/assertions/selector.rb +17 -22
  136. data/lib/action_dispatch/testing/assertions/tag.rb +20 -23
  137. data/lib/action_dispatch/testing/integration.rb +65 -51
  138. data/lib/action_dispatch/testing/test_process.rb +9 -6
  139. data/lib/action_dispatch/testing/test_request.rb +7 -3
  140. data/lib/action_dispatch.rb +21 -15
  141. data/lib/action_pack/version.rb +7 -6
  142. data/lib/action_pack.rb +1 -1
  143. data/lib/action_view/base.rb +15 -34
  144. data/lib/action_view/buffers.rb +7 -1
  145. data/lib/action_view/context.rb +4 -4
  146. data/lib/action_view/dependency_tracker.rb +93 -0
  147. data/lib/action_view/digestor.rb +85 -0
  148. data/lib/action_view/flows.rb +1 -4
  149. data/lib/action_view/helpers/active_model_helper.rb +3 -4
  150. data/lib/action_view/helpers/asset_tag_helper.rb +215 -352
  151. data/lib/action_view/helpers/asset_url_helper.rb +355 -0
  152. data/lib/action_view/helpers/atom_feed_helper.rb +13 -10
  153. data/lib/action_view/helpers/cache_helper.rb +150 -18
  154. data/lib/action_view/helpers/capture_helper.rb +44 -31
  155. data/lib/action_view/helpers/csrf_helper.rb +0 -2
  156. data/lib/action_view/helpers/date_helper.rb +269 -248
  157. data/lib/action_view/helpers/debug_helper.rb +10 -11
  158. data/lib/action_view/helpers/form_helper.rb +931 -537
  159. data/lib/action_view/helpers/form_options_helper.rb +341 -166
  160. data/lib/action_view/helpers/form_tag_helper.rb +190 -90
  161. data/lib/action_view/helpers/javascript_helper.rb +23 -16
  162. data/lib/action_view/helpers/number_helper.rb +148 -329
  163. data/lib/action_view/helpers/output_safety_helper.rb +3 -3
  164. data/lib/action_view/helpers/record_tag_helper.rb +17 -22
  165. data/lib/action_view/helpers/rendering_helper.rb +2 -2
  166. data/lib/action_view/helpers/sanitize_helper.rb +3 -6
  167. data/lib/action_view/helpers/tag_helper.rb +46 -33
  168. data/lib/action_view/helpers/tags/base.rb +147 -0
  169. data/lib/action_view/helpers/tags/check_box.rb +64 -0
  170. data/lib/action_view/helpers/tags/checkable.rb +16 -0
  171. data/lib/action_view/helpers/tags/collection_check_boxes.rb +43 -0
  172. data/lib/action_view/helpers/tags/collection_helpers.rb +83 -0
  173. data/lib/action_view/helpers/tags/collection_radio_buttons.rb +36 -0
  174. data/lib/action_view/helpers/tags/collection_select.rb +28 -0
  175. data/lib/action_view/helpers/tags/color_field.rb +25 -0
  176. data/lib/action_view/helpers/tags/date_field.rb +13 -0
  177. data/lib/action_view/helpers/tags/date_select.rb +72 -0
  178. data/lib/action_view/helpers/tags/datetime_field.rb +22 -0
  179. data/lib/action_view/helpers/tags/datetime_local_field.rb +19 -0
  180. data/lib/action_view/helpers/tags/datetime_select.rb +8 -0
  181. data/lib/action_view/helpers/tags/email_field.rb +8 -0
  182. data/lib/action_view/helpers/tags/file_field.rb +8 -0
  183. data/lib/action_view/helpers/tags/grouped_collection_select.rb +29 -0
  184. data/lib/action_view/helpers/tags/hidden_field.rb +8 -0
  185. data/lib/action_view/helpers/tags/label.rb +65 -0
  186. data/lib/action_view/helpers/tags/month_field.rb +13 -0
  187. data/lib/action_view/helpers/tags/number_field.rb +18 -0
  188. data/lib/action_view/helpers/tags/password_field.rb +12 -0
  189. data/lib/action_view/helpers/tags/radio_button.rb +31 -0
  190. data/lib/action_view/helpers/tags/range_field.rb +8 -0
  191. data/lib/action_view/helpers/tags/search_field.rb +24 -0
  192. data/lib/action_view/helpers/tags/select.rb +40 -0
  193. data/lib/action_view/helpers/tags/tel_field.rb +8 -0
  194. data/lib/action_view/helpers/tags/text_area.rb +18 -0
  195. data/lib/action_view/helpers/tags/text_field.rb +29 -0
  196. data/lib/action_view/helpers/tags/time_field.rb +13 -0
  197. data/lib/action_view/helpers/tags/time_select.rb +8 -0
  198. data/lib/action_view/helpers/tags/time_zone_select.rb +20 -0
  199. data/lib/action_view/helpers/tags/url_field.rb +8 -0
  200. data/lib/action_view/helpers/tags/week_field.rb +13 -0
  201. data/lib/action_view/helpers/tags.rb +39 -0
  202. data/lib/action_view/helpers/text_helper.rb +130 -114
  203. data/lib/action_view/helpers/translation_helper.rb +32 -16
  204. data/lib/action_view/helpers/url_helper.rb +211 -270
  205. data/lib/action_view/helpers.rb +2 -4
  206. data/lib/action_view/locale/en.yml +1 -105
  207. data/lib/action_view/log_subscriber.rb +6 -4
  208. data/lib/action_view/lookup_context.rb +15 -28
  209. data/lib/action_view/model_naming.rb +12 -0
  210. data/lib/action_view/path_set.rb +8 -20
  211. data/lib/action_view/railtie.rb +6 -22
  212. data/lib/action_view/record_identifier.rb +84 -0
  213. data/lib/action_view/renderer/abstract_renderer.rb +25 -19
  214. data/lib/action_view/renderer/partial_renderer.rb +158 -81
  215. data/lib/action_view/renderer/renderer.rb +8 -12
  216. data/lib/action_view/renderer/streaming_template_renderer.rb +2 -5
  217. data/lib/action_view/renderer/template_renderer.rb +12 -10
  218. data/lib/action_view/routing_url_for.rb +107 -0
  219. data/lib/action_view/template/error.rb +22 -12
  220. data/lib/action_view/template/handlers/builder.rb +1 -1
  221. data/lib/action_view/template/handlers/erb.rb +40 -19
  222. data/lib/action_view/template/handlers/raw.rb +11 -0
  223. data/lib/action_view/template/handlers.rb +12 -9
  224. data/lib/action_view/template/resolver.rb +107 -53
  225. data/lib/action_view/template/text.rb +12 -8
  226. data/lib/action_view/template/types.rb +57 -0
  227. data/lib/action_view/template.rb +25 -23
  228. data/lib/action_view/test_case.rb +67 -42
  229. data/lib/{action_controller → action_view}/vendor/html-scanner/html/document.rb +0 -0
  230. data/lib/{action_controller → action_view}/vendor/html-scanner/html/node.rb +12 -12
  231. data/lib/{action_controller → action_view}/vendor/html-scanner/html/sanitizer.rb +13 -2
  232. data/lib/{action_controller → action_view}/vendor/html-scanner/html/selector.rb +9 -9
  233. data/lib/{action_controller → action_view}/vendor/html-scanner/html/tokenizer.rb +1 -1
  234. data/lib/{action_controller → action_view}/vendor/html-scanner/html/version.rb +0 -0
  235. data/lib/action_view/vendor/html-scanner.rb +20 -0
  236. data/lib/action_view.rb +17 -8
  237. metadata +184 -214
  238. data/lib/action_controller/caching/actions.rb +0 -185
  239. data/lib/action_controller/caching/pages.rb +0 -187
  240. data/lib/action_controller/caching/sweeping.rb +0 -97
  241. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  242. data/lib/action_controller/metal/compatibility.rb +0 -65
  243. data/lib/action_controller/metal/session_management.rb +0 -14
  244. data/lib/action_controller/railties/paths.rb +0 -25
  245. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  246. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  247. data/lib/action_dispatch/middleware/head.rb +0 -18
  248. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  249. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  250. data/lib/action_view/asset_paths.rb +0 -142
  251. data/lib/action_view/helpers/asset_paths.rb +0 -7
  252. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  253. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  254. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  255. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  256. data/lib/sprockets/assets.rake +0 -99
  257. data/lib/sprockets/bootstrap.rb +0 -37
  258. data/lib/sprockets/compressors.rb +0 -83
  259. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  260. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  261. data/lib/sprockets/helpers.rb +0 -6
  262. data/lib/sprockets/railtie.rb +0 -62
  263. data/lib/sprockets/static_compiler.rb +0 -56
@@ -8,52 +8,54 @@ 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, :terminator => "response_body", :skip_after_callbacks_if_terminated => true
12
12
  end
13
13
 
14
14
  # Override AbstractController::Base's process_action to run the
15
15
  # process_action callbacks around the normal behavior.
16
16
  def process_action(*args)
17
- run_callbacks(:process_action, action_name) do
17
+ run_callbacks(:process_action) do
18
18
  super
19
19
  end
20
20
  end
21
21
 
22
22
  module ClassMethods
23
23
  # If :only or :except are used, convert the options into the
24
- # primitive form (:per_key) used by ActiveSupport::Callbacks.
24
+ # :unless and :if options of ActiveSupport::Callbacks.
25
25
  # 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.
26
+ # :if => proc {|c| c.action_name == "index" }.
29
27
  #
30
28
  # ==== Options
31
29
  # * <tt>only</tt> - The callback should be run only for this action
32
30
  # * <tt>except</tt> - The callback should be run for all actions except this action
33
31
  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}
32
+ _normalize_callback_option(options, :only, :if)
33
+ _normalize_callback_option(options, :except, :unless)
34
+ end
35
+
36
+ def _normalize_callback_option(options, from, to) # :nodoc:
37
+ if from = options[from]
38
+ from = Array(from).map {|o| "action_name == '#{o}'"}.join(" || ")
39
+ options[to] = Array(options[to]) << from
41
40
  end
42
41
  end
43
42
 
44
- # Skip before, after, and around filters matching any of the names
43
+ # Skip before, after, and around action callbacks matching any of the names
44
+ # Aliased as skip_filter.
45
45
  #
46
46
  # ==== Parameters
47
47
  # * <tt>names</tt> - A list of valid names that could be used for
48
48
  # callbacks. Note that skipping uses Ruby equality, so it's
49
49
  # impossible to skip a callback defined using an anonymous proc
50
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
+ def skip_action_callback(*names)
52
+ skip_before_action(*names)
53
+ skip_after_action(*names)
54
+ skip_around_action(*names)
55
55
  end
56
56
 
57
+ alias_method :skip_filter, :skip_action_callback
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
59
61
  # the normalization across several methods that use it.
@@ -66,7 +68,7 @@ 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)
71
+ def _insert_callbacks(callbacks, block = nil)
70
72
  options = callbacks.last.is_a?(Hash) ? callbacks.pop : {}
71
73
  _normalize_callback_options(options)
72
74
  callbacks.push(block) if block
@@ -76,121 +78,138 @@ 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.
86
+ # Aliased as before_filter.
84
87
 
85
88
  ##
86
- # :method: prepend_before_filter
89
+ # :method: prepend_before_action
87
90
  #
88
- # :call-seq: prepend_before_filter(names, block)
91
+ # :call-seq: prepend_before_action(names, block)
89
92
  #
90
- # Prepend a before filter. See _insert_callbacks for parameter details.
93
+ # Prepend a callback before actions. See _insert_callbacks for parameter details.
94
+ # Aliased as prepend_before_filter.
91
95
 
92
96
  ##
93
- # :method: skip_before_filter
97
+ # :method: skip_before_action
94
98
  #
95
- # :call-seq: skip_before_filter(names, block)
99
+ # :call-seq: skip_before_action(names)
96
100
  #
97
- # Skip a before filter. See _insert_callbacks for parameter details.
101
+ # Skip a callback before actions. See _insert_callbacks for parameter details.
102
+ # Aliased as skip_before_filter.
98
103
 
99
104
  ##
100
- # :method: append_before_filter
105
+ # :method: append_before_action
101
106
  #
102
- # :call-seq: append_before_filter(names, block)
107
+ # :call-seq: append_before_action(names, block)
103
108
  #
104
- # Append a before filter. See _insert_callbacks for parameter details.
109
+ # Append a callback before actions. See _insert_callbacks for parameter details.
110
+ # Aliased as append_before_filter.
105
111
 
106
112
  ##
107
- # :method: after_filter
113
+ # :method: after_action
108
114
  #
109
- # :call-seq: after_filter(names, block)
115
+ # :call-seq: after_action(names, block)
110
116
  #
111
- # Append an after filter. See _insert_callbacks for parameter details.
117
+ # Append a callback after actions. See _insert_callbacks for parameter details.
118
+ # Aliased as after_filter.
112
119
 
113
120
  ##
114
- # :method: prepend_after_filter
121
+ # :method: prepend_after_action
115
122
  #
116
- # :call-seq: prepend_after_filter(names, block)
123
+ # :call-seq: prepend_after_action(names, block)
117
124
  #
118
- # Prepend an after filter. See _insert_callbacks for parameter details.
125
+ # Prepend a callback after actions. See _insert_callbacks for parameter details.
126
+ # Aliased as prepend_after_filter.
119
127
 
120
128
  ##
121
- # :method: skip_after_filter
129
+ # :method: skip_after_action
122
130
  #
123
- # :call-seq: skip_after_filter(names, block)
131
+ # :call-seq: skip_after_action(names)
124
132
  #
125
- # Skip an after filter. See _insert_callbacks for parameter details.
133
+ # Skip a callback after actions. See _insert_callbacks for parameter details.
134
+ # Aliased as skip_after_filter.
126
135
 
127
136
  ##
128
- # :method: append_after_filter
137
+ # :method: append_after_action
129
138
  #
130
- # :call-seq: append_after_filter(names, block)
139
+ # :call-seq: append_after_action(names, block)
131
140
  #
132
- # Append an after filter. See _insert_callbacks for parameter details.
141
+ # Append a callback after actions. See _insert_callbacks for parameter details.
142
+ # Aliased as append_after_filter.
133
143
 
134
144
  ##
135
- # :method: around_filter
145
+ # :method: around_action
136
146
  #
137
- # :call-seq: around_filter(names, block)
147
+ # :call-seq: around_action(names, block)
138
148
  #
139
- # Append an around filter. See _insert_callbacks for parameter details.
149
+ # Append a callback around actions. See _insert_callbacks for parameter details.
150
+ # Aliased as around_filter.
140
151
 
141
152
  ##
142
- # :method: prepend_around_filter
153
+ # :method: prepend_around_action
143
154
  #
144
- # :call-seq: prepend_around_filter(names, block)
155
+ # :call-seq: prepend_around_action(names, block)
145
156
  #
146
- # Prepend an around filter. See _insert_callbacks for parameter details.
157
+ # Prepend a callback around actions. See _insert_callbacks for parameter details.
158
+ # Aliased as prepend_around_filter.
147
159
 
148
160
  ##
149
- # :method: skip_around_filter
161
+ # :method: skip_around_action
150
162
  #
151
- # :call-seq: skip_around_filter(names, block)
163
+ # :call-seq: skip_around_action(names)
152
164
  #
153
- # Skip an around filter. See _insert_callbacks for parameter details.
165
+ # Skip a callback around actions. See _insert_callbacks for parameter details.
166
+ # Aliased as skip_around_filter.
154
167
 
155
168
  ##
156
- # :method: append_around_filter
169
+ # :method: append_around_action
157
170
  #
158
- # :call-seq: append_around_filter(names, block)
171
+ # :call-seq: append_around_action(names, block)
159
172
  #
160
- # Append an around filter. See _insert_callbacks for parameter details.
173
+ # Append a callback around actions. See _insert_callbacks for parameter details.
174
+ # Aliased as append_around_filter.
161
175
 
162
- # set up before_filter, prepend_before_filter, skip_before_filter, etc.
176
+ # set up before_action, prepend_before_action, skip_before_action, etc.
163
177
  # for each of before, after, and around.
164
- [:before, :after, :around].each do |filter|
178
+ [:before, :after, :around].each do |callback|
165
179
  class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
166
- # Append a before, after or around filter. See _insert_callbacks
180
+ # Append a before, after or around callback. See _insert_callbacks
167
181
  # 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
182
+ def #{callback}_action(*names, &blk) # def before_action(*names, &blk)
183
+ _insert_callbacks(names, blk) do |name, options| # _insert_callbacks(names, blk) do |name, options|
184
+ set_callback(:process_action, :#{callback}, name, options) # set_callback(:process_action, :before, name, options)
185
+ end # end
186
+ end # end
187
+
188
+ alias_method :#{callback}_filter, :#{callback}_action
189
+
190
+ # Prepend a before, after or around callback. See _insert_callbacks
176
191
  # 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
192
+ def prepend_#{callback}_action(*names, &blk) # def prepend_before_action(*names, &blk)
193
+ _insert_callbacks(names, blk) do |name, options| # _insert_callbacks(names, blk) do |name, options|
194
+ set_callback(:process_action, :#{callback}, name, options.merge(:prepend => true)) # set_callback(:process_action, :before, name, options.merge(:prepend => true))
195
+ end # end
196
+ end # end
197
+
198
+ alias_method :prepend_#{callback}_filter, :prepend_#{callback}_action
199
+
200
+ # Skip a before, after or around callback. See _insert_callbacks
185
201
  # 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
202
+ def skip_#{callback}_action(*names) # def skip_before_action(*names)
203
+ _insert_callbacks(names) do |name, options| # _insert_callbacks(names) do |name, options|
204
+ skip_callback(:process_action, :#{callback}, name, options) # skip_callback(:process_action, :before, name, options)
205
+ end # end
206
+ end # end
207
+
208
+ alias_method :skip_#{callback}_filter, :skip_#{callback}_action
209
+
210
+ # *_action is the same as append_*_action
211
+ alias_method :append_#{callback}_action, :#{callback}_action # alias_method :append_before_action, :before_action
212
+ alias_method :append_#{callback}_filter, :#{callback}_action # alias_method :append_before_filter, :before_action
194
213
  RUBY_EVAL
195
214
  end
196
215
  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,14 @@ 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
+ mime_constant = Mime.const_get(symbol.upcase)
23
27
 
24
28
  if Mime::SET.include?(mime_constant)
25
29
  AbstractController::Collector.generate_method_for_mime(mime_constant)
@@ -29,4 +33,4 @@ module AbstractController
29
33
  end
30
34
  end
31
35
  end
32
- end
36
+ end
@@ -19,7 +19,7 @@ module AbstractController
19
19
  def inherited(klass)
20
20
  helpers = _helpers
21
21
  klass._helpers = Module.new { include helpers }
22
- klass.class_eval { default_helper_module! unless anonymous? }
22
+ klass.class_eval { default_helper_module! } unless klass.anonymous?
23
23
  super
24
24
  end
25
25
 
@@ -29,12 +29,12 @@ module AbstractController
29
29
  # helper_method :current_user, :logged_in?
30
30
  #
31
31
  # def current_user
32
- # @current_user ||= User.find_by_id(session[:user])
32
+ # @current_user ||= User.find_by(id: session[:user])
33
33
  # end
34
34
  #
35
- # def logged_in?
36
- # current_user != nil
37
- # end
35
+ # def logged_in?
36
+ # current_user != nil
37
+ # end
38
38
  # end
39
39
  #
40
40
  # In a view:
@@ -49,20 +49,19 @@ module AbstractController
49
49
 
50
50
  meths.each do |meth|
51
51
  _helpers.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1
52
- def #{meth}(*args, &blk)
53
- controller.send(%(#{meth}), *args, &blk)
54
- end
52
+ def #{meth}(*args, &blk) # def current_user(*args, &blk)
53
+ controller.send(%(#{meth}), *args, &blk) # controller.send(:current_user, *args, &blk)
54
+ end # end
55
55
  ruby_eval
56
56
  end
57
57
  end
58
58
 
59
59
  # The +helper+ class method can take a series of helper module names, a block, or both.
60
60
  #
61
- # ==== Parameters
62
- # * <tt>*args</tt> - Module, Symbol, String, :all
61
+ # ==== Options
62
+ # * <tt>*args</tt> - Module, Symbol, String
63
63
  # * <tt>block</tt> - A block defining helper methods
64
64
  #
65
- # ==== Examples
66
65
  # When the argument is a module it will be included directly in the template class.
67
66
  # helper FooHelper # => includes FooHelper
68
67
  #
@@ -114,7 +113,7 @@ module AbstractController
114
113
  # helpers with the following behavior:
115
114
  #
116
115
  # String or Symbol:: :FooBar or "FooBar" becomes "foo_bar_helper",
117
- # and "foo_bar_helper.rb" is loaded using require_dependency.
116
+ # and "foo_bar_helper.rb" is loaded using require_dependency.
118
117
  #
119
118
  # Module:: No further processing
120
119
  #
@@ -132,7 +131,11 @@ module AbstractController
132
131
  case arg
133
132
  when String, Symbol
134
133
  file_name = "#{arg.to_s.underscore}_helper"
135
- require_dependency(file_name, "Missing helper file helpers/%s.rb")
134
+ begin
135
+ require_dependency(file_name)
136
+ rescue LoadError => e
137
+ raise MissingHelperError.new(e, file_name)
138
+ end
136
139
  file_name.camelize.constantize
137
140
  when Module
138
141
  arg
@@ -142,6 +145,15 @@ module AbstractController
142
145
  end
143
146
  end
144
147
 
148
+ class MissingHelperError < LoadError
149
+ def initialize(error, path)
150
+ @error = error
151
+ @path = "helpers/#{path}.rb"
152
+ set_backtrace error.backtrace
153
+ super("Missing helper file helpers/%s.rb" % path)
154
+ end
155
+ end
156
+
145
157
  private
146
158
  # Makes all the (instance) methods in the helper module available to templates
147
159
  # rendered through this controller.