Class ActionController::Routing::Optimisation::PositionalArguments
In: actionpack/lib/action_controller/routing_optimisation.rb
Parent: Optimiser

Given a route: map.person ’/people/:id’

If the user calls person_url(@person), we can simply return a string like "/people/#{@person.to_param}" rather than triggering the expensive logic in url_for

Methods

Public Instance methods

[Source]

# File actionpack/lib/action_controller/routing_optimisation.rb, line 69
        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 route.segments 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

[Source]

# File actionpack/lib/action_controller/routing_optimisation.rb, line 58
        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?(request) && request && args.size == 1 && !args.first.is_a?(Hash)"
          else
            "defined?(request) && request && args.size == #{number_of_arguments}"
          end
        end

[Validate]