Class: ActionDispatch::Journey::Route

Inherits:
Object
  • Object
show all
Defined in:
lib/action_dispatch/journey/route.rb

Defined Under Namespace

Modules: VerbMatchers

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name:, app: nil, path:, constraints: {}, required_defaults: [], defaults: {}, request_method_match: nil, precedence: 0, scope_options: {}, internal: false, source_location: nil) ⇒ Route

path is a path constraint. constraints is a hash of constraints to be applied to this route.



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/action_dispatch/journey/route.rb', line 56

def initialize(name:, app: nil, path:, constraints: {}, required_defaults: [], defaults: {}, request_method_match: nil, precedence: 0, scope_options: {}, internal: false, source_location: nil)
  @name        = name
  @app         = app
  @path        = path

  @request_method_match = request_method_match
  @constraints = constraints
  @defaults    = defaults
  @required_defaults = nil
  @_required_defaults = required_defaults
  @required_parts    = nil
  @parts             = nil
  @precedence        = precedence
  @path_formatter    = @path.build_formatter
  @scope_options     = scope_options
  @internal          = internal
  @source_location   = source_location

  @ast = @path.ast.root
  @path.ast.route = self
end

Instance Attribute Details

#appObject (readonly)

Returns the value of attribute app.



7
8
9
# File 'lib/action_dispatch/journey/route.rb', line 7

def app
  @app
end

#astObject (readonly)

Returns the value of attribute ast.



7
8
9
# File 'lib/action_dispatch/journey/route.rb', line 7

def ast
  @ast
end

#constraintsObject (readonly) Also known as: conditions

Returns the value of attribute constraints.



7
8
9
# File 'lib/action_dispatch/journey/route.rb', line 7

def constraints
  @constraints
end

#defaultsObject (readonly)

Returns the value of attribute defaults.



7
8
9
# File 'lib/action_dispatch/journey/route.rb', line 7

def defaults
  @defaults
end

#internalObject (readonly)

Returns the value of attribute internal.



7
8
9
# File 'lib/action_dispatch/journey/route.rb', line 7

def internal
  @internal
end

#nameObject (readonly)

Returns the value of attribute name.



7
8
9
# File 'lib/action_dispatch/journey/route.rb', line 7

def name
  @name
end

#pathObject (readonly)

Returns the value of attribute path.



7
8
9
# File 'lib/action_dispatch/journey/route.rb', line 7

def path
  @path
end

#precedenceObject (readonly)

Returns the value of attribute precedence.



7
8
9
# File 'lib/action_dispatch/journey/route.rb', line 7

def precedence
  @precedence
end

#scope_optionsObject (readonly)

Returns the value of attribute scope_options.



7
8
9
# File 'lib/action_dispatch/journey/route.rb', line 7

def scope_options
  @scope_options
end

#source_locationObject (readonly)

Returns the value of attribute source_location.



7
8
9
# File 'lib/action_dispatch/journey/route.rb', line 7

def source_location
  @source_location
end

Class Method Details

.verb_matcher(verb) ⇒ Object



47
48
49
50
51
# File 'lib/action_dispatch/journey/route.rb', line 47

def self.verb_matcher(verb)
  VerbMatchers::VERB_TO_CLASS.fetch(verb) do
    VerbMatchers::Unknown.new verb.to_s.dasherize.upcase
  end
end

Instance Method Details

#dispatcher?Boolean

Returns:

  • (Boolean)


142
143
144
# File 'lib/action_dispatch/journey/route.rb', line 142

def dispatcher?
  @app.dispatcher?
end

#eager_load!Object



78
79
80
81
82
83
# File 'lib/action_dispatch/journey/route.rb', line 78

def eager_load!
  path.eager_load!
  parts
  required_defaults
  nil
end

#format(path_options) ⇒ Object



120
121
122
# File 'lib/action_dispatch/journey/route.rb', line 120

def format(path_options)
  @path_formatter.evaluate path_options
end

#glob?Boolean

Returns:

  • (Boolean)


138
139
140
# File 'lib/action_dispatch/journey/route.rb', line 138

def glob?
  path.ast.glob?
end

#ipObject



164
165
166
# File 'lib/action_dispatch/journey/route.rb', line 164

def ip
  constraints[:ip] || //
end

#matches?(request) ⇒ Boolean

Returns:

  • (Boolean)


146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/action_dispatch/journey/route.rb', line 146

def matches?(request)
  match_verb(request) &&
  constraints.all? { |method, value|
    case value
    when Regexp, String
      value === request.send(method).to_s
    when Array
      value.include?(request.send(method))
    when TrueClass
      request.send(method).present?
    when FalseClass
      request.send(method).blank?
    else
      value === request.send(method)
    end
  }
end

#partsObject Also known as: segment_keys



115
116
117
# File 'lib/action_dispatch/journey/route.rb', line 115

def parts
  @parts ||= segments.map(&:to_sym)
end

#required_default?(key) ⇒ Boolean

Returns:

  • (Boolean)


128
129
130
# File 'lib/action_dispatch/journey/route.rb', line 128

def required_default?(key)
  @_required_defaults.include?(key)
end

#required_defaultsObject



132
133
134
135
136
# File 'lib/action_dispatch/journey/route.rb', line 132

def required_defaults
  @required_defaults ||= @defaults.dup.delete_if do |k, _|
    parts.include?(k) || !required_default?(k)
  end
end

#required_keysObject



103
104
105
# File 'lib/action_dispatch/journey/route.rb', line 103

def required_keys
  required_parts + required_defaults.keys
end

#required_partsObject



124
125
126
# File 'lib/action_dispatch/journey/route.rb', line 124

def required_parts
  @required_parts ||= path.required_names.map(&:to_sym)
end

#requirementsObject

Needed for ‘bin/rails routes`. Picks up succinctly defined requirements for a route, for example route

get 'photo/:id', :controller => 'photos', :action => 'show',
  :id => /[A-Z]\d{5}/

will have :action=>“show”, :id=>/d{5/} as requirements.



93
94
95
96
97
# File 'lib/action_dispatch/journey/route.rb', line 93

def requirements
  @defaults.merge(path.requirements).delete_if { |_, v|
    /.+?/m == v
  }
end

#requires_matching_verb?Boolean

Returns:

  • (Boolean)


168
169
170
# File 'lib/action_dispatch/journey/route.rb', line 168

def requires_matching_verb?
  !@request_method_match.all? { |x| x == VerbMatchers::All }
end

#score(supplied_keys) ⇒ Object



107
108
109
110
111
112
113
# File 'lib/action_dispatch/journey/route.rb', line 107

def score(supplied_keys)
  path.required_names.each do |k|
    return -1 unless supplied_keys.include?(k)
  end

  (required_defaults.length * 2) + path.names.count { |k| supplied_keys.include?(k) }
end

#segmentsObject



99
100
101
# File 'lib/action_dispatch/journey/route.rb', line 99

def segments
  path.names
end

#verbObject



172
173
174
# File 'lib/action_dispatch/journey/route.rb', line 172

def verb
  verbs.join("|")
end