class Granite::Dispatcher

Public Instance Methods

call(*) click to toggle source
# File lib/granite/dispatcher.rb, line 12
def call(*)
  # Pretend to be a Rack app, however we are still dispatcher, so this method should never be called
  # see lib/granite/routing/mapping.rb for more info.
  fail 'Dispatcher can\'t be used as a Rack app.'
end
constraints() click to toggle source
# File lib/granite/dispatcher.rb, line 23
def constraints
  [->(req) { detect_controller_class_and_action_name(req).all?(&:present?) }]
end
controller(params, *_args) click to toggle source
# File lib/granite/dispatcher.rb, line 27
def controller(params, *_args)
  projector(*params.values_at(:granite_action, :granite_projector))&.controller_class
end
prepare_params!(params, *_args) click to toggle source
# File lib/granite/dispatcher.rb, line 31
def prepare_params!(params, *_args)
  params
end
reset!() click to toggle source

Make dispatcher object pristine, clean memoist cache.

# File lib/granite/dispatcher.rb, line 8
def reset!
  unmemoize_all
end
serve(req) click to toggle source
# File lib/granite/dispatcher.rb, line 18
def serve(req)
  controller, action = detect_controller_class_and_action_name(req)
  controller.action(action).call(req.env)
end

Private Instance Methods

action_name(request_method_symbol, granite_action, granite_projector, projector_action) click to toggle source
# File lib/granite/dispatcher.rb, line 47
        def action_name(request_method_symbol, granite_action, granite_projector, projector_action)
  projector = projector(granite_action, granite_projector)
  return unless projector

  projector.action_for(request_method_symbol, projector_action.to_s)
end
business_action(granite_action) click to toggle source
# File lib/granite/dispatcher.rb, line 60
        def business_action(granite_action)
  granite_action.camelize.safe_constantize ||
    fail(ActionController::RoutingError, "Granite action '#{granite_action}' is mounted but class '#{granite_action.camelize}' can't be found")
end
detect_controller_class_and_action_name(req) click to toggle source
# File lib/granite/dispatcher.rb, line 37
def detect_controller_class_and_action_name(req)
  [
    controller(req.params),
    action_name(
      req.request_method_symbol,
      *req.params.values_at(:granite_action, :granite_projector, :projector_action)
    )
  ]
end
projector(granite_action, granite_projector) click to toggle source
# File lib/granite/dispatcher.rb, line 54
        def projector(granite_action, granite_projector)
  action = business_action(granite_action)

  action.public_send(granite_projector) if action.respond_to?(granite_projector)
end