Sha256: 767603e3e0ec7a9ab1201c2b7db738d2a85212374626d4715ecfa60eab9f65c9

Contents?: true

Size: 1.33 KB

Versions: 1

Compression:

Stored size: 1.33 KB

Contents

require "pretender/version"

module Pretender

  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
    alias_method true_method, impersonated_method
    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)
        value = (true_resource && 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

end

ActionController::Base.send(:extend, Pretender) if defined?(ActionController::Base)

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
pretender-0.0.2 lib/pretender.rb