Class ActionController::Routing::DynamicSegment
In: vendor/rails/actionpack/lib/action_controller/routing.rb
Parent: Segment

Methods

Attributes

default  [RW] 
key  [RW] 
regexp  [RW] 

Public Class methods

[Source]

     # File vendor/rails/actionpack/lib/action_controller/routing.rb, line 642
642:       def initialize(key = nil, options = {})
643:         super()
644:         self.key = key
645:         self.default = options[:default] if options.key? :default
646:         self.is_optional = true if options[:optional] || options.key?(:default)
647:       end

Public Instance methods

[Source]

     # File vendor/rails/actionpack/lib/action_controller/routing.rb, line 708
708:       def build_pattern(pattern)
709:         chunk = regexp_chunk
710:         chunk = "(#{chunk})" if Regexp.new(chunk).number_of_captures == 0
711:         pattern = "#{chunk}#{pattern}"
712:         optional? ? Regexp.optionalize(pattern) : pattern
713:       end

[Source]

     # File vendor/rails/actionpack/lib/action_controller/routing.rb, line 672
672:       def expiry_statement
673:         "not_expired, hash = false, options if not_expired && expire_on[:#{key}]"
674:       end

[Source]

     # File vendor/rails/actionpack/lib/action_controller/routing.rb, line 658
658:       def extract_value
659:         "#{local_name} = hash[:#{key}] #{"|| #{default.inspect}" if default}"
660:       end

[Source]

     # File vendor/rails/actionpack/lib/action_controller/routing.rb, line 676
676:       def extraction_code
677:         s = extract_value
678:         vc = value_check
679:         s << "\nreturn [nil,nil] unless #{vc}" if vc
680:         s << "\n#{expiry_statement}"
681:       end

[Source]

     # File vendor/rails/actionpack/lib/action_controller/routing.rb, line 683
683:       def interpolation_chunk
684:         "\#{CGI.escape(#{local_name}.to_s)}"
685:       end

The local variable name that the value of this segment will be extracted to.

[Source]

     # File vendor/rails/actionpack/lib/action_controller/routing.rb, line 654
654:       def local_name
655:         "#{key}_value"
656:       end

[Source]

     # File vendor/rails/actionpack/lib/action_controller/routing.rb, line 714
714:       def match_extraction(next_capture)
715:         hangon = (default ? "|| #{default.inspect}" : "if match[#{next_capture}]")
716:         
717:         # All non code-related keys (such as :id, :slug) have to be unescaped as other CGI params
718:         "params[:#{key}] = match[#{next_capture}] #{hangon}"
719:       end

[Source]

     # File vendor/rails/actionpack/lib/action_controller/routing.rb, line 721
721:       def optionality_implied?
722:         [:action, :id].include? key
723:       end

[Source]

     # File vendor/rails/actionpack/lib/action_controller/routing.rb, line 704
704:       def regexp_chunk
705:         regexp ? "(#{regexp.source})" : "([^#{Routing::SEPARATORS.join}]+)"
706:       end

[Source]

     # File vendor/rails/actionpack/lib/action_controller/routing.rb, line 687
687:       def string_structure(prior_segments)
688:         if optional? # We have a conditional to do...
689:           # If we should not appear in the url, just write the code for the prior
690:           # segments. This occurs if our value is the default value, or, if we are
691:           # optional, if we have nil as our value.
692:           "if #{local_name} == #{default.inspect}\n" + 
693:             continue_string_structure(prior_segments) + 
694:           "\nelse\n" + # Otherwise, write the code up to here
695:             "#{interpolation_statement(prior_segments)}\nend"
696:         else
697:           interpolation_statement(prior_segments)
698:         end
699:       end

[Source]

     # File vendor/rails/actionpack/lib/action_controller/routing.rb, line 649
649:       def to_s
650:         ":#{key}"
651:       end

[Source]

     # File vendor/rails/actionpack/lib/action_controller/routing.rb, line 661
661:       def value_check
662:         if default # Then we know it won't be nil
663:           "#{value_regexp.inspect} =~ #{local_name}" if regexp
664:         elsif optional?
665:           # If we have a regexp check that the value is not given, or that it matches.
666:           # If we have no regexp, return nil since we do not require a condition.
667:           "#{local_name}.nil? || #{value_regexp.inspect} =~ #{local_name}" if regexp
668:         else # Then it must be present, and if we have a regexp, it must match too.
669:           "#{local_name} #{"&& #{value_regexp.inspect} =~ #{local_name}" if regexp}"
670:         end
671:       end

[Source]

     # File vendor/rails/actionpack/lib/action_controller/routing.rb, line 701
701:       def value_regexp
702:         Regexp.new "\\A#{regexp.source}\\Z" if regexp
703:       end

[Validate]