class FoxPage::Router

Constants

RESOURCE_ACTIONS

Attributes

routes[R]

Public Class Methods

draw_routes(&block) click to toggle source
# File lib/fox_page/router.rb, line 9
def self.draw_routes(&block)
  new.draw_routes(&block)
end
new() click to toggle source
# File lib/fox_page/router.rb, line 15
def initialize
  @routes = {}
end

Public Instance Methods

draw_routes(&block) click to toggle source
# File lib/fox_page/router.rb, line 19
def draw_routes(&block)
  instance_eval(&block)
  routes
end
map(mapping, params: {}, single_file: false) click to toggle source
# File lib/fox_page/router.rb, line 28
def map(mapping, params: {}, single_file: false)
  mapping.each do |path, target|
    routes[path] = parse_target(target, params: params, single_file: single_file)
  end
end
resources(name, path: name, only: RESOURCE_ACTIONS) click to toggle source
# File lib/fox_page/router.rb, line 36
def resources(name, path: name, only: RESOURCE_ACTIONS)
  actions = only.map(&:to_sym)
  base_name = name.to_s
  controller = controller_for(base_name)
  base_path = "/#{path}"

  # insert a route with id 0 as index if generate_all was specified, but without the /id in the path
  if actions.include?(:index)
    validate_controller_method(controller, :index)

    routes[base_path] = make_target(
      base_name: base_name,
      controller: controller,
      method_name: :index,
      params: { id: 0 },
      generate_all: nil,
      generate_all_ids: false
    )
  end

  actions.each do |action|
    method_name = action
    validate_controller_method(controller, method_name)

    generate_all = controller.instance_variable_get(:@__generate_all_for)&.[](method_name)
    generate_all_ids = controller.instance_variable_get(:@__generate_all_ids_for)&.[](method_name)

    route_path = method_name == :index ? base_path : "#{base_path}/#{method_name}"
    if generate_all
      # :show gets a pretty id, whereas :index (and others) get it prefixed with /page
      route_path = if generate_all_ids
                     "#{base_path}/%<id>s"
                   else
                     method_name == :show ? "#{base_path}/%<id>s" : "#{route_path}/page/%<id>s"
                   end
    end

    routes[route_path] ||= make_target(
      base_name: base_name,
      controller: controller,
      method_name: method_name,
      params: {},
      generate_all: generate_all,
      generate_all_ids: generate_all_ids
    )
  end
end
root(target, params: {}) click to toggle source
# File lib/fox_page/router.rb, line 24
def root(target, params: {})
  routes["/"] = parse_target(target, params: params)
end

Private Instance Methods

controller_for(base_name) click to toggle source
# File lib/fox_page/router.rb, line 102
def controller_for(base_name)
  Kernel.const_get("#{base_name}_controller".camelize)
end
make_target(base_name:, controller:, method_name:, params: {}, generate_all: nil, generate_all_ids: false, single_file: false) click to toggle source
# File lib/fox_page/router.rb, line 112
def make_target(base_name:, controller:, method_name:, params: {}, generate_all: nil, generate_all_ids: false, single_file: false)
  OpenStruct.new(
    base_name: base_name,
    controller: controller,
    method_name: method_name,
    params: OpenStruct.new(params),
    generate_all: generate_all,
    generate_all_ids: generate_all_ids,
    single_file: single_file
  )
end
parse_target(target, params: {}, single_file: false) click to toggle source
# File lib/fox_page/router.rb, line 86
def parse_target(target, params: {}, single_file: false)
  base_name, method_name = target.split("#")
  controller = controller_for(base_name)
  method_name = method_name.to_sym

  validate_controller_method(controller, method_name)

  make_target(
    base_name: base_name,
    controller: controller,
    method_name: method_name,
    params: params,
    single_file: single_file
  )
end
validate_controller_method(controller, method_name) click to toggle source
# File lib/fox_page/router.rb, line 106
def validate_controller_method(controller, method_name)
  return if controller.instance_methods.include?(method_name)

  raise ArgumentError, "#{controller} does not define ##{method_name}"
end