Class: ActionDispatch::Routing::Mapper
- Inherits:
-
Object
- Object
- ActionDispatch::Routing::Mapper
- Defined in:
- lib/rest_framework/routers.rb
Instance Method Summary collapse
-
#_get_controller_class(name, pluralize: true, fallback_reverse_pluralization: true) ⇒ Object
Internal interface to get the controller class from the name and current scope.
-
#_rest_resources(default_singular, name, **kwargs, &block) ⇒ Object
Internal core implementation of the ‘rest_resource(s)` router, both singular and plural.
-
#_route_extra_actions(actions, &block) ⇒ Object
Interal interface for routing extra actions.
-
#rest_resource(*names, **kwargs, &block) ⇒ Object
Public interface for creating singular RESTful resource routes.
-
#rest_resources(*names, **kwargs, &block) ⇒ Object
Public interface for creating plural RESTful resource routes.
-
#rest_root(name = nil, **kwargs, &block) ⇒ Object
Route a controller’s ‘#root` to ’/‘ in the current scope/namespace, along with other actions.
-
#rest_route(name = nil, **kwargs, &block) ⇒ Object
Route a controller without the default resourceful paths.
Instance Method Details
#_get_controller_class(name, pluralize: true, fallback_reverse_pluralization: true) ⇒ Object
Internal interface to get the controller class from the name and current scope.
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/rest_framework/routers.rb', line 6 def _get_controller_class(name, pluralize: true, fallback_reverse_pluralization: true) # Get class name. name = name.to_s.camelize # Camelize to leave plural names plural. name = name.pluralize if pluralize if name == name.pluralize name_reverse = name.singularize else name_reverse = name.pluralize end name += "Controller" name_reverse += "Controller" # Get scope for the class. if @scope[:module] mod = @scope[:module].to_s.camelize.constantize else mod = Object end # Convert class name to class. begin controller = mod.const_get(name) rescue NameError if fallback_reverse_pluralization controller = mod.const_get(name_reverse) else raise end end return controller end |
#_rest_resources(default_singular, name, **kwargs, &block) ⇒ Object
Internal core implementation of the ‘rest_resource(s)` router, both singular and plural.
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/rest_framework/routers.rb', line 55 def _rest_resources(default_singular, name, **kwargs, &block) controller = kwargs.delete(:controller) || name if controller.is_a?(Class) controller_class = controller else controller_class = self._get_controller_class(controller, pluralize: !default_singular) end # Set controller if it's not explicitly set. kwargs[:controller] = name unless kwargs[:controller] # Passing `unscoped: true` will prevent a nested resource from being scoped. unscoped = kwargs.delete(:unscoped) # Determine plural/singular resource. force_singular = kwargs.delete(:force_singular) force_plural = kwargs.delete(:force_plural) if force_singular singular = true elsif force_plural singular = false elsif !controller_class.singleton_controller.nil? singular = controller_class.singleton_controller else singular = default_singular end resource_method = singular ? :resource : :resources # Call either `resource` or `resources`, passing appropriate modifiers. skip = RESTFramework::Utils.get_skipped_builtin_actions(controller_class) public_send(resource_method, name, except: skip, **kwargs) do if controller_class.respond_to?(:extra_member_actions) member do self._route_extra_actions(controller_class.extra_member_actions) end end collection do # Route extra controller-defined actions. self._route_extra_actions(controller_class.extra_actions) # Route extra RRF-defined actions. RESTFramework::RRF_BUILTIN_ACTIONS.each do |action, methods| next unless controller_class.method_defined?(action) [methods].flatten.each do |m| public_send(m, "", action: action) if self.respond_to?(m) end end # Route bulk actions, if configured. RESTFramework::RRF_BUILTIN_BULK_ACTIONS.each do |action, methods| next unless controller_class.method_defined?(action) [methods].flatten.each do |m| public_send(m, "", action: action) if self.respond_to?(m) end end end if unscoped yield if block_given? else scope(module: name, as: name) do yield if block_given? end end end end |
#_route_extra_actions(actions, &block) ⇒ Object
Interal interface for routing extra actions.
40 41 42 43 44 45 46 47 48 49 |
# File 'lib/rest_framework/routers.rb', line 40 def _route_extra_actions(actions, &block) parsed_actions = RESTFramework::Utils.parse_extra_actions(actions) parsed_actions.each do |action, config| [config[:methods]].flatten.each do |m| public_send(m, config[:path], action: action, **(config[:kwargs] || {})) end yield if block_given? end end |
#rest_resource(*names, **kwargs, &block) ⇒ Object
Public interface for creating singular RESTful resource routes.
126 127 128 129 130 |
# File 'lib/rest_framework/routers.rb', line 126 def rest_resource(*names, **kwargs, &block) names.each do |n| self._rest_resources(true, n, **kwargs, &block) end end |
#rest_resources(*names, **kwargs, &block) ⇒ Object
Public interface for creating plural RESTful resource routes.
133 134 135 136 137 |
# File 'lib/rest_framework/routers.rb', line 133 def rest_resources(*names, **kwargs, &block) names.each do |n| self._rest_resources(false, n, **kwargs, &block) end end |
#rest_root(name = nil, **kwargs, &block) ⇒ Object
Route a controller’s ‘#root` to ’/‘ in the current scope/namespace, along with other actions.
187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
# File 'lib/rest_framework/routers.rb', line 187 def rest_root(name=nil, **kwargs, &block) # By default, use RootController#root. root_action = kwargs.delete(:action) || :root controller = kwargs.delete(:controller) || name || :root # Remove path if name is nil (routing to the root of current namespace). unless name kwargs[:path] = "" end return rest_route(controller, route_root_to: root_action, **kwargs) do yield if block_given? end end |
#rest_route(name = nil, **kwargs, &block) ⇒ Object
Route a controller without the default resourceful paths.
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
# File 'lib/rest_framework/routers.rb', line 140 def rest_route(name=nil, **kwargs, &block) controller = kwargs.delete(:controller) || name route_root_to = kwargs.delete(:route_root_to) if controller.is_a?(Class) controller_class = controller else controller_class = self._get_controller_class(controller, pluralize: false) end # Set controller if it's not explicitly set. kwargs[:controller] = name unless kwargs[:controller] # Passing `unscoped: true` will prevent a nested resource from being scoped. unscoped = kwargs.delete(:unscoped) # Route actions using the resourceful router, but skip all builtin actions. public_send(:resource, name, only: [], **kwargs) do # Route a root for this resource. if route_root_to get("", action: route_root_to, as: "") end collection do # Route extra controller-defined actions. self._route_extra_actions(controller_class.extra_actions) # Route extra RRF-defined actions. RESTFramework::RRF_BUILTIN_ACTIONS.each do |action, methods| next unless controller_class.method_defined?(action) [methods].flatten.each do |m| public_send(m, "", action: action) if self.respond_to?(m) end end end if unscoped yield if block_given? else scope(module: name, as: name) do yield if block_given? end end end end |