actionpack 4.2.11.3 → 5.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 (125) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +379 -462
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +2 -3
  5. data/lib/abstract_controller.rb +0 -2
  6. data/lib/abstract_controller/base.rb +17 -32
  7. data/lib/abstract_controller/callbacks.rb +52 -19
  8. data/lib/abstract_controller/collector.rb +4 -9
  9. data/lib/abstract_controller/helpers.rb +2 -2
  10. data/lib/abstract_controller/railties/routes_helpers.rb +2 -2
  11. data/lib/abstract_controller/rendering.rb +27 -22
  12. data/lib/abstract_controller/translation.rb +8 -7
  13. data/lib/action_controller.rb +4 -3
  14. data/lib/action_controller/api.rb +146 -0
  15. data/lib/action_controller/base.rb +6 -10
  16. data/lib/action_controller/caching.rb +1 -3
  17. data/lib/action_controller/caching/fragments.rb +48 -3
  18. data/lib/action_controller/form_builder.rb +48 -0
  19. data/lib/action_controller/log_subscriber.rb +1 -10
  20. data/lib/action_controller/metal.rb +89 -62
  21. data/lib/action_controller/metal/basic_implicit_render.rb +11 -0
  22. data/lib/action_controller/metal/conditional_get.rb +65 -24
  23. data/lib/action_controller/metal/cookies.rb +0 -2
  24. data/lib/action_controller/metal/data_streaming.rb +2 -22
  25. data/lib/action_controller/metal/etag_with_template_digest.rb +1 -1
  26. data/lib/action_controller/metal/exceptions.rb +11 -6
  27. data/lib/action_controller/metal/force_ssl.rb +6 -6
  28. data/lib/action_controller/metal/head.rb +14 -7
  29. data/lib/action_controller/metal/helpers.rb +9 -5
  30. data/lib/action_controller/metal/http_authentication.rb +37 -38
  31. data/lib/action_controller/metal/implicit_render.rb +23 -6
  32. data/lib/action_controller/metal/instrumentation.rb +0 -1
  33. data/lib/action_controller/metal/live.rb +17 -55
  34. data/lib/action_controller/metal/mime_responds.rb +17 -37
  35. data/lib/action_controller/metal/params_wrapper.rb +8 -8
  36. data/lib/action_controller/metal/redirecting.rb +32 -9
  37. data/lib/action_controller/metal/renderers.rb +10 -8
  38. data/lib/action_controller/metal/rendering.rb +38 -6
  39. data/lib/action_controller/metal/request_forgery_protection.rb +67 -35
  40. data/lib/action_controller/metal/rescue.rb +2 -4
  41. data/lib/action_controller/metal/streaming.rb +4 -4
  42. data/lib/action_controller/metal/strong_parameters.rb +231 -78
  43. data/lib/action_controller/metal/testing.rb +1 -12
  44. data/lib/action_controller/metal/url_for.rb +12 -5
  45. data/lib/action_controller/renderer.rb +111 -0
  46. data/lib/action_controller/template_assertions.rb +9 -0
  47. data/lib/action_controller/test_case.rb +267 -363
  48. data/lib/action_dispatch.rb +2 -1
  49. data/lib/action_dispatch/http/cache.rb +23 -26
  50. data/lib/action_dispatch/http/filter_parameters.rb +6 -8
  51. data/lib/action_dispatch/http/filter_redirect.rb +7 -8
  52. data/lib/action_dispatch/http/headers.rb +28 -11
  53. data/lib/action_dispatch/http/mime_negotiation.rb +40 -26
  54. data/lib/action_dispatch/http/mime_type.rb +92 -61
  55. data/lib/action_dispatch/http/mime_types.rb +1 -4
  56. data/lib/action_dispatch/http/parameter_filter.rb +18 -8
  57. data/lib/action_dispatch/http/parameters.rb +45 -41
  58. data/lib/action_dispatch/http/request.rb +146 -82
  59. data/lib/action_dispatch/http/response.rb +180 -99
  60. data/lib/action_dispatch/http/url.rb +117 -8
  61. data/lib/action_dispatch/journey/formatter.rb +34 -28
  62. data/lib/action_dispatch/journey/gtg/transition_table.rb +1 -1
  63. data/lib/action_dispatch/journey/nfa/dot.rb +0 -2
  64. data/lib/action_dispatch/journey/nfa/transition_table.rb +1 -46
  65. data/lib/action_dispatch/journey/nodes/node.rb +14 -4
  66. data/lib/action_dispatch/journey/parser_extras.rb +4 -0
  67. data/lib/action_dispatch/journey/path/pattern.rb +37 -41
  68. data/lib/action_dispatch/journey/route.rb +71 -17
  69. data/lib/action_dispatch/journey/router.rb +5 -6
  70. data/lib/action_dispatch/journey/router/utils.rb +5 -5
  71. data/lib/action_dispatch/journey/routes.rb +14 -15
  72. data/lib/action_dispatch/journey/visitors.rb +86 -43
  73. data/lib/action_dispatch/middleware/cookies.rb +184 -135
  74. data/lib/action_dispatch/middleware/debug_exceptions.rb +115 -45
  75. data/lib/action_dispatch/middleware/exception_wrapper.rb +21 -20
  76. data/lib/action_dispatch/middleware/flash.rb +61 -45
  77. data/lib/action_dispatch/middleware/load_interlock.rb +21 -0
  78. data/lib/action_dispatch/middleware/params_parser.rb +30 -46
  79. data/lib/action_dispatch/middleware/public_exceptions.rb +2 -2
  80. data/lib/action_dispatch/middleware/reloader.rb +2 -4
  81. data/lib/action_dispatch/middleware/remote_ip.rb +29 -19
  82. data/lib/action_dispatch/middleware/request_id.rb +11 -6
  83. data/lib/action_dispatch/middleware/session/abstract_store.rb +23 -11
  84. data/lib/action_dispatch/middleware/session/cache_store.rb +9 -6
  85. data/lib/action_dispatch/middleware/session/cookie_store.rb +29 -23
  86. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +4 -0
  87. data/lib/action_dispatch/middleware/show_exceptions.rb +11 -9
  88. data/lib/action_dispatch/middleware/ssl.rb +93 -36
  89. data/lib/action_dispatch/middleware/stack.rb +43 -48
  90. data/lib/action_dispatch/middleware/static.rb +52 -40
  91. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +2 -14
  92. data/lib/action_dispatch/middleware/templates/rescues/{_source.erb → _source.html.erb} +0 -0
  93. data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
  94. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +1 -1
  95. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +1 -1
  96. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +4 -4
  97. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +59 -63
  98. data/lib/action_dispatch/railtie.rb +0 -2
  99. data/lib/action_dispatch/request/session.rb +66 -34
  100. data/lib/action_dispatch/request/utils.rb +51 -19
  101. data/lib/action_dispatch/routing.rb +3 -8
  102. data/lib/action_dispatch/routing/inspector.rb +6 -30
  103. data/lib/action_dispatch/routing/mapper.rb +447 -322
  104. data/lib/action_dispatch/routing/polymorphic_routes.rb +8 -14
  105. data/lib/action_dispatch/routing/redirection.rb +3 -3
  106. data/lib/action_dispatch/routing/route_set.rb +124 -227
  107. data/lib/action_dispatch/routing/url_for.rb +27 -10
  108. data/lib/action_dispatch/testing/assertions.rb +1 -1
  109. data/lib/action_dispatch/testing/assertions/response.rb +27 -9
  110. data/lib/action_dispatch/testing/assertions/routing.rb +9 -9
  111. data/lib/action_dispatch/testing/integration.rb +237 -76
  112. data/lib/action_dispatch/testing/test_process.rb +5 -5
  113. data/lib/action_dispatch/testing/test_request.rb +12 -21
  114. data/lib/action_dispatch/testing/test_response.rb +1 -4
  115. data/lib/action_pack.rb +1 -1
  116. data/lib/action_pack/gem_version.rb +4 -4
  117. metadata +26 -25
  118. data/lib/action_controller/metal/hide_actions.rb +0 -40
  119. data/lib/action_controller/metal/rack_delegation.rb +0 -32
  120. data/lib/action_controller/middleware.rb +0 -39
  121. data/lib/action_controller/model_naming.rb +0 -12
  122. data/lib/action_dispatch/journey/router/strexp.rb +0 -27
  123. data/lib/action_dispatch/testing/assertions/dom.rb +0 -3
  124. data/lib/action_dispatch/testing/assertions/selector.rb +0 -3
  125. data/lib/action_dispatch/testing/assertions/tag.rb +0 -3
