actionpack 3.2.22.5 → 4.0.0.beta1

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 (265) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +641 -418
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +5 -288
  5. data/lib/abstract_controller.rb +1 -8
  6. data/lib/abstract_controller/asset_paths.rb +2 -2
  7. data/lib/abstract_controller/base.rb +39 -37
  8. data/lib/abstract_controller/callbacks.rb +101 -82
  9. data/lib/abstract_controller/collector.rb +7 -3
  10. data/lib/abstract_controller/helpers.rb +23 -11
  11. data/lib/abstract_controller/layouts.rb +68 -73
  12. data/lib/abstract_controller/logger.rb +1 -2
  13. data/lib/abstract_controller/rendering.rb +22 -13
  14. data/lib/abstract_controller/translation.rb +16 -1
  15. data/lib/abstract_controller/url_for.rb +6 -6
  16. data/lib/abstract_controller/view_paths.rb +1 -1
  17. data/lib/action_controller.rb +15 -6
  18. data/lib/action_controller/base.rb +46 -22
  19. data/lib/action_controller/caching.rb +46 -33
  20. data/lib/action_controller/caching/fragments.rb +23 -53
  21. data/lib/action_controller/deprecated.rb +5 -1
  22. data/lib/action_controller/deprecated/integration_test.rb +3 -0
  23. data/lib/action_controller/log_subscriber.rb +11 -8
  24. data/lib/action_controller/metal.rb +16 -30
  25. data/lib/action_controller/metal/conditional_get.rb +76 -32
  26. data/lib/action_controller/metal/data_streaming.rb +20 -26
  27. data/lib/action_controller/metal/exceptions.rb +19 -6
  28. data/lib/action_controller/metal/flash.rb +24 -9
  29. data/lib/action_controller/metal/force_ssl.rb +32 -9
  30. data/lib/action_controller/metal/head.rb +25 -4
  31. data/lib/action_controller/metal/helpers.rb +6 -9
  32. data/lib/action_controller/metal/hide_actions.rb +1 -2
  33. data/lib/action_controller/metal/http_authentication.rb +105 -87
  34. data/lib/action_controller/metal/implicit_render.rb +1 -1
  35. data/lib/action_controller/metal/instrumentation.rb +2 -1
  36. data/lib/action_controller/metal/live.rb +141 -0
  37. data/lib/action_controller/metal/mime_responds.rb +161 -47
  38. data/lib/action_controller/metal/params_wrapper.rb +112 -74
  39. data/lib/action_controller/metal/rack_delegation.rb +9 -3
  40. data/lib/action_controller/metal/redirecting.rb +15 -20
  41. data/lib/action_controller/metal/renderers.rb +11 -9
  42. data/lib/action_controller/metal/rendering.rb +8 -0
  43. data/lib/action_controller/metal/request_forgery_protection.rb +112 -19
  44. data/lib/action_controller/metal/responder.rb +20 -19
  45. data/lib/action_controller/metal/streaming.rb +12 -18
  46. data/lib/action_controller/metal/strong_parameters.rb +516 -0
  47. data/lib/action_controller/metal/testing.rb +13 -18
  48. data/lib/action_controller/metal/url_for.rb +27 -25
  49. data/lib/action_controller/model_naming.rb +12 -0
  50. data/lib/action_controller/railtie.rb +33 -17
  51. data/lib/action_controller/railties/helpers.rb +22 -0
  52. data/lib/action_controller/record_identifier.rb +18 -72
  53. data/lib/action_controller/test_case.rb +215 -123
  54. data/lib/action_controller/vendor/html-scanner.rb +4 -19
  55. data/lib/action_dispatch.rb +27 -19
  56. data/lib/action_dispatch/http/cache.rb +63 -11
  57. data/lib/action_dispatch/http/filter_parameters.rb +18 -8
  58. data/lib/action_dispatch/http/filter_redirect.rb +37 -0
  59. data/lib/action_dispatch/http/headers.rb +27 -19
  60. data/lib/action_dispatch/http/mime_negotiation.rb +25 -2
  61. data/lib/action_dispatch/http/mime_type.rb +145 -113
  62. data/lib/action_dispatch/http/mime_types.rb +1 -1
  63. data/lib/action_dispatch/http/parameter_filter.rb +44 -46
  64. data/lib/action_dispatch/http/parameters.rb +12 -5
  65. data/lib/action_dispatch/http/rack_cache.rb +2 -3
  66. data/lib/action_dispatch/http/request.rb +49 -18
  67. data/lib/action_dispatch/http/response.rb +129 -35
  68. data/lib/action_dispatch/http/upload.rb +60 -17
  69. data/lib/action_dispatch/http/url.rb +53 -31
  70. data/lib/action_dispatch/journey.rb +5 -0
  71. data/lib/action_dispatch/journey/backwards.rb +5 -0
  72. data/lib/action_dispatch/journey/formatter.rb +146 -0
  73. data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
  74. data/lib/action_dispatch/journey/gtg/simulator.rb +44 -0
  75. data/lib/action_dispatch/journey/gtg/transition_table.rb +156 -0
  76. data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
  77. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  78. data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
  79. data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
  80. data/lib/action_dispatch/journey/nodes/node.rb +124 -0
  81. data/lib/action_dispatch/journey/parser.rb +206 -0
  82. data/lib/action_dispatch/journey/parser.y +47 -0
  83. data/lib/action_dispatch/journey/parser_extras.rb +23 -0
  84. data/lib/action_dispatch/journey/path/pattern.rb +196 -0
  85. data/lib/action_dispatch/journey/route.rb +116 -0
  86. data/lib/action_dispatch/journey/router.rb +164 -0
  87. data/lib/action_dispatch/journey/router/strexp.rb +24 -0
  88. data/lib/action_dispatch/journey/router/utils.rb +54 -0
  89. data/lib/action_dispatch/journey/routes.rb +75 -0
  90. data/lib/action_dispatch/journey/scanner.rb +61 -0
  91. data/lib/action_dispatch/journey/visitors.rb +189 -0
  92. data/lib/action_dispatch/journey/visualizer/fsm.css +34 -0
  93. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  94. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  95. data/lib/action_dispatch/middleware/callbacks.rb +9 -4
  96. data/lib/action_dispatch/middleware/cookies.rb +168 -57
  97. data/lib/action_dispatch/middleware/debug_exceptions.rb +26 -17
  98. data/lib/action_dispatch/middleware/exception_wrapper.rb +27 -3
  99. data/lib/action_dispatch/middleware/flash.rb +58 -58
  100. data/lib/action_dispatch/middleware/params_parser.rb +14 -29
  101. data/lib/action_dispatch/middleware/public_exceptions.rb +31 -14
  102. data/lib/action_dispatch/middleware/reloader.rb +6 -6
  103. data/lib/action_dispatch/middleware/remote_ip.rb +145 -39
  104. data/lib/action_dispatch/middleware/request_id.rb +2 -6
  105. data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
  106. data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
  107. data/lib/action_dispatch/middleware/session/cookie_store.rb +81 -7
  108. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
  109. data/lib/action_dispatch/middleware/show_exceptions.rb +12 -45
  110. data/lib/action_dispatch/middleware/ssl.rb +70 -0
  111. data/lib/action_dispatch/middleware/stack.rb +6 -1
  112. data/lib/action_dispatch/middleware/static.rb +5 -24
  113. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +14 -11
  114. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +25 -0
  115. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +3 -3
  116. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +15 -9
  117. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +121 -5
  118. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +7 -2
  119. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +30 -15
  120. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +39 -13
  121. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +6 -2
  122. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  123. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +144 -0
  124. data/lib/action_dispatch/railtie.rb +16 -6
  125. data/lib/action_dispatch/request/session.rb +181 -0
  126. data/lib/action_dispatch/routing.rb +41 -40
  127. data/lib/action_dispatch/routing/inspector.rb +240 -0
  128. data/lib/action_dispatch/routing/mapper.rb +501 -273
  129. data/lib/action_dispatch/routing/polymorphic_routes.rb +16 -20
  130. data/lib/action_dispatch/routing/redirection.rb +46 -29
  131. data/lib/action_dispatch/routing/route_set.rb +203 -164
  132. data/lib/action_dispatch/routing/routes_proxy.rb +2 -0
  133. data/lib/action_dispatch/routing/url_for.rb +48 -33
  134. data/lib/action_dispatch/testing/assertions/dom.rb +3 -13
  135. data/lib/action_dispatch/testing/assertions/response.rb +32 -40
  136. data/lib/action_dispatch/testing/assertions/routing.rb +40 -39
  137. data/lib/action_dispatch/testing/assertions/selector.rb +15 -20
  138. data/lib/action_dispatch/testing/assertions/tag.rb +20 -23
  139. data/lib/action_dispatch/testing/integration.rb +41 -22
  140. data/lib/action_dispatch/testing/test_process.rb +9 -6
  141. data/lib/action_dispatch/testing/test_request.rb +7 -3
  142. data/lib/action_pack.rb +1 -1
  143. data/lib/action_pack/version.rb +4 -4
  144. data/lib/action_view.rb +17 -8
  145. data/lib/action_view/base.rb +15 -34
  146. data/lib/action_view/buffers.rb +1 -1
  147. data/lib/action_view/context.rb +4 -4
  148. data/lib/action_view/dependency_tracker.rb +91 -0
  149. data/lib/action_view/digestor.rb +85 -0
  150. data/lib/action_view/flows.rb +1 -4
  151. data/lib/action_view/helpers.rb +2 -4
  152. data/lib/action_view/helpers/active_model_helper.rb +3 -4
  153. data/lib/action_view/helpers/asset_tag_helper.rb +211 -353
  154. data/lib/action_view/helpers/asset_url_helper.rb +354 -0
  155. data/lib/action_view/helpers/atom_feed_helper.rb +13 -10
  156. data/lib/action_view/helpers/cache_helper.rb +150 -18
  157. data/lib/action_view/helpers/capture_helper.rb +42 -29
  158. data/lib/action_view/helpers/csrf_helper.rb +0 -2
  159. data/lib/action_view/helpers/date_helper.rb +268 -247
  160. data/lib/action_view/helpers/debug_helper.rb +10 -11
  161. data/lib/action_view/helpers/form_helper.rb +904 -547
  162. data/lib/action_view/helpers/form_options_helper.rb +341 -166
  163. data/lib/action_view/helpers/form_tag_helper.rb +188 -88
  164. data/lib/action_view/helpers/javascript_helper.rb +23 -16
  165. data/lib/action_view/helpers/number_helper.rb +148 -354
  166. data/lib/action_view/helpers/output_safety_helper.rb +3 -3
  167. data/lib/action_view/helpers/record_tag_helper.rb +17 -22
  168. data/lib/action_view/helpers/rendering_helper.rb +2 -4
  169. data/lib/action_view/helpers/sanitize_helper.rb +3 -6
  170. data/lib/action_view/helpers/tag_helper.rb +43 -37
  171. data/lib/action_view/helpers/tags.rb +39 -0
  172. data/lib/action_view/helpers/tags/base.rb +148 -0
  173. data/lib/action_view/helpers/tags/check_box.rb +64 -0
  174. data/lib/action_view/helpers/tags/checkable.rb +16 -0
  175. data/lib/action_view/helpers/tags/collection_check_boxes.rb +43 -0
  176. data/lib/action_view/helpers/tags/collection_helpers.rb +83 -0
  177. data/lib/action_view/helpers/tags/collection_radio_buttons.rb +36 -0
  178. data/lib/action_view/helpers/tags/collection_select.rb +28 -0
  179. data/lib/action_view/helpers/tags/color_field.rb +25 -0
  180. data/lib/action_view/helpers/tags/date_field.rb +13 -0
  181. data/lib/action_view/helpers/tags/date_select.rb +72 -0
  182. data/lib/action_view/helpers/tags/datetime_field.rb +22 -0
  183. data/lib/action_view/helpers/tags/datetime_local_field.rb +19 -0
  184. data/lib/action_view/helpers/tags/datetime_select.rb +8 -0
  185. data/lib/action_view/helpers/tags/email_field.rb +8 -0
  186. data/lib/action_view/helpers/tags/file_field.rb +8 -0
  187. data/lib/action_view/helpers/tags/grouped_collection_select.rb +29 -0
  188. data/lib/action_view/helpers/tags/hidden_field.rb +8 -0
  189. data/lib/action_view/helpers/tags/label.rb +65 -0
  190. data/lib/action_view/helpers/tags/month_field.rb +13 -0
  191. data/lib/action_view/helpers/tags/number_field.rb +18 -0
  192. data/lib/action_view/helpers/tags/password_field.rb +12 -0
  193. data/lib/action_view/helpers/tags/radio_button.rb +31 -0
  194. data/lib/action_view/helpers/tags/range_field.rb +8 -0
  195. data/lib/action_view/helpers/tags/search_field.rb +24 -0
  196. data/lib/action_view/helpers/tags/select.rb +41 -0
  197. data/lib/action_view/helpers/tags/tel_field.rb +8 -0
  198. data/lib/action_view/helpers/tags/text_area.rb +18 -0
  199. data/lib/action_view/helpers/tags/text_field.rb +29 -0
  200. data/lib/action_view/helpers/tags/time_field.rb +13 -0
  201. data/lib/action_view/helpers/tags/time_select.rb +8 -0
  202. data/lib/action_view/helpers/tags/time_zone_select.rb +20 -0
  203. data/lib/action_view/helpers/tags/url_field.rb +8 -0
  204. data/lib/action_view/helpers/tags/week_field.rb +13 -0
  205. data/lib/action_view/helpers/text_helper.rb +126 -113
  206. data/lib/action_view/helpers/translation_helper.rb +32 -16
  207. data/lib/action_view/helpers/url_helper.rb +200 -271
  208. data/lib/action_view/locale/en.yml +1 -105
  209. data/lib/action_view/log_subscriber.rb +6 -4
  210. data/lib/action_view/lookup_context.rb +15 -39
  211. data/lib/action_view/model_naming.rb +12 -0
  212. data/lib/action_view/path_set.rb +9 -39
  213. data/lib/action_view/railtie.rb +6 -22
  214. data/lib/action_view/record_identifier.rb +84 -0
  215. data/lib/action_view/renderer/abstract_renderer.rb +10 -19
  216. data/lib/action_view/renderer/partial_renderer.rb +144 -81
  217. data/lib/action_view/renderer/renderer.rb +2 -19
  218. data/lib/action_view/renderer/streaming_template_renderer.rb +2 -5
  219. data/lib/action_view/renderer/template_renderer.rb +14 -13
  220. data/lib/action_view/routing_url_for.rb +107 -0
  221. data/lib/action_view/template.rb +22 -21
  222. data/lib/action_view/template/error.rb +22 -12
  223. data/lib/action_view/template/handlers.rb +12 -9
  224. data/lib/action_view/template/handlers/builder.rb +1 -1
  225. data/lib/action_view/template/handlers/erb.rb +11 -16
  226. data/lib/action_view/template/handlers/raw.rb +11 -0
  227. data/lib/action_view/template/resolver.rb +111 -83
  228. data/lib/action_view/template/text.rb +12 -8
  229. data/lib/action_view/template/types.rb +57 -0
  230. data/lib/action_view/test_case.rb +66 -43
  231. data/lib/action_view/testing/resolvers.rb +3 -2
  232. data/lib/action_view/vendor/html-scanner.rb +20 -0
  233. data/lib/{action_controller → action_view}/vendor/html-scanner/html/document.rb +0 -0
  234. data/lib/{action_controller → action_view}/vendor/html-scanner/html/node.rb +12 -12
  235. data/lib/{action_controller → action_view}/vendor/html-scanner/html/sanitizer.rb +18 -7
  236. data/lib/{action_controller → action_view}/vendor/html-scanner/html/selector.rb +1 -1
  237. data/lib/{action_controller → action_view}/vendor/html-scanner/html/tokenizer.rb +1 -1
  238. data/lib/{action_controller → action_view}/vendor/html-scanner/html/version.rb +0 -0
  239. metadata +135 -125
  240. data/lib/action_controller/caching/actions.rb +0 -185
  241. data/lib/action_controller/caching/pages.rb +0 -187
  242. data/lib/action_controller/caching/sweeping.rb +0 -97
  243. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  244. data/lib/action_controller/metal/compatibility.rb +0 -65
  245. data/lib/action_controller/metal/session_management.rb +0 -14
  246. data/lib/action_controller/railties/paths.rb +0 -25
  247. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  248. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  249. data/lib/action_dispatch/middleware/head.rb +0 -18
  250. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  251. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  252. data/lib/action_view/asset_paths.rb +0 -142
  253. data/lib/action_view/helpers/asset_paths.rb +0 -7
  254. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  255. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  256. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  257. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  258. data/lib/sprockets/assets.rake +0 -99
  259. data/lib/sprockets/bootstrap.rb +0 -37
  260. data/lib/sprockets/compressors.rb +0 -83
  261. data/lib/sprockets/helpers.rb +0 -6
  262. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  263. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  264. data/lib/sprockets/railtie.rb +0 -62
  265. data/lib/sprockets/static_compiler.rb +0 -56
