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
@@ -1,3 +1,5 @@
1
+ require 'action_controller/model_naming'
2
+
1
3
  module ActionDispatch
2
4
  module Routing
3
5
  # Polymorphic URL helpers are methods for smart resolution to a named route call when
@@ -32,7 +34,7 @@ module ActionDispatch
32
34
  # == Prefixed polymorphic helpers
33
35
  #
34
36
  # In addition to <tt>polymorphic_url</tt> and <tt>polymorphic_path</tt> methods, a
35
- # number of prefixed helpers are available as a shorthand to <tt>:action => "..."</tt>
37
+ # number of prefixed helpers are available as a shorthand to <tt>action: "..."</tt>
36
38
  # in options. Those are:
37
39
  #
38
40
  # * <tt>edit_polymorphic_url</tt>, <tt>edit_polymorphic_path</tt>
@@ -41,20 +43,20 @@ module ActionDispatch
41
43
  # Example usage:
42
44
  #
43
45
  # edit_polymorphic_path(@post) # => "/posts/1/edit"
44
- # polymorphic_path(@post, :format => :pdf) # => "/posts/1.pdf"
45
- #
46
- # == Using with mounted engines
46
+ # polymorphic_path(@post, format: :pdf) # => "/posts/1.pdf"
47
47
  #
48
- # If you use mounted engine, there is a possibility that you will need to use
49
- # polymorphic_url pointing at engine's routes. To do that, just pass proxy used
50
- # to reach engine's routes as a first argument:
48
+ # == Usage with mounted engines
51
49
  #
52
- # For example:
50
+ # If you are using a mounted engine and you need to use a polymorphic_url
51
+ # pointing at the engine's routes, pass in the engine's route proxy as the first
52
+ # argument to the method. For example:
53
53
  #
54
- # polymorphic_url([blog, @post]) # it will call blog.post_path(@post)
55
- # form_for([blog, @post]) # => "/blog/posts/1
54
+ # polymorphic_url([blog, @post]) # calls blog.post_path(@post)
55
+ # form_for([blog, @post]) # => "/blog/posts/1"
56
56
  #
57
57
  module PolymorphicRoutes
58
+ include ActionController::ModelNaming
59
+
58
60
  # Constructs a call to a named RESTful route for the given record and returns the
59
61
  # resulting URL string. For example:
60
62
  #
@@ -72,8 +74,6 @@ module ActionDispatch
72
74
  # * <tt>:routing_type</tt> - Allowed values are <tt>:path</tt> or <tt>:url</tt>.
73
75
  # Default is <tt>:url</tt>.
74
76
  #
75
- # ==== Examples
76
- #
77
77
  # # an Article record
78
78
  # polymorphic_url(record) # same as article_url(record)
79
79
  #
@@ -130,7 +130,7 @@ module ActionDispatch
130
130
  end
131
131
 
132
132
  # Returns the path component of a URL for the given record. It uses
133
- # <tt>polymorphic_url</tt> with <tt>:routing_type => :path</tt>.
133
+ # <tt>polymorphic_url</tt> with <tt>routing_type: :path</tt>.
134
134
  def polymorphic_path(record_or_hash_or_array, options = {})
135
135
  polymorphic_url(record_or_hash_or_array, options.merge(:routing_type => :path))
136
136
  end
@@ -156,10 +156,6 @@ module ActionDispatch
156
156
  options[:action] ? "#{options[:action]}_" : ''
157
157
  end
158
158
 
159
- def convert_to_model(object)
160
- object.respond_to?(:to_model) ? object.to_model : object
161
- end
162
-
163
159
  def routing_type(options)
164
160
  options[:routing_type] || :url
165
161
  end
@@ -171,7 +167,7 @@ module ActionDispatch
171
167
  if parent.is_a?(Symbol) || parent.is_a?(String)
172
168
  parent
173
169
  else
174
- ActiveModel::Naming.singular_route_key(parent)
170
+ model_name_from_record_or_class(parent).singular_route_key
175
171
  end
176
172
  end
177
173
  else
@@ -183,9 +179,9 @@ module ActionDispatch
183
179
  route << record
184
180
  elsif record
185
181
  if inflection == :singular
186
- route << ActiveModel::Naming.singular_route_key(record)
182
+ route << model_name_from_record_or_class(record).singular_route_key
187
183
  else
188
- route << ActiveModel::Naming.route_key(record)
184
+ route << model_name_from_record_or_class(record).route_key
189
185
  end
190
186
  else
191
187
  raise ArgumentError, "Nil location provided. Can't build URI."
@@ -1,6 +1,8 @@
1
1
  require 'action_dispatch/http/request'
2
2
  require 'active_support/core_ext/uri'
3
+ require 'active_support/core_ext/array/extract_options'
3
4
  require 'rack/utils'
5
+ require 'action_controller/metal/exceptions'
4
6
 
5
7
  module ActionDispatch
6
8
  module Routing
@@ -15,6 +17,14 @@ module ActionDispatch
15
17
  def call(env)
16
18
  req = Request.new(env)
17
19
 
20
+ # If any of the path parameters has a invalid encoding then
21
+ # raise since it's likely to trigger errors further on.
22
+ req.symbolized_path_parameters.each do |key, value|
23
+ unless value.valid_encoding?
24
+ raise ActionController::BadRequest, "Invalid parameter: #{key} => #{value}"
25
+ end
26
+ end
27
+
18
28
  uri = URI.parse(path(req.symbolized_path_parameters, req))
19
29
  uri.scheme ||= req.scheme
