Class: ActionController::Routing::Optimisation::PositionalArguments

Inherits:
Optimiser
  • Object
show all
Defined in:
lib/action_controller/routing/optimisations.rb

Overview

Given a route

map.person '/people/:id'

If the user calls person_url(@person), we can simply return a string like “/people/#@[email protected]_param” rather than triggering the expensive logic in url_for.

Direct Known Subclasses

PositionalArgumentsWithAdditionalParams

Instance Attribute Summary

Attributes inherited from Optimiser

#kind, #route

Instance Method Summary collapse

Methods inherited from Optimiser

#applicable?, #initialize, #source_code

Constructor Details

This class inherits a constructor from ActionController::Routing::Optimisation::Optimiser

Instance Method Details

#generation_codeObject



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/action_controller/routing/optimisations.rb', line 70

def generation_code
  elements = []
  idx = 0

  if kind == :url
    elements << '#{request.protocol}'
    elements << '#{request.host_with_port}'
  end

  elements << '#{request.relative_url_root if request.relative_url_root}'

  # The last entry in <tt>route.segments</tt> appears to *always* be a
  # 'divider segment' for '/' but we have assertions to ensure that
  # we don't include the trailing slashes, so skip them.
  (route.segments.size == 1 ? route.segments : route.segments[0..-2]).each do |segment|
    if segment.is_a?(DynamicSegment)
      elements << segment.interpolation_chunk("args[#{idx}].to_param")
      idx += 1
    else
      elements << segment.interpolation_chunk
    end
  end
  %("#{elements * ''}")
end

#guard_conditionObject



59
60
61
62
63
64
65
66
67
68
# File 'lib/action_controller/routing/optimisations.rb', line 59

def guard_condition
  number_of_arguments = route.segment_keys.size
  # if they're using foo_url(:id=>2) it's one 
  # argument, but we don't want to generate /foos/id2
  if number_of_arguments == 1
    "(!defined?(default_url_options) || default_url_options.blank?) && defined?(request) && request && args.size == 1 && !args.first.is_a?(Hash)"
  else
    "(!defined?(default_url_options) || default_url_options.blank?) && defined?(request) && request && args.size == #{number_of_arguments}"
  end
end