@@ -1,5 +1,3 @@
1
- require 'action_controller/model_naming'
2
-
3
1
  module ActionDispatch
4
2
  module Routing
5
3
  # Polymorphic URL helpers are methods for smart resolution to a named route call when
@@ -55,8 +53,6 @@ module ActionDispatch
55
53
  # form_for([blog, @post]) # => "/blog/posts/1"
56
54
  #
57
55
  module PolymorphicRoutes
58
- include ActionController::ModelNaming
59
-
60
56
  # Constructs a call to a named RESTful route for the given record and returns the
61
57
  # resulting URL string. For example:
62
58
  #
@@ -251,14 +247,12 @@ module ActionDispatch
251
247
  args = []
252
248
 
253
249
  model = record.to_model
254
- name = if model.persisted?
255
- args << model
256
- model.model_name.singular_route_key
257
- else
258
- @key_strategy.call model.model_name
259
- end
260
-
261
- named_route = prefix + "#{name}_#{suffix}"
250
+ named_route = if model.persisted?
251
+ args << model
252
+ get_method_for_string model.model_name.singular_route_key
253
+ else
254
+ get_method_for_class model
255
+ end
262
256
 
263
257
  [named_route, args]
264
258
  end
@@ -313,11 +307,11 @@ module ActionDispatch
313
307
 
