class Multiview::Manager

Attributes

versions_map[R]

Public Class Methods

new(versions_map) click to toggle source

Params:

config: {controller_path: version
# File lib/multiview/manager.rb, line 7
def initialize(versions_map)
  @versions_map = versions_map.symbolize_keys
end

Public Instance Methods

dispatch(env, controller_path, action_name, version = nil) click to toggle source
# File lib/multiview/manager.rb, line 11
def dispatch(env, controller_path, action_name, version = nil)
  version ||= find_version(controller_path)
  return if version.nil?

  class_name = "#{version}/#{controller_path}_controller".camelize
  ctrl_cls = class_name.safe_constantize
  new_action_name = "#{class_name}##{action_name}"
  env['multiview'] = {version: version}.with_indifferent_access

  if ctrl_cls && ctrl_cls.public_method_defined?(action_name)
    Rails.logger.debug("[Multiview] Dispatch to #{new_action_name}")
    action_block = ctrl_cls.action(action_name)
    action_block.call(env)
  else
    Rails.logger.warn("[Multiview] Not found #{new_action_name}")
    nil
  end
end
find_version(path) click to toggle source
# File lib/multiview/manager.rb, line 50
def find_version(path)
  versions_map[path.to_sym]
end
redispatch(controller, controller_path = nil, action_name = nil, version = nil) click to toggle source
# File lib/multiview/manager.rb, line 30
def redispatch(controller, controller_path = nil, action_name = nil, version = nil)
  controller_path ||= controller.params[:controller]
  action_name ||= controller.params[:action]
  version ||= find_version(controller_path)
  return unless version

  result = try_dispatch(controller.request.env, controller_path, action_name, version)
  if result
    res = controller.response
    status, headers, body = result
    res.status = status
    res.header.clear
    res.header.merge!(headers)
    controller.response_body = body
  else
    # no action, just use views
    load_version_view(controller, version)
  end
end

Private Instance Methods

load_version_view(controller, version) click to toggle source
# File lib/multiview/manager.rb, line 57
def load_version_view(controller, version)
  return if version.to_sym == :v1
  Rails.logger.warn("[Multiview] Prepend view path app/views/#{version}")
  controller.prepend_view_path(Rails.root.join("app/views/#{version}"))
end
try_dispatch(env, path, action, version) click to toggle source
# File lib/multiview/manager.rb, line 63
def try_dispatch(env, path, action, version)
  return if env['multiview']
  dispatch(env, path, action, version)
end