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