@@ -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,7 +1,5 @@
1
1
  require "abstract_controller/base"
2
2
  require "action_view"
3
- require "active_support/core_ext/object/instance_variables"
4
- require "active_support/hash_with_indifferent_access"
5
3
 
6
4
  module AbstractController
7
5
  class DoubleRenderError < Error
@@ -51,9 +49,19 @@ module AbstractController
51
49
  module ClassMethods
52
50
  def view_context_class
53
51
  @view_context_class ||= begin
54
- routes = _routes if respond_to?(:_routes)
55
- helpers = _helpers if respond_to?(:_helpers)
56
- ActionView::Base.prepare(routes, helpers)
52
+ routes = respond_to?(:_routes) && _routes
53
+ helpers = respond_to?(:_helpers) && _helpers
54
+
55
+ Class.new(ActionView::Base) do
56
+ if routes
57
+ include routes.url_helpers
58
+ include routes.mounted_helpers
59
+ end
60
+
61
+ if helpers
62
+ include helpers
63
+ end
64
+ end
57
65
  end
58
66
  end
59
67
  end
@@ -111,20 +119,20 @@ module AbstractController
111
119
  view_renderer.render(view_context, options)
112
120
  end
113
121
 
114
- DEFAULT_PROTECTED_INSTANCE_VARIABLES = %w(
115
- @_action_name @_response_body @_formats @_prefixes @_config
116
- @_view_context_class @_view_renderer @_lookup_context
117
- )
122
+ DEFAULT_PROTECTED_INSTANCE_VARIABLES = [
123
+ :@_action_name, :@_response_body, :@_formats, :@_prefixes, :@_config,
124
+ :@_view_context_class, :@_view_renderer, :@_lookup_context
125
+ ]
118
126
 