314
308
  def get_method_for_class(klass)
315
309
  name = @key_strategy.call klass.model_name
316
- prefix + "#{name}_#{suffix}"
310
+ get_method_for_string name
317
311
  end
318
312
 
319
313
  def get_method_for_string(str)
320
- prefix + "#{str}_#{suffix}"
314
+ "#{prefix}#{str}_#{suffix}"
321
315
  end
322
316
 
323
317
  [nil, 'new', 'edit'].each do |action|
@@ -24,7 +24,7 @@ module ActionDispatch
24
24
  def serve(req)
25
25
  req.check_path_parameters!
26
26
  uri = URI.parse(path(req.path_parameters, req))
27
-
27
+
28
28
  unless uri.host
29
29
  if relative_path?(uri.path)
30
30
  uri.path = "#{req.script_name}/#{uri.path}"
@@ -32,7 +32,7 @@ module ActionDispatch
32
32
  uri.path = req.script_name.empty? ? "/" : req.script_name
33
33
  end
34
34
  end
35
-
35
+
36
36
  uri.scheme ||= req.scheme
37
37
  uri.host ||= req.host
38
38
  uri.port ||= req.port unless req.standard_port?
@@ -124,7 +124,7 @@ module ActionDispatch
124
124
  url_options[:script_name] = request.script_name
125
125
  end
126
126
  end
127
-
127
+
128
128
  ActionDispatch::Http::URL.url_for url_options
129
129
  end
130
130
 
@@ -1,11 +1,9 @@
1
1
  require 'action_dispatch/journey'
2
- require 'forwardable'
3
2
  require 'active_support/concern'
4
3
  require 'active_support/core_ext/object/to_query'
5
4
  require 'active_support/core_ext/hash/slice'
6
5
  require 'active_support/core_ext/module/remove_method'
7
6
  require 'active_support/core_ext/array/extract_options'
8
- require 'active_support/core_ext/string/filters'
9
7
  require 'action_controller/metal/exceptions'
10
8
  require 'action_dispatch/http/request'
11
9
  require 'action_dispatch/routing/endpoint'
@@ -20,67 +18,48 @@ module ActionDispatch
20
18
  # alias inspect to to_s.
21
19
  alias inspect to_s
22
20
 
23
- mattr_accessor :relative_url_root
24
-
25
21
  class Dispatcher < Routing::Endpoint
