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