Class: ExpressAdmin::Commandable

Inherits:
Object
  • Object
show all
Defined in:
lib/express_admin/commandable.rb

Instance Method Summary collapse

Constructor Details

#initialize(defaults = {}) ⇒ Commandable

Returns a new instance of Commandable.



3
4
5
# File 'lib/express_admin/commandable.rb', line 3

def initialize(defaults = {})
  @defaults = defaults
end

Instance Method Details

#call(mapper, options = {}) ⇒ Object



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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/express_admin/commandable.rb', line 7

def call(mapper, options = {})
  options = @defaults.merge(options)
  modules = []

  # this is a big hack to reconstruct the module path for the
  # controller from the scope context.  I wish rails provided
  # a nice way to get in there and do this but I do not see it
  # yet... probably because rails does not instantiate require
  # controllers to exist for the route map to be constructed
  controller_name = mapper.send(:parent_resource).controller
  scope = mapper.instance_variable_get(:@scope)

  while scope.respond_to?(:parent) && scope = scope.parent
    possible_module = scope.instance_variable_get(:@hash)[:module]
    break if possible_module.nil?
    modules << possible_module
  end
  modules.compact!
  modules << controller_name

  controller_class = nil
  begin
    controller_class = "#{modules.join("/").classify.pluralize}Controller".constantize
  rescue NameError => e
    # if plural fails, use singular
    begin
      controller_class = "#{modules.join("/").classify}Controller".constantize
    rescue NameError => e2
      # if we get here, the first exception wasn't what we thought
      # it was something else and we should politely let the developer know
      raise e
    end
  end
  if controller_class.respond_to?(:resource_class)
    resource_class = controller_class.resource_class
    if resource_class.respond_to?(:commands)
      resource_class.commands.each do |action|
        # post :foo, to: "module/controller#foo"
        mapper.member do
          mapper.post action[:name].debang, to: "#{controller_name}##{action[:name].debang}"
        end
      end
    end
  end
end