Module: Pretender

Defined in:
lib/pretender.rb,
lib/pretender/version.rb

Constant Summary collapse

VERSION =
"0.1.0"

Instance Method Summary collapse

Instance Method Details

#impersonates(scope = :user, opts = {}) ⇒ Object



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

def impersonates(scope = :user, opts = {})
  impersonated_method = opts[:method] || :"current_#{scope}"
  impersonate_with = opts[:with] || proc{|id| scope.to_s.classify.constantize.where(:id => id).first }
  true_method = :"true_#{scope}"
  session_key = :"impersonated_#{scope}_id"
  impersonated_var = :"@impersonated_#{scope}"

  # define methods
  if respond_to?(impersonated_method)
    alias_method true_method, impersonated_method
  else
    define_method true_method do
      ActionController::Base.instance_method(impersonated_method).bind(self).call
    end
  end
  helper_method true_method

  define_method impersonated_method do
    if !instance_variable_get(impersonated_var)
      # only fetch impersonation if user is logged in and impersonation_id exists
      true_resource = send(true_method)
      if session[session_key] and !true_resource
        session[session_key] = nil
      end
      value = (session[session_key] && impersonate_with.call(session[session_key])) || true_resource
      instance_variable_set(impersonated_var, value) if value
    end
    instance_variable_get(impersonated_var)
  end

  define_method :"impersonate_#{scope}" do |resource|
    instance_variable_set(impersonated_var, resource)
    session[session_key] = resource.id
  end

  define_method :"stop_impersonating_#{scope}" do
    instance_variable_set(impersonated_var, nil)
    session[session_key] = nil
  end
end