Class: ActiveAdmin::Namespace

Inherits:
Object
  • Object
show all
Defined in:
lib/active_admin/namespace.rb

Overview

Namespaces are the basic organizing principle for resources within Active Admin

Each resource is registered into a namespace which defines:

* the namespaceing for routing
* the module to namespace controllers
* the menu which gets displayed (other resources in the same namespace)

For example:

ActiveAdmin.register Post, namespace: :admin

Will register the Post model into the “admin” namespace. This will namespace the urls for the resource to “/admin/posts” and will set the controller to Admin::PostsController

You can also register to the “root” namespace, which is to say no namespace at all.

ActiveAdmin.register Post, namespace: false

This will register the resource to an instantiated namespace called :root. The resource will be accessible from “/posts” and the controller will be PostsController.

Constant Summary

RegisterEvent =
'active_admin.namespace.register'.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(application, name) ⇒ Namespace

Returns a new instance of Namespace



32
33
34
35
36
37
38
# File 'lib/active_admin/namespace.rb', line 32

def initialize(application, name)
  @application = application
  @name = name.to_s.underscore.to_sym
  @resources = ResourceCollection.new
  register_module unless root?
  build_menu_collection
end

Instance Attribute Details

#applicationObject (readonly)

Returns the value of attribute application



30
31
32
# File 'lib/active_admin/namespace.rb', line 30

def application
  @application
end

Returns the value of attribute menus



30
31
32
# File 'lib/active_admin/namespace.rb', line 30

def menus
  @menus
end

#nameObject (readonly)

Returns the value of attribute name



30
31
32
# File 'lib/active_admin/namespace.rb', line 30

def name
  @name
end

#resourcesObject (readonly)

Returns the value of attribute resources



30
31
32
# File 'lib/active_admin/namespace.rb', line 30

def resources
  @resources
end

Instance Method Details

#add_current_user_to_menu(menu, priority = 10, html_options = {}) ⇒ Object

The default user session menu item

Parameters:

  • menu (ActiveAdmin::MenuItem)

    The menu to add the logout link to

  • priority (Fixnum) (defaults to: 10)

    The numeric priority for the order in which it appears

  • html_options (Hash) (defaults to: {})

    An options hash to pass along to link_to



146
147
148
149
150
151
152
153
# File 'lib/active_admin/namespace.rb', line 146

def add_current_user_to_menu(menu, priority = 10, html_options = {})
  if current_user_method
    menu.add id: 'current_user', priority: priority, html_options: html_options,
      label: ->{ display_name current_active_admin_user },
      url:   ->{ auto_url_for(current_active_admin_user) || '#' },
      if:    :current_active_admin_user?
  end
end

#add_logout_button_to_menu(menu, priority = 20, html_options = {}) ⇒ Object

The default logout menu item

Parameters:

  • menu (ActiveAdmin::MenuItem)

    The menu to add the logout link to

  • priority (Fixnum) (defaults to: 20)

    The numeric priority for the order in which it appears

  • html_options (Hash) (defaults to: {})

    An options hash to pass along to link_to



130
131
132
133
134
135
136
137
138
# File 'lib/active_admin/namespace.rb', line 130

def add_logout_button_to_menu(menu, priority = 20, html_options = {})
  if logout_link_path
    html_options = html_options.reverse_merge(method: logout_link_method || :get)
    menu.add id: 'logout', priority: priority, html_options: html_options,
      label: ->{ I18n.t 'active_admin.logout' },
      url:   ->{ render_or_call_method_or_proc_on self, active_admin_namespace.logout_link_path },
      if:    :current_active_admin_user?
  end
end

#build_default_utility_navObject (protected)

Builds the default utility navigation in top right header with current user & logout button



170
171
172
173
174
175
176
# File 'lib/active_admin/namespace.rb', line 170

def build_default_utility_nav
  return if @menus.exists? :utility_navigation
  @menus.menu :utility_navigation do |menu|
    add_current_user_to_menu menu
    add_logout_button_to_menu menu
  end
end

#build_menu(name = DEFAULT_MENU, &block) ⇒ Object

Add a callback to be ran when we build the menu

Parameters:

  • name (Symbol) (defaults to: DEFAULT_MENU)

    The name of the menu. Default: :default

  • block (Proc)

    The block to be ran when the menu is built



116
117
118
119
120
121
122
# File 'lib/active_admin/namespace.rb', line 116

def build_menu(name = DEFAULT_MENU, &block)
  @menus.before_build do |menus|
    menus.menu name do |menu|
      block.call(menu)
    end
  end
end

#build_menu_collectionObject (protected)



157
158
159
160
161
162
163
164
165
166
167
# File 'lib/active_admin/namespace.rb', line 157

def build_menu_collection
  @menus = MenuCollection.new

  @menus.on_build do |menus|
    build_default_utility_nav

    resources.each do |resource|
      resource.add_to_menu(@menus)
    end
  end
end

#build_page(name, options) ⇒ Object (protected)



183
184
185
# File 'lib/active_admin/namespace.rb', line 183

def build_page(name, options)
  resources.add Page.new(self, name, options)
end

#fetch_menu(name) ⇒ Object



102
103
104
# File 'lib/active_admin/namespace.rb', line 102

def fetch_menu(name)
  @menus.fetch(name)
end

#find_or_build_resource(resource_class, options) ⇒ Object (protected)

Either returns an existing Resource instance or builds a new one.



179
180
181
# File 'lib/active_admin/namespace.rb', line 179

def find_or_build_resource(resource_class, options)
  resources.add Resource.new(self, resource_class, options)
end

#module_nameObject

Returns the name of the module if required. Will be nil if none is required.

eg:

Namespace.new(:admin).module_name # => 'Admin'
Namespace.new(:root).module_name # => nil


80
81
82
83
# File 'lib/active_admin/namespace.rb', line 80

def module_name
  return nil if root?
  @module_name ||= name.to_s.camelize
end

#parse_page_registration_block(config, &block) ⇒ Object (protected)



226
227
228
# File 'lib/active_admin/namespace.rb', line 226

def parse_page_registration_block(config, &block)
  PageDSL.new(config).run_registration_block(&block)
end

#parse_registration_block(config, resource_class, &block) ⇒ Object (protected)



221
222
223
224
# File 'lib/active_admin/namespace.rb', line 221

def parse_registration_block(config, resource_class, &block)
  config.dsl = ResourceDSL.new(config, resource_class)
  config.dsl.run_registration_block(&block)
end

#read_default_setting(name) ⇒ Object

Override from ActiveAdmin::Settings to inherit default attributes from the application



98
99
100
# File 'lib/active_admin/namespace.rb', line 98

def read_default_setting(name)
  application.public_send name
end

#register(resource_class, options = {}, &block) ⇒ Object

Register a resource into this namespace. The preffered method to access this is to use the global registration ActiveAdmin.register which delegates to the proper namespace instance.



43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/active_admin/namespace.rb', line 43

def register(resource_class, options = {}, &block)
  config = find_or_build_resource(resource_class, options)

  # Register the resource
  register_resource_controller(config)
  parse_registration_block(config, resource_class, &block) if block_given?
  reset_menu!

  # Dispatch a registration event
  ActiveAdmin::Event.dispatch ActiveAdmin::Resource::RegisterEvent, config

  # Return the config
  config
end

#register_moduleObject (protected)

Creates a ruby module to namespace all the classes in if required



209
210
211
212
213
# File 'lib/active_admin/namespace.rb', line 209

def register_module
  unless Object.const_defined? module_name
    Object.const_set module_name, Module.new
  end
end

#register_page(name, options = {}, &block) ⇒ Object



58
59
60
61
62
63
64
65
66
67
# File 'lib/active_admin/namespace.rb', line 58

def register_page(name, options = {}, &block)
  config = build_page(name, options)

  # Register the resource
  register_page_controller(config)
  parse_page_registration_block(config, &block) if block_given?
  reset_menu!

  config
end

#register_page_controller(config) ⇒ Object (protected)

TODO: replace `eval` with `Class.new`



188
189
190
191
# File 'lib/active_admin/namespace.rb', line 188

def register_page_controller(config)
  eval "class ::#{config.controller_name} < ActiveAdmin::PageController; end"
  config.controller.active_admin_config = config
end

#register_resource_controller(config) ⇒ Object (protected)

TODO replace `eval` with `Class.new`



216
217
218
219
# File 'lib/active_admin/namespace.rb', line 216

def register_resource_controller(config)
  eval "class ::#{config.controller_name} < ActiveAdmin::ResourceController; end"
  config.controller.active_admin_config = config
end

#reset_menu!Object



106
107
108
# File 'lib/active_admin/namespace.rb', line 106

def reset_menu!
  @menus.clear!
end

#resource_for(klass) ⇒ Object

Returns the first registered ActiveAdmin::Resource instance for a given class



92
93
94
# File 'lib/active_admin/namespace.rb', line 92

def resource_for(klass)
  resources[klass]
end

#root?Boolean

Returns:

  • (Boolean)


69
70
71
# File 'lib/active_admin/namespace.rb', line 69

def root?
  name == :root
end

#unload!Object

Unload all the registered resources for this namespace



86
87
88
89
# File 'lib/active_admin/namespace.rb', line 86

def unload!
  unload_resources!
  reset_menu!
end

#unload_resources!Object (protected)



193
194
195
196
197
198
199
200
201
202
203
204
205
206
# File 'lib/active_admin/namespace.rb', line 193

def unload_resources!
  resources.each do |resource|
    parent = (module_name || 'Object').constantize
    name   = resource.controller_name.split('::').last
    parent.send(:remove_const, name) if parent.const_defined? name

    # Remove circular references
    resource.controller.active_admin_config = nil
    if resource.is_a?(Resource) && resource.dsl
      resource.dsl.run_registration_block { @config = nil }
    end
  end
  @resources = ResourceCollection.new
end