diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2015-03-02 11:26:23 -0800 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2015-03-02 11:26:23 -0800 |
commit | 0814bb62e5128aff7bfa55211efbd10ad3e37c07 (patch) | |
tree | 3688e7f0cf65f203c1dc43277d574375a1d881fc /actionpack/lib | |
parent | b1051c5dfa0a5d9f7bb672ce9223167d1b5415a9 (diff) | |
download | rails-0814bb62e5128aff7bfa55211efbd10ad3e37c07.tar.gz rails-0814bb62e5128aff7bfa55211efbd10ad3e37c07.tar.bz2 rails-0814bb62e5128aff7bfa55211efbd10ad3e37c07.zip |
be optimistic about missing route keys
this patch makes errors slightly more expensive when someone is missing
a route key, but in exchange it drops 4 allocations per `url_for` call.
Since missing a route key is an error, optimizing for the non-error path
seems like a good trade off
Diffstat (limited to 'actionpack/lib')
-rw-r--r-- | actionpack/lib/action_dispatch/routing/route_set.rb | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/actionpack/lib/action_dispatch/routing/route_set.rb b/actionpack/lib/action_dispatch/routing/route_set.rb index 652936929f..58b3fff9d7 100644 --- a/actionpack/lib/action_dispatch/routing/route_set.rb +++ b/actionpack/lib/action_dispatch/routing/route_set.rb @@ -199,12 +199,9 @@ module ActionDispatch private def optimized_helper(args) - params = parameterize_args(args) - missing_keys = missing_keys(params) - - unless missing_keys.empty? - raise_generation_error(params, missing_keys) - end + params = parameterize_args(args) { |k| + raise_generation_error(args) + } @route.format params end @@ -215,16 +212,21 @@ module ActionDispatch def parameterize_args(args) params = {} - @arg_size.times { |i| params[@required_parts[i]] = args[i].to_param } + @arg_size.times { |i| + key = @required_parts[i] + value = args[i].to_param + yield key if value.nil? || value.empty? + params[key] = value + } params end - def missing_keys(args) - args.select{ |part, arg| arg.nil? || arg.empty? }.keys - end - - def raise_generation_error(args, missing_keys) - constraints = Hash[@route.requirements.merge(args).sort] + def raise_generation_error(args) + missing_keys = [] + params = parameterize_args(args) { |missing_key| + missing_keys << missing_key + } + constraints = Hash[@route.requirements.merge(params).sort] message = "No route matches #{constraints.inspect}" message << " missing required keys: #{missing_keys.sort.inspect}" |