Class: ActionDispatch::Routing::Mapper::Constraints

Inherits:
Endpoint
  • Object
show all
Defined in:
lib/action_dispatch/routing/mapper.rb

Overview

:nodoc:

Constant Summary collapse

SERVE =
->(app, req) { app.serve req }
CALL =
->(app, req) { app.call req.env }

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Endpoint

#engine?, #rack_app, #redirect?

Constructor Details

#initialize(app, constraints, strategy) ⇒ Constraints

Returns a new instance of Constraints.



22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/action_dispatch/routing/mapper.rb', line 22

def initialize(app, constraints, strategy)
  # Unwrap Constraints objects. I don't actually think it's possible
  # to pass a Constraints object to this constructor, but there were
  # multiple places that kept testing children of this object. I
  # *think* they were just being defensive, but I have no idea.
  if app.is_a?(self.class)
    constraints += app.constraints
    app = app.app
  end

  @strategy = strategy

  @app, @constraints, = app, constraints
end

Instance Attribute Details

#appObject (readonly)

Returns the value of attribute app.



17
18
19
# File 'lib/action_dispatch/routing/mapper.rb', line 17

def app
  @app
end

#constraintsObject (readonly)

Returns the value of attribute constraints.



17
18
19
# File 'lib/action_dispatch/routing/mapper.rb', line 17

def constraints
  @constraints
end

Instance Method Details

#dispatcher?Boolean

Returns:

  • (Boolean)


37
# File 'lib/action_dispatch/routing/mapper.rb', line 37

def dispatcher?; @strategy == SERVE; end

#matches?(req) ⇒ Boolean

Returns:

  • (Boolean)


39
40
41
42
43
44
# File 'lib/action_dispatch/routing/mapper.rb', line 39

def matches?(req)
  @constraints.all? do |constraint|
    (constraint.respond_to?(:matches?) && constraint.matches?(req)) ||
      (constraint.respond_to?(:call) && constraint.call(*constraint_args(constraint, req)))
  end
end

#serve(req) ⇒ Object



46
47
48
49
50
# File 'lib/action_dispatch/routing/mapper.rb', line 46

def serve(req)
  return [ 404, { "X-Cascade" => "pass" }, [] ] unless matches?(req)

  @strategy.call @app, req
end