119
127
  # This method should return a hash with assigns.
120
128
  # You can overwrite this configuration per controller.
121
129
  # :api: public
122
130
  def view_assigns
123
131
  hash = {}
124
- variables = instance_variable_names
132
+ variables = instance_variables
125
133
  variables -= protected_instance_variables
126
134
  variables -= DEFAULT_PROTECTED_INSTANCE_VARIABLES
127
- variables.each { |name| hash[name.to_s[1, name.length]] = instance_variable_get(name) }
135
+ variables.each { |name| hash[name[1..-1]] = instance_variable_get(name) }
128
136
  hash
129
137
  end
130
138
 
@@ -139,7 +147,7 @@ module AbstractController
139
147
  end
140
148
 
141
149
  # Normalize args by converting render "foo" to render :action => "foo" and
142
- # render "foo/bar" to render :app_template_file => "foo/bar".
150
+ # render "foo/bar" to render :file => "foo/bar".
143
151
  # :api: plugin
144
152
  def _normalize_args(action=nil, options={})
145
153
  case action
@@ -148,11 +156,12 @@ module AbstractController
148
156
  options = action
149
157
  when String, Symbol
150
158
  action = action.to_s
151
- key = action.include?(?/) ? :app_template_file : :action
159
+ key = action.include?(?/) ? :file : :action
152
160
  options[key] = action
