Class: ActionController::Routing::Optimisation::PositionalArguments
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
Constant Summary
Constants inherited from Optimiser
Optimiser::GLOBAL_GUARD_CONDITIONS
Instance Attribute Summary
Attributes inherited from Optimiser
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_code ⇒ Object
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_conditions ⇒ Object
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 |