Module: DeviseGuests::Controllers::Helpers

Extended by:
ActiveSupport::Concern
Defined in:
lib/devise-guests/controllers/helpers.rb

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Class Method Details

.define_concern_callbacks(*args) ⇒ Object



19
20
21
22
# File 'lib/devise-guests/controllers/helpers.rb', line 19

def self.define_concern_callbacks *args
  @@callbacks ||= []
  @@callbacks << args
end

.define_helpers(mapping) ⇒ Object

:nodoc:



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
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
# File 'lib/devise-guests/controllers/helpers.rb', line 24

def self.define_helpers(mapping) #:nodoc:
  class_name = mapping.class_name
  mapping = mapping.name

  class_eval <<-METHODS, __FILE__, __LINE__ + 1
    define_concern_callbacks :logging_in_#{mapping}

 
    def guest_#{mapping}
      return @guest_#{mapping} if @guest_#{mapping}

      if session[:guest_#{mapping}_id]
        @guest_#{mapping} = #{class_name}.find_by(#{class_name}.authentication_keys.first => session[:guest_#{mapping}_id]) rescue nil
        @guest_#{mapping} = nil if @guest_#{mapping}.respond_to? :guest and !@guest_#{mapping}.guest 
      end

      @guest_#{mapping} ||= begin
        u = create_guest_#{mapping}(session[:guest_#{mapping}_id])
        session[:guest_#{mapping}_id] = u.send(#{class_name}.authentication_keys.first)
        u
      end

      @guest_#{mapping}
    end

    def current_or_guest_#{mapping}
      if current_#{mapping}
        if session[:guest_#{mapping}_id]
          run_callbacks :logging_in_#{mapping} do
            guest_#{mapping}.destroy
            session[:guest_#{mapping}_id] = nil
          end
        end
        current_#{mapping}
      else
        guest_#{mapping}
      end
    end

    private
    def create_guest_#{mapping} key = nil
      auth_key = #{class_name}.authentication_keys.first
      #{class_name}.new do |g|
        g.send("\#{auth_key}=", send(:"guest_\#{auth_key}_authentication_key", key))
        g.guest = true if g.respond_to? :guest
        g.skip_confirmation! if g.respond_to?(:skip_confirmation!)
        g.save(validate: false)
      end
    end

    def guest_email_authentication_key key
      key &&= nil unless key.to_s.match(/^guest/)
      key ||= "guest_" + guest_#{mapping}_unique_suffix + "@example.com"
    end

    def guest_#{mapping}_unique_suffix
      Devise.friendly_token + "_" + Time.now.to_i.to_s + "_" + unique_#{mapping}_counter.to_s
    end

    def unique_#{mapping}_counter
      @@unique_#{mapping}_counter ||= 0
      @@unique_#{mapping}_counter += 1
    end

  METHODS

  ActiveSupport.on_load(:action_controller) do
    helper_method "guest_#{mapping}", "current_or_guest_#{mapping}"
  end
end