153
161
  else
154
162
  options[:partial] = action
155
163
  end
164
+
156
165
  options
157
166
  end
158
167
 
@@ -1,13 +1,28 @@
1
1
  module AbstractController
2
2
  module Translation
3
+ # Delegates to <tt>I18n.translate</tt>. Also aliased as <tt>t</tt>.
4
+ #
5
+ # When the given key starts with a period, it will be scoped by the current
6
+ # controller and action. So if you call <tt>translate(".foo")</tt> from
7
+ # <tt>PeopleController#index</tt>, it will convert the call to
8
+ # <tt>I18n.translate("people.index.foo")</tt>. This makes it less repetitive
9
+ # to translate many keys within the same controller / action and gives you a
10
+ # simple framework for scoping them consistently.
3
11
  def translate(*args)
12
+ key = args.first
13
+ if key.is_a?(String) && (key[0] == '.')
14
+ key = "#{ controller_path.gsub('/', '.') }.#{ action_name }#{ key }"
15
+ args[0] = key
16
+ end
17
+
4
18
  I18n.translate(*args)
5
19
  end
6
20
  alias :t :translate
7
21
 
22
+ # Delegates to <tt>I18n.localize</tt>. Also aliased as <tt>l</tt>.
8
23
  def localize(*args)
9
24
  I18n.localize(*args)
