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