26
- def initialize(defaults)
27
- @defaults = defaults
22
+ def initialize(raise_on_name_error)
23
+ @raise_on_name_error = raise_on_name_error
28
24
  end
29
25
 
30
26
  def dispatcher?; true; end
31
27
 
32
28
  def serve(req)
33
- req.check_path_parameters!
34
- params = req.path_parameters
35
-
36
- prepare_params!(params)
37
-
38
- # Just raise undefined constant errors if a controller was specified as default.
39
- unless controller = controller(params, @defaults.key?(:controller))
29
+ params = req.path_parameters
30
+ controller = controller req
31
+ res = controller.make_response! req
32
+ dispatch(controller, params[:action], req, res)
33
+ rescue ActionController::RoutingError
34
+ if @raise_on_name_error
35
+ raise
36
+ else
40
37
  return [404, {'X-Cascade' => 'pass'}, []]
41
38
  end
42
-
43
- dispatch(controller, params[:action], req.env)
44
39
  end
45
40
 
46
- def prepare_params!(params)
47
- normalize_controller!(params)
48
- merge_default_action!(params)
49
- end
41
+ private
50
42
 
51
- # If this is a default_controller (i.e. a controller specified by the user)
52
- # we should raise an error in case it's not found, because it usually means
53
- # a user error. However, if the controller was retrieved through a dynamic
54
- # segment, as in :controller(/:action), we should simply return nil and
55
- # delegate the control back to Rack cascade. Besides, if this is not a default
56
- # controller, it means we should respect the @scope[:module] parameter.
57
- def controller(params, default_controller=true)
58
- if params && params.key?(:controller)
59
- controller_param = params[:controller]
60
- controller_reference(controller_param)
61
- end
43
+ def controller(req)
44
+ req.controller_class
62
45
  rescue NameError => e
63
- raise ActionController::RoutingError, e.message, e.backtrace if default_controller
46
+ raise ActionController::RoutingError, e.message, e.backtrace
64
47
  end
65
48
 
66
- private
67
-
68
- def controller_reference(controller_param)
69
- const_name = "#{controller_param.camelize}Controller"
70
- ActiveSupport::Dependencies.constantize(const_name)
49
+ def dispatch(controller, action, req, res)
50
+ controller.dispatch(action, req, res)
71
51
  end
52
+ end
72
53
 
73
- def dispatch(controller, action, env)
74
- controller.action(action).call(env)
54
+ class StaticDispatcher < Dispatcher
55
+ def initialize(controller_class)
56
+ super(false)
57
+ @controller_class = controller_class
75
58
  end
76
59
 
77
- def normalize_controller!(params)
78
- params[:controller] = params[:controller].underscore if params.key?(:controller)
79
- end
60
+ private
80
61
 
81
- def merge_default_action!(params)
82
- params[:action] ||= 'index'
83
- end
62
+ def controller(_); @controller_class; end
84
63
  end
85
64
 
86
65
  # A NamedRouteCollection instance is a collection of named routes, and also
@@ -88,7 +67,8 @@ module ActionDispatch
88
67
  # named routes.
89
68
  class NamedRouteCollection
90
69
  include Enumerable
91
- attr_reader :routes, :url_helpers_module
70
+ attr_reader :routes, :url_helpers_module, :path_helpers_module
71
+ private :routes
92
72
 
93
73
  def initialize
94
74
  @routes = {}
@@ -103,14 +83,6 @@ module ActionDispatch
103
83
  @path_helpers.include?(key) || @url_helpers.include?(key)
104
84
  end
105
85
 
106
- def helpers
107
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
108
- `named_routes.helpers` is deprecated, please use `route_defined?(route_name)`
109
- to see if a named route was defined.
110
- MSG
111
- @path_helpers + @url_helpers
112
- end
113
-
114
86
  def helper_names
115
87
  @path_helpers.map(&:to_s) + @url_helpers.map(&:to_s)
116
88
  end
@@ -139,7 +111,7 @@ module ActionDispatch
139
111
  @url_helpers_module.send :undef_method, url_name
140
112
  end
141
113
  routes[key] = route
142
- define_url_helper @path_helpers_module, route, path_name, route.defaults, name, LEGACY
114
+ define_url_helper @path_helpers_module, route, path_name, route.defaults, name, PATH
143
115
  define_url_helper @url_helpers_module, route, url_name, route.defaults, name, UNKNOWN
144
116
 
145
117
  @path_helpers << path_name
@@ -151,6 +123,7 @@ module ActionDispatch
151
123
  end
152
124
 
153
125
  def key?(name)
126
+ return unless name
154
127
  routes.key? name.to_sym
155
128
  end
156
129
 
@@ -171,25 +144,6 @@ module ActionDispatch
171
144
  routes.length
172
145
  end
173
146
 
174
- def path_helpers_module(warn = false)
175
- if warn
176
- mod = @path_helpers_module
177
- helpers = @path_helpers
178
- Module.new do
179
- include mod
180
-
181
- helpers.each do |meth|
182
- define_method(meth) do |*args, &block|
183
- ActiveSupport::Deprecation.warn("The method `#{meth}` cannot be used here as a full URL is required. Use `#{meth.to_s.sub(/_path$/, '_url')}` instead")
184
- super(*args, &block)
185
- end
186
- end
187
- end
188
- else
189
- @path_helpers_module
190
- end
191
- end
192
-
193
147
  class UrlHelper
194
148
  def self.create(route, options, route_name, url_strategy)
195
149
  if optimize_helper?(route)
@@ -227,11 +181,8 @@ module ActionDispatch
227
181
  private
228
182
 
229
183
  def optimized_helper(args)
230
- params = parameterize_args(args)
231
- missing_keys = missing_keys(params)
232
-
233
- unless missing_keys.empty?
234
- raise_generation_error(params, missing_keys)
184
+ params = parameterize_args(args) do
185
+ raise_generation_error(args)
235
186
  end
236
187
 
237
188
  @route.format params
@@ -243,16 +194,21 @@ module ActionDispatch
243
194
 
244
195
  def parameterize_args(args)
245
196
  params = {}
246
- @required_parts.zip(args.map(&:to_param)) { |k,v| params[k] = v }
197
+ @arg_size.times { |i|
198
+ key = @required_parts[i]
199
+ value = args[i].to_param
200
+ yield key if value.nil? || value.empty?
201
+ params[key] = value
202
+ }
247
203
  params
248
204
  end
249
205
 
250
- def missing_keys(args)
251
- args.select{ |part, arg| arg.nil? || arg.empty? }.keys
252
- end
253
-
254
- def raise_generation_error(args, missing_keys)
255
- constraints = Hash[@route.requirements.merge(args).sort_by{|k,v| k.to_s}]
206
+ def raise_generation_error(args)
207
+ missing_keys = []
208
+ params = parameterize_args(args) { |missing_key|
209
+ missing_keys << missing_key
210
+ }
211
+ constraints = Hash[@route.requirements.merge(params).sort_by{|k,v| k.to_s}]
256
212
  message = "No route matches #{constraints.inspect}"
257
213
  message << " missing required keys: #{missing_keys.sort.inspect}"
258
214
 
@@ -272,7 +228,7 @@ module ActionDispatch
272
228
  controller_options = t.url_options
273
229
  options = controller_options.merge @options
274
230
  hash = handle_positional_args(controller_options,
275
- deprecate_string_options(inner_options) || {},
231
+ inner_options || {},
276
232
  args,
277
233
  options,
278
234
  @segment_keys)
@@ -293,33 +249,18 @@ module ActionDispatch
293
249
  path_params -= controller_options.keys
294
250
  path_params -= result.keys
295
251
  end
296
- path_params.each { |param|
297
- value = inner_options.fetch(param) { args.shift }
252
+ inner_options.each_key do |key|
253
+ path_params.delete(key)
254
+ end
298
255
 
299
- unless param == :format && value.nil?
300
- result[param] = value
301
- end
302
- }
256
+ args.each_with_index do |arg, index|
257
+ param = path_params[index]
258
+ result[param] = arg if param
259
+ end
303
260
  end
304
261
 
305
262
  result.merge!(inner_options)
306
263
  end
307
-
308
- DEPRECATED_STRING_OPTIONS = %w[controller action]
309
-
310
- def deprecate_string_options(options)
311
- options ||= {}
312
- deprecated_string_options = options.keys & DEPRECATED_STRING_OPTIONS
313
- if deprecated_string_options.any?
314
- msg = "Calling URL helpers with string keys #{deprecated_string_options.join(", ")} is deprecated. Use symbols instead."
315
- ActiveSupport::Deprecation.warn(msg)
316
- deprecated_string_options.each do |option|
317
- value = options.delete(option)
318
- options[option.to_sym] = value
319
- end
320
- end
321
- options
322
- end
323
264
  end
324
265
 
325
266
  private
@@ -350,38 +291,12 @@ module ActionDispatch
350
291
 
351
292
  # strategy for building urls to send to the client
352
293
  PATH = ->(options) { ActionDispatch::Http::URL.path_for(options) }
353
- FULL = ->(options) { ActionDispatch::Http::URL.full_url_for(options) }
354
294
  UNKNOWN = ->(options) { ActionDispatch::Http::URL.url_for(options) }
355
- LEGACY = ->(options) {
356
- if options.key?(:only_path)
357
- if options[:only_path]
358
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
359
- You are calling a `*_path` helper with the `only_path` option
360
- explicitly set to `true`. This option will stop working on
361
- path helpers in Rails 5. Simply remove the `only_path: true`
362
- argument from your call as it is redundant when applied to a
363
- path helper.
364
- MSG
365
-
366
- PATH.call(options)
367
- else
368
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
369
- You are calling a `*_path` helper with the `only_path` option
370
- explicitly set to `false`. This option will stop working on
371
- path helpers in Rails 5. Use the corresponding `*_url` helper
372
- instead.
373
- MSG
374
-
375
- FULL.call(options)
376
- end
377
- else
378
- PATH.call(options)
379
- end
380
- }
381
295
 
382
296
  attr_accessor :formatter, :set, :named_routes, :default_scope, :router
383
297
  attr_accessor :disable_clear_and_finalize, :resources_path_names
384
- attr_accessor :default_url_options, :request_class
298
+ attr_accessor :default_url_options
299
+ attr_reader :env_key
385
300
 
386
301
  alias :routes :set
387
302
 
@@ -389,21 +304,58 @@ module ActionDispatch
389
304
  { :new => 'new', :edit => 'edit' }
390
305
  end
391
306
 
392
- def initialize(request_class = ActionDispatch::Request)
307
+ def self.new_with_config(config)
308
+ route_set_config = DEFAULT_CONFIG
309
+
310
+ # engines apparently don't have this set
311
+ if config.respond_to? :relative_url_root
312
+ route_set_config.relative_url_root = config.relative_url_root
313
+ end
314
+
315
+ if config.respond_to? :api_only
316
+ route_set_config.api_only = config.api_only
317
+ end
318
+
319
+ new route_set_config
320
+ end
321
+
322
+ Config = Struct.new :relative_url_root, :api_only
323
+
324
+ DEFAULT_CONFIG = Config.new(nil, false)
325
+
326
+ def initialize(config = DEFAULT_CONFIG)
393
327
  self.named_routes = NamedRouteCollection.new
394
328
  self.resources_path_names = self.class.default_resources_path_names
395
329
  self.default_url_options = {}
396
- self.request_class = request_class
397
330
 
331
+ @config = config
398
332
  @append = []
399
333
  @prepend = []
400
334
  @disable_clear_and_finalize = false
401
335
  @finalized = false
336
+ @env_key = "ROUTES_#{object_id}_SCRIPT_NAME".freeze
402
337
 
403
338
  @set = Journey::Routes.new
404
339
  @router = Journey::Router.new @set
405
- @formatter = Journey::Formatter.new @set
340
+ @formatter = Journey::Formatter.new self
341
+ end
342
+
343
+ def relative_url_root
344
+ @config.relative_url_root
345
+ end
346
+
347
+ def api_only?
348
+ @config.api_only
349
+ end
350
+
351
+ def request_class
352
+ ActionDispatch::Request
353
+ end
354
+
355
+ def make_request(env)
356
+ request_class.new env
406
357
  end
358
+ private :make_request
407
359
 
408
360
  def draw(&block)
409
361
  clear! unless @disable_clear_and_finalize
@@ -421,10 +373,6 @@ module ActionDispatch
421
373
  end
422
374
 
423
375
  def eval_block(block)
424
- if block.arity == 1
425
- raise "You are using the old router DSL which has been removed in Rails 3.1. " <<
426
- "Please check how to update your routes file at: http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/"
427
- end
428
376
  mapper = Mapper.new(self)
429
377
  if default_scope
430
378
  mapper.with_default_scope(default_scope, &block)
@@ -448,10 +396,6 @@ module ActionDispatch
448
396
  @prepend.each { |blk| eval_block(blk) }
449
397
  end
450
398
 
451
- def dispatcher(defaults)
452
- Routing::RouteSet::Dispatcher.new(defaults)
453
- end
454
-
455
399
  module MountedHelpers
456
400
  extend ActiveSupport::Concern
457
401
  include UrlFor
@@ -495,7 +439,14 @@ module ActionDispatch
495
439
  # Rails.application.routes.url_helpers.url_for(args)
496
440
  @_routes = routes
497
441
  class << self
498
- delegate :url_for, :optimize_routes_generation?, to: '@_routes'
442
+ def url_for(options)
443
+ @_routes.url_for(options)
444
+ end
445
+
446
+ def optimize_routes_generation?
447
+ @_routes.optimize_routes_generation?
448
+ end
449
+
499
450
  attr_reader :_routes
500
451
  def url_options; {}; end
501
452
  end
@@ -513,12 +464,10 @@ module ActionDispatch
513
464
 
514
465
  if supports_path
515
466
  path_helpers = routes.named_routes.path_helpers_module
516
- else
517
- path_helpers = routes.named_routes.path_helpers_module(true)
518
- end
519
467
 
520
- include path_helpers
521
- extend path_helpers
468
+ include path_helpers
469
+ extend path_helpers
470
+ end
522
471
 
523
472
  # plus a singleton class method called _routes ...
524
473
  included do
@@ -542,7 +491,7 @@ module ActionDispatch
542
491
  routes.empty?
543
492
  end
544
493
 
545
- def add_route(app, conditions = {}, requirements = {}, defaults = {}, name = nil, anchor = true)
494
+ def add_route(mapping, path_ast, name, anchor)
546
495
  raise ArgumentError, "Invalid route name: '#{name}'" unless name.blank? || name.to_s.match(/^[_a-z]\w*$/i)
547
496
 
548
497
  if name && named_routes[name]
@@ -553,74 +502,17 @@ module ActionDispatch
553
502
  "http://guides.rubyonrails.org/routing.html#restricting-the-routes-created"
554
503
  end
555
504
 
556
- path = conditions.delete :path_info
557
- ast = conditions.delete :parsed_path_info
558
- path = build_path(path, ast, requirements, anchor)
559
- conditions = build_conditions(conditions, path.names.map { |x| x.to_sym })
560
-
561
- route = @set.add_route(app, path, conditions, defaults, name)
505
+ route = @set.add_route(name, mapping)
562
506
  named_routes[name] = route if name
563
507
  route
564
508
  end
565
509
 
566
- def build_path(path, ast, requirements, anchor)
567
- strexp = Journey::Router::Strexp.new(
568
- ast,
569
- path,
570
- requirements,
571
- SEPARATORS,
572
- anchor)
573
-
574
- pattern = Journey::Path::Pattern.new(strexp)
575
-
576
- builder = Journey::GTG::Builder.new pattern.spec
577
-
578
- # Get all the symbol nodes followed by literals that are not the
579
- # dummy node.
580
- symbols = pattern.spec.grep(Journey::Nodes::Symbol).find_all { |n|
581
- builder.followpos(n).first.literal?
582
- }
583
-
584
- # Get all the symbol nodes preceded by literals.
585
- symbols.concat pattern.spec.find_all(&:literal?).map { |n|
586
- builder.followpos(n).first
587
- }.find_all(&:symbol?)
588
-
589
- symbols.each { |x|
590
- x.regexp = /(?:#{Regexp.union(x.regexp, '-')})+/
591
- }
592
-
593
- pattern
594
- end
595
- private :build_path
596
-
597
- def build_conditions(current_conditions, path_values)
598
- conditions = current_conditions.dup
599
-
600
- # Rack-Mount requires that :request_method be a regular expression.
601
- # :request_method represents the HTTP verb that matches this route.
602
- #
603
- # Here we munge values before they get sent on to rack-mount.
604
- verbs = conditions[:request_method] || []
605
- unless verbs.empty?
606
- conditions[:request_method] = %r[^#{verbs.join('|')}$]
607
- end
608
-
609
- conditions.keep_if do |k, _|
610
- k == :action || k == :controller || k == :required_defaults ||
611
- @request_class.public_method_defined?(k) || path_values.include?(k)
612
- end
613
- end
614
- private :build_conditions
615
-
616
510
  class Generator
617
511
  PARAMETERIZE = lambda do |name, value|
618
512
  if name == :controller
619
513
  value
620
- elsif value.is_a?(Array)
621
- value.map { |v| v.to_param }.join('/')
622
- elsif param = value.to_param
623
- param
514
+ else
515
+ value.to_param
624
516
  end
625
517
  end
626
518
 
@@ -628,8 +520,8 @@ module ActionDispatch
628
520
 
629
521
  def initialize(named_route, options, recall, set)
630
522
  @named_route = named_route
631
- @options = options.dup
632
- @recall = recall.dup
523
+ @options = options
524
+ @recall = recall
633
525
  @set = set
634
526
 
635
527
  normalize_recall!
@@ -651,7 +543,7 @@ module ActionDispatch
651
543
  def use_recall_for(key)
652
544
  if @recall[key] && (!@options.key?(key) || @options[key] == @recall[key])
653
545
  if !named_route_exists? || segment_keys.include?(key)
654
- @options[key] = @recall.delete(key)
546
+ @options[key] = @recall[key]
655
547
  end
656
548
  end
657
549
  end
@@ -705,12 +597,18 @@ module ActionDispatch
705
597
 
706
598
  # Remove leading slashes from controllers
707
599
  def normalize_controller!
708
- @options[:controller] = controller.sub(%r{^/}, '') if controller
600
+ if controller
601
+ if controller.start_with?("/".freeze)
602
+ @options[:controller] = controller[1..-1]
603
+ else
604
+ @options[:controller] = controller
605
+ end
606
+ end
709
607
  end
710
608
 
711
609
  # Move 'index' action from options to recall
712
610
  def normalize_action!
713
- if @options[:action] == 'index'
611
+ if @options[:action] == 'index'.freeze
714
612
  @recall[:action] = @options.delete(:action)
715
613
  end
716
614
  end
@@ -812,7 +710,7 @@ module ActionDispatch
812
710
  end
813
711
 
814
712
  def call(env)
815
- req = request_class.new(env)
713
+ req = make_request(env)
816
714
  req.path_info = Journey::Router::Utils.normalize_path(req.path_info)
817
715
  @router.serve(req)
818
716
  end
@@ -828,7 +726,7 @@ module ActionDispatch
828
726
  raise ActionController::RoutingError, e.message
829
727
  end
830
728
 
831
- req = request_class.new(env)
729
+ req = make_request(env)
832
730
  @router.recognize(req) do |route, params|
833
731
  params.merge!(extras)
834
732
  params.each do |key, value|
@@ -841,14 +739,13 @@ module ActionDispatch
841
739
  req.path_parameters = old_params.merge params
842
740
  app = route.app
843
741
  if app.matches?(req) && app.dispatcher?
844
- dispatcher = app.app
845
-
846
- if dispatcher.controller(params, false)
847
- dispatcher.prepare_params!(params)
848
- return params
849
- else
742
+ begin
743
+ req.controller_class
744
+ rescue NameError
850
745
  raise ActionController::RoutingError, "A route matches #{path.inspect}, but references missing controller: #{params[:controller].camelize}Controller"
851
746
  end
747
+
748
+ return req.path_parameters
852
749
  end
853
750
  end
854
751