10
25
  end
11
26
  alias :l :localize
12
27
  end
13
- end
28
+ end
@@ -1,10 +1,10 @@
1
- # Includes +url_for+ into the host class (e.g. an abstract controller or mailer). The class
2
- # has to provide a +RouteSet+ by implementing the <tt>_routes</tt> methods. Otherwise, an
3
- # exception will be raised.
4
- #
5
- # Note that this module is completely decoupled from HTTP - the only requirement is a valid
6
- # <tt>_routes</tt> implementation.
7
1
  module AbstractController
2
+ # Includes +url_for+ into the host class (e.g. an abstract controller or mailer). The class
3
+ # has to provide a +RouteSet+ by implementing the <tt>_routes</tt> methods. Otherwise, an
4
+ # exception will be raised.
5
+ #
6
+ # Note that this module is completely decoupled from HTTP - the only requirement is a valid
7
+ # <tt>_routes</tt> implementation.
8
8
  module UrlFor
9
9
  extend ActiveSupport::Concern
10
10
  include ActionDispatch::Routing::UrlFor
@@ -89,7 +89,7 @@ module AbstractController
89
89
  # * <tt>paths</tt> - If a PathSet is provided, use that;
90
90
  # otherwise, process the parameter into a PathSet.
91
91
  def view_paths=(paths)