20
30
  uri.host ||= req.host
@@ -34,6 +44,25 @@ module ActionDispatch
34
44
  def path(params, request)
35
45
  block.call params, request
36
46
  end
47
+
48
+ def inspect
49
+ "redirect(#{status})"
50
+ end
51
+ end
52
+
53
+ class PathRedirect < Redirect
54
+ def path(params, request)
55
+ (params.empty? || !block.match(/%\{\w*\}/)) ? block : (block % escape(params))
56
+ end
57
+
58
+ def inspect
59
+ "redirect(#{status}, #{block})"
60
+ end
61
+
62
+ private
63
+ def escape(params)
64
+ Hash[params.map{ |k,v| [k, Rack::Utils.escape(v)] }]
65
+ end
37
66
  end
38
67
 
39
68
  class OptionRedirect < Redirect # :nodoc:
@@ -46,7 +75,7 @@ module ActionDispatch
46
75
  :port => request.optional_port,
47
76
  :path => request.path,
48
77
  :params => request.query_parameters
49
- }.merge options
78
+ }.merge! options
50
79
 
51
80
  if !params.empty? && url_options[:path].match(/%\{\w*\}/)
52
81
  url_options[:path] = (url_options[:path] % escape_path(params))
@@ -55,6 +84,10 @@ module ActionDispatch
55
84
  ActionDispatch::Http::URL.url_for url_options
56
85
  end
57
86
 
87
+ def inspect
88
+ "redirect(#{status}, #{options.map{ |k,v| "#{k}: #{v}" }.join(', ')})"
89
+ end
90
+
58
91
  private
59
92
  def escape_path(params)
60
93
  Hash[params.map{ |k,v| [k, URI.parser.escape(v)] }]
@@ -65,11 +98,11 @@ module ActionDispatch
65
98
 
66
99
  # Redirect any path to another path:
67
100
  #
68
- # match "/stories" => redirect("/posts")
101
+ # get "/stories" => redirect("/posts")
69
102
  #
70
103
  # You can also use interpolation in the supplied redirect argument:
71
104
  #
72
- # match 'docs/:article', :to => redirect('/wiki/%{article}')
105
+ # get 'docs/:article', to: redirect('/wiki/%{article}')
73
106
  #
74
107
  # Alternatively you can use one of the other syntaxes:
75
108
  #
@@ -78,54 +111,38 @@ module ActionDispatch
78
111
  # params, depending of how many arguments your block accepts. A string is required as a
79
112
  # return value.
80
113
  #
81
- # match 'jokes/:number', :to => redirect { |params, request|
114
+ # get 'jokes/:number', to: redirect { |params, request|
82
115
  # path = (params[:number].to_i.even? ? "wheres-the-beef" : "i-love-lamp")
83
116
  # "http://#{request.host_with_port}/#{path}"
84
117
  # }
85
118
  #
119
+ # Note that the +do end+ syntax for the redirect block wouldn't work, as Ruby would pass
120
+ # the block to +get+ instead of +redirect+. Use <tt>{ ... }</tt> instead.
121
+ #
86
122
  # The options version of redirect allows you to supply only the parts of the url which need
87
123
  # to change, it also supports interpolation of the path similar to the first example.
88
124
  #
89
- # match 'stores/:name', :to => redirect(:subdomain => 'stores', :path => '/%{name}')
90
- # match 'stores/:name(*all)', :to => redirect(:subdomain => 'stores', :path => '/%{name}%{all}')
125
+ # get 'stores/:name', to: redirect(subdomain: 'stores', path: '/%{name}')
126
+ # get 'stores/:name(*all)', to: redirect(subdomain: 'stores', path: '/%{name}%{all}')
91
127
  #
92
128
  # Finally, an object which responds to call can be supplied to redirect, allowing you to reuse
93
129
  # common redirect routes. The call method must accept two arguments, params and request, and return
94
130
  # a string.
95
131
  #
96
- # match 'accounts/:name' => redirect(SubdomainRedirector.new('api'))
132
+ # get 'accounts/:name' => redirect(SubdomainRedirector.new('api'))
97
133
  #
98
134
  def redirect(*args, &block)
99
- options = args.last.is_a?(Hash) ? args.pop : {}
135
+ options = args.extract_options!
100
136
  status = options.delete(:status) || 301
137
+ path = args.shift
101
138
 
102
139
  return OptionRedirect.new(status, options) if options.any?
103
-
104
- path = args.shift
105
-
106
- block = lambda { |params, request|
107
- (params.empty? || !path.match(/%\{\w*\}/)) ? path : (path % escape(params))
108
- } if String === path
140
+ return PathRedirect.new(status, path) if String === path
109
141
 
110
142
  block = path if path.respond_to? :call
111
-
112
- # :FIXME: remove in Rails 4.0
113
- if block && block.respond_to?(:arity) && block.arity < 2
114
- msg = "redirect blocks with arity of #{block.arity} are deprecated. Your block must take 2 parameters: the environment, and a request object"
115
- ActiveSupport::Deprecation.warn msg
116
- deprecated_block = block
117
- block = lambda { |params, _| deprecated_block.call(params) }
118
- end
119
-
120
143
  raise ArgumentError, "redirection argument not supported" unless block
121
-
122
144
  Redirect.new status, block
123
145
  end
124
-
125
- private
126
- def escape(params)
127
- Hash[params.map{ |k,v| [k, Rack::Utils.escape(v)] }]
128
- end
129
146
  end
130
147
  end
131
148
  end