module Roda::RodaPlugins::Controller::InstanceMethods

Public Instance Methods

controller(to, args: nil, inject: nil) click to toggle source
# File lib/roda/plugins/controller.rb, line 94
def controller(to, args: nil, inject: nil)
  controller_key, action = to.to_s.split('#')

  result = dispatch(to, args: args, inject: inject)

  view("#{controller_key}/#{action}")
end
dispatch(to, args: nil, inject: nil) click to toggle source
# File lib/roda/plugins/controller.rb, line 59
def dispatch(to, args: nil, inject: nil)
  controller_key, action = to.to_s.split('#')
  controllers = opts[:controller][:registered_controllers]
  controller = controllers[controller_key.to_sym]

  inject ||= opts[:controller][:inject]

  if inject.respond_to?(:to_proc)
    controller_args = Array(instance_exec(&inject))
  else
    controller_args = Array(inject)
  end

  if controller.respond_to?(:to_proc)
    controller = controller.to_proc.call(*controller_args)
  elsif controller.kind_of?(Class)
    controller = controller.new(*controller_args)
  end

  response = controller.send(action, *Array(args))

  responds_with = controller.instance_variable_get(:@responds_with)
  responds_with ||= {}

  responds_with.each do |var, val|
    ivar = :"@#{var}"

    if !instance_variable_defined?(ivar)
      instance_variable_set(ivar, val)
    end
  end

  response
end