92
- self._view_paths = ActionView::PathSet.new(Array.wrap(paths))
92
+ self._view_paths = ActionView::PathSet.new(Array(paths))
93
93
  end
94
94
  end
95
95
  end
@@ -1,5 +1,8 @@
1
+ require 'active_support/rails'
1
2
  require 'abstract_controller'
2
3
  require 'action_dispatch'
4
+ require 'action_controller/metal/live'
5
+ require 'action_controller/metal/strong_parameters'
3
6
 
4
7
  module ActionController
5
8
  extend ActiveSupport::Autoload
@@ -31,16 +34,14 @@ module ActionController
31
34
  autoload :RequestForgeryProtection
32
35
  autoload :Rescue
33
36
  autoload :Responder
34
- autoload :SessionManagement
35
37
  autoload :Streaming
38
+ autoload :StrongParameters
36
39
  autoload :Testing
37
40
  autoload :UrlFor
38
41
  end
39
42
 
40
43
  autoload :Integration, 'action_controller/deprecated/integration_test'
41
44
  autoload :IntegrationTest, 'action_controller/deprecated/integration_test'
42
- autoload :PerformanceTest, 'action_controller/deprecated/performance_test'
43
- autoload :UrlWriter, 'action_controller/deprecated'
44
45
  autoload :Routing, 'action_controller/deprecated'
45
46
  autoload :TestCase, 'action_controller/test_case'
46
47
  autoload :TemplateAssertions, 'action_controller/test_case'
@@ -48,18 +49,26 @@ module ActionController
48
49
  eager_autoload do
49
50
  autoload :RecordIdentifier
50
51
  end
52
+
53
+ def self.eager_load!
54
+ super
55
+ ActionController::Caching.eager_load!
56
+ HTML.eager_load!
57
+ end
51
58
  end
52
59
 
53
60
  # All of these simply register additional autoloads
54
61
  require 'action_view'
55
- require 'action_controller/vendor/html-scanner'
62
+ require 'action_view/vendor/html-scanner'
63
+
64
+ ActiveSupport.on_load(:action_view) do
65
+ ActionView::RoutingUrlFor.send(:include, ActionDispatch::Routing::UrlFor)
66
+ end
56
67
 
57
68
  # Common Active Support usage in Action Controller
58
- require 'active_support/concern'
59
69
  require 'active_support/core_ext/class/attribute_accessors'
60
70
  require 'active_support/core_ext/load_error'
61
71
  require 'active_support/core_ext/module/attr_internal'
62
- require 'active_support/core_ext/module/delegation'
63
72
  require 'active_support/core_ext/name_error'
64
73
  require 'active_support/core_ext/uri'
65
74
  require 'active_support/inflector'
@@ -1,4 +1,5 @@
1
1
  require "action_controller/log_subscriber"
2
+ require "action_controller/metal/params_wrapper"
2
3
 
3
4
  module ActionController
4
5
  # Action Controllers are the core of a web request in \Rails. They are made up of one or more actions that are executed
@@ -43,7 +44,7 @@ module ActionController
43
44
  #
44
45
  # def server_ip
45
46
  # location = request.env["SERVER_ADDR"]
46
- # render :text => "This server hosted at #{location}"
47
+ # render text: "This server hosted at #{location}"
47
48
  # end
48
49
  #
49
50
  # == Parameters
@@ -88,15 +89,6 @@ module ActionController
88
89
  #
89
90
  # Do not put secret information in cookie-based sessions!
90
91
  #
91
- # Other options for session storage:
92
- #
93
- # * ActiveRecord::SessionStore - Sessions are stored in your database, which works better than PStore with multiple app servers and,
94
- # unlike CookieStore, hides your session contents from the user. To use ActiveRecord::SessionStore, set
95
- #
96
- # MyApplication::Application.config.session_store :active_record_store
97
- #
98
- # in your <tt>config/initializers/session_store.rb</tt> and run <tt>script/rails g session_migration</tt>.
99
- #
100
92
  # == Responses
101
93
  #
102
94
  # Each action results in a response, which holds the headers and document to be sent to the user's browser. The actual response
@@ -116,15 +108,15 @@ module ActionController
116
108
  #
117
109
  # Title: <%= @post.title %>
118
110
  #
119
- # You don't have to rely on the automated rendering. For example, actions that could result in the rendering of different templates
111
+ # You don't have to rely on the automated rendering. For example, actions that could result in the rendering of different templates
120
112
  # will use the manual rendering methods:
121
113
  #
122
114
  # def search
123
115
  # @results = Search.find(params[:query])
124
116
  # case @results.count
125
- # when 0 then render :action => "no_results"
126
- # when 1 then render :action => "show"
127
- # when 2..10 then render :action => "show_many"
117
+ # when 0 then render action: "no_results"
118
+ # when 1 then render action: "show"
119
+ # when 2..10 then render action: "show_many"
128
120
  # end
129
121
  # end
130
122
  #
@@ -133,14 +125,14 @@ module ActionController
133
125
  # == Redirects
134
126
  #
135
127
  # Redirects are used to move from one action to another. For example, after a <tt>create</tt> action, which stores a blog entry to the
136
- # database, we might like to show the user the new entry. Because we're following good DRY principles (Don't Repeat Yourself), we're
128
+ # database, we might like to show the user the new entry. Because we're following good DRY principles (Don't Repeat Yourself), we're
137
129
  # going to reuse (and redirect to) a <tt>show</tt> action that we'll assume has already been created. The code might look like this:
138
130
  #
139
131
  # def create
140
132
  # @entry = Entry.new(params[:entry])
141
133
  # if @entry.save
142
134
  # # The entry was saved correctly, redirect to show
143
- # redirect_to :action => 'show', :id => @entry.id
135
+ # redirect_to action: 'show', id: @entry.id
144
136
  # else
145
137
  # # things didn't go so well, do something else
146
138
  # end
@@ -157,20 +149,48 @@ module ActionController
157
149
  # An action may contain only a single render or a single redirect. Attempting to try to do either again will result in a DoubleRenderError:
158
150
  #
159
151
  # def do_something
160
- # redirect_to :action => "elsewhere"
161
- # render :action => "overthere" # raises DoubleRenderError
152
+ # redirect_to action: "elsewhere"
153
+ # render action: "overthere" # raises DoubleRenderError
162
154
  # end
163
155
  #
164
156
  # If you need to redirect on the condition of something, then be sure to add "and return" to halt execution.
165
157
  #
166
158
  # def do_something
167
- # redirect_to(:action => "elsewhere") and return if monkeys.nil?
168
- # render :action => "overthere" # won't be called if monkeys is nil
159
+ # redirect_to(action: "elsewhere") and return if monkeys.nil?
160
+ # render action: "overthere" # won't be called if monkeys is nil
169
161
  # end
170
162
  #
171
163
  class Base < Metal
172
164
  abstract!
173
165
 
166
+ # We document the request and response methods here because albeit they are
167
+ # implemented in ActionController::Metal, the type of the returned objects
168
+ # is unknown at that level.
169
+
170
+ ##
171
+ # :method: request
172
+ #
173
+ # Returns an ActionDispatch::Request instance that represents the
174
+ # current request.
175
+
176
+ ##
177
+ # :method: response
178
+ #
179
+ # Returns an ActionDispatch::Response that represents the current
180
+ # response.
181
+
182
+ # Shortcut helper that returns all the modules included in
183
+ # ActionController::Base except the ones passed as arguments:
184
+ #
185
+ # class MetalController
186
+ # ActionController::Base.without_modules(:ParamsWrapper, :Streaming).each do |left|
187
+ # include left
188
+ # end
189
+ # end
190
+ #
191
+ # This gives better control over what you want to exclude and makes it
192
+ # easier to create a bare controller class, instead of listing the modules
193
+ # required manually.
174
194
  def self.without_modules(*modules)
175
195
  modules = modules.map do |m|
176
196
  m.is_a?(Symbol) ? ActionController.const_get(m) : m
@@ -195,6 +215,7 @@ module ActionController
195
215
  Caching,
196
216
  MimeResponds,
197
217
  ImplicitRender,
218
+ StrongParameters,
198
219
 
199
220
  Cookies,
200
221
  Flash,
@@ -227,8 +248,11 @@ module ActionController
227
248
  include mod
228
249
  end
229
250
 
230
- # Rails 2.x compatibility
231
- include ActionController::Compatibility
251
+ # Define some internal variables that should not be propagated to the view.
252
+ self.protected_instance_variables = [
253
+ :@_status, :@_headers, :@_params, :@_env, :@_response, :@_request,
254
+ :@_view_runtime, :@_stream, :@_url_options, :@_action_has_layout
255
+ ]
232
256
 
233
257
  ActiveSupport.run_load_hooks(:action_controller, self)
234
258
  end
@@ -2,41 +2,33 @@ require 'fileutils'
2
2
  require 'uri'
3
3
  require 'set'
4
4
 
5
- module ActionController #:nodoc:
5
+ module ActionController
6
6
  # \Caching is a cheap way of speeding up slow applications by keeping the result of
7
7
  # calculations, renderings, and database calls around for subsequent requests.
8
- # Action Controller affords you three approaches in varying levels of granularity:
9
- # Page, Action, Fragment.
10
8
  #
11
- # You can read more about each approach and the sweeping assistance by clicking the
12
- # modules below.
9
+ # You can read more about each approach by clicking the modules below.
13
10
  #
14
- # Note: To turn off all caching and sweeping, set
11
+ # Note: To turn off all caching, set
15
12
  # config.action_controller.perform_caching = false.
16
13
  #
17
14
  # == \Caching stores
18
15
  #
19
16
  # All the caching stores from ActiveSupport::Cache are available to be used as backends
20
- # for Action Controller caching. This setting only affects action and fragment caching
21
- # as page caching is always written to disk.
17
+ # for Action Controller caching.
22
18
  #
23
19
  # Configuration examples (MemoryStore is the default):
24
20
  #
25
21
  # config.action_controller.cache_store = :memory_store
26
- # config.action_controller.cache_store = :file_store, "/path/to/cache/directory"
27
- # config.action_controller.cache_store = :mem_cache_store, "localhost"
28
- # config.action_controller.cache_store = :mem_cache_store, Memcached::Rails.new("localhost:11211")
29
- # config.action_controller.cache_store = MyOwnStore.new("parameter")
22
+ # config.action_controller.cache_store = :file_store, '/path/to/cache/directory'
23
+ # config.action_controller.cache_store = :mem_cache_store, 'localhost'
24
+ # config.action_controller.cache_store = :mem_cache_store, Memcached::Rails.new('localhost:11211')
25
+ # config.action_controller.cache_store = MyOwnStore.new('parameter')
30
26
  module Caching
31
27
  extend ActiveSupport::Concern
32
28
  extend ActiveSupport::Autoload
33
29
 
34
30
  eager_autoload do
35
- autoload :Actions
36
31
  autoload :Fragments
37
- autoload :Pages
38
- autoload :Sweeper, 'action_controller/caching/sweeping'
39
- autoload :Sweeping, 'action_controller/caching/sweeping'
40
32
  end
41
33
 
42
34
  module ConfigMethods
@@ -48,39 +40,60 @@ module ActionController #:nodoc:
48
40
  config.cache_store = ActiveSupport::Cache.lookup_store(store)
49
41
  end
50
42
 
51
- private
52
-
53
- def cache_configured?
54
- perform_caching && cache_store
55
- end
43
+ private
44
+ def cache_configured?
45
+ perform_caching && cache_store
46
+ end
56
47
  end
57
48
 
58
49
  include RackDelegation
59
50
  include AbstractController::Callbacks
60
51
 
61
52
  include ConfigMethods
62
- include Pages, Actions, Fragments
63
- include Sweeping if defined?(ActiveRecord)
53
+ include Fragments
64
54
 
65
55
  included do
66
56
  extend ConfigMethods
67
57
 
58
+ config_accessor :default_static_extension
59
+ self.default_static_extension ||= '.html'
60
+
61
+ def self.page_cache_extension=(extension)
62
+ ActiveSupport::Deprecation.deprecation_warning(:page_cache_extension, :default_static_extension)
63
+ self.default_static_extension = extension
64
+ end
65
+
66
+ def self.page_cache_extension
67
+ ActiveSupport::Deprecation.deprecation_warning(:page_cache_extension, :default_static_extension)
68
+ default_static_extension
69
+ end
70
+
68
71
  config_accessor :perform_caching
69
72
  self.perform_caching = true if perform_caching.nil?
70
- end
71
73
 
72
- def caching_allowed?
73
- request.get? && response.status == 200
74
+ class_attribute :_view_cache_dependencies
75
+ self._view_cache_dependencies = []
76
+ helper_method :view_cache_dependencies if respond_to?(:helper_method)
74
77
  end
75
78
 
76
- protected
77
- # Convenience accessor
78
- def cache(key, options = {}, &block)
79
- if cache_configured?
80
- cache_store.fetch(ActiveSupport::Cache.expand_cache_key(key, :controller), options, &block)
81
- else
82
- yield
79
+ module ClassMethods
80
+ def view_cache_dependency(&dependency)
81
+ self._view_cache_dependencies += [dependency]
83
82
  end
84
83
  end
84
+
85
+ def view_cache_dependencies
86
+ self.class._view_cache_dependencies.map { |dep| instance_exec(&dep) }.compact
87
+ end
88
+
89
+ protected
90
+ # Convenience accessor.
91
+ def cache(key, options = {}, &block)
92
+ if cache_configured?
93
+ cache_store.fetch(ActiveSupport::Cache.expand_cache_key(key, :controller), options, &block)
94
+ else
95
+ yield
96
+ end
97
+ end
85
98
  end
86
99
  end