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.



35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/action_dispatch/routing/mapper.rb', line 35

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.



30
31
32
# File 'lib/action_dispatch/routing/mapper.rb', line 30

def app
  @app
end

#constraintsObject (readonly)

Returns the value of attribute constraints.



30
31
32
# File 'lib/action_dispatch/routing/mapper.rb', line 30

def constraints
  @constraints
end

Instance Method Details

#dispatcher?Boolean

Returns:

  • (Boolean)


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

def dispatcher?; @strategy == SERVE; end

#matches?(req) ⇒ Boolean

Returns:

  • (Boolean)


52
53
54
55
56
57
# File 'lib/action_dispatch/routing/mapper.rb', line 52

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



59
60
61
62
63
# File 'lib/action_dispatch/routing/mapper.rb', line 59

def serve(req)
  return [ 404, { Constants::X_CASCADE => "pass" }, [] ] unless matches?(req)

  @strategy.call @app, req
end