Module: Trestle::UrlHelper

Defined in:
app/helpers/trestle/url_helper.rb

Constant Summary collapse

DIALOG_ACTIONS =
[:new, :show, :edit]

Instance Method Summary collapse

Instance Method Details

#admin_for(instance) ⇒ Object


75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'app/helpers/trestle/url_helper.rb', line 75

def admin_for(instance)
  klass = instance.class

  while klass
    admin = Trestle.admins[klass.name.underscore.pluralize]
    return admin if admin

    klass = klass.superclass
  end

  # No admin found
  nil
end

5
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'app/helpers/trestle/url_helper.rb', line 5

def admin_link_to(content, instance_or_url=nil, options={}, &block)
  # Block given - ignore content parameter and capture content from block
  if block_given?
    instance_or_url, options = content, instance_or_url || {}
    content = capture(&block)
  end

  if instance_or_url.is_a?(String)
    # Treat string URL as regular link
    link_to(content, instance_or_url, options)
  else
    # Normalize options if instance is not provided
    if instance_or_url.is_a?(Hash)
      instance, options = nil, instance_or_url
    else
      instance = instance_or_url
    end

    # Determine admin
    if options.key?(:admin)
      admin = Trestle.lookup(options.delete(:admin))
    elsif instance
      admin = admin_for(instance)
    end

    admin ||= self.admin if respond_to?(:admin)

    if admin
      # Ensure admin has controller context
      admin = admin.new(self) if admin.is_a?(Class)

      # Generate path
      action = options.delete(:action) || :show
      params = options.delete(:params) || {}

      if admin.respond_to?(:instance_path) && instance
        path = admin.instance_path(instance, params.reverse_merge(action: action))
      else
        params[:id] ||= admin.to_param(instance) if instance
        path = admin.path(action, params)
      end

      # Determine link data options
      if DIALOG_ACTIONS.include?(action) && admin.form.dialog?
        options[:data] ||= {}
        options[:data][:behavior] ||= "dialog"
      end

      link_to(content, path, options)
    else
      raise ActionController::UrlGenerationError, "An admin could not be inferred. Please specify an admin using the :admin option."
    end
  end
end

#admin_url_for(instance, options = {}) ⇒ Object


60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'app/helpers/trestle/url_helper.rb', line 60

def admin_url_for(instance, options={})
  admin = Trestle.lookup(options.delete(:admin)) if options.key?(:admin)
  admin ||= admin_for(instance)
  return unless admin

  # Ensure admin has controller context
  admin = admin.new(self) if admin.is_a?(Class)

  if admin.respond_to?(:instance_path)
    admin.instance_path(instance, options)
  else
    admin.path(options[:action] || :show, id: admin.to_param(instance))
  end
end