Module: Draper::AllHelpers

Defined in:
lib/draper/all_helpers.rb

Instance Method Summary (collapse)

Instance Method Details

- (Object) all_helpers

Most of the black magic here thanks to Xavier Shay (@xshay) Provide access to helper methods from outside controllers and views, such as in Presenter objects. Rails provides ActionController::Base.helpers, but this does not include any of our application helpers.



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
# File 'lib/draper/all_helpers.rb', line 7

def all_helpers
  @all_helpers_proxy ||= begin
    # Start with just the rails helpers. This is the same method used
    # by ActionController::Base.helpers
    # proxy = ActionView::Base.new.extend(_helpers)
    proxy = ActionController::Base.helpers

    # url_for depends on _routes method being defined
    proxy.instance_eval do
      def _routes
        Rails.application.routes
      end
    end
 
    # Import all named path methods
    proxy.extend(Rails.application.routes.named_routes.module)

    # Load all our application helpers to extend
    modules_for_helpers([:all]).each do |mod|
      proxy.extend(mod)
    end

    proxy.instance_eval do
      def controller
        #Object.controller
      end
    end

    proxy.instance_eval do
      # A hack since this proxy doesn't pick up default_url_options from anywhere
      def url_for(*args)
        if args.last.is_a?(Hash) && !args.last[:only_path]
          args = args.dup
          args << args.pop.merge('host' => ActionMailer::Base.default_url_options[:host])
        end
        super(*args)
      end
    end

    proxy
  end
end