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

Constant Summary

Constants inherited from Optimiser

Optimiser::GLOBAL_GUARD_CONDITIONS

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


78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/action_controller/routing/optimisations.rb', line 78

def generation_code
  elements = []
  idx = 0

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

  elements << '#{ActionController::Base.relative_url_root if ActionController::Base.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_conditionsObject


67
68
69
70
71
72
73
74
75
76
# File 'lib/action_controller/routing/optimisations.rb', line 67

def guard_conditions
  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
    ["args.size == 1", "!args.first.is_a?(Hash)"]
  else
    ["args.size == #{number_of_arguments}"]
  end
end