using instance_exec to change scope of can blocks to instance of ability, this is a bit ugly so I may end up using methods instead
This commit is contained in:
parent
be1892cca8
commit
c663effc06
|
@ -1,2 +1,3 @@
|
|||
$:.unshift(File.dirname(__FILE__))
|
||||
require 'cancan/ability'
|
||||
require 'cancan/instance_exec'
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
module CanCan
|
||||
module Ability
|
||||
attr_accessor :user
|
||||
|
||||
def self.included(base)
|
||||
base.extend ClassMethods
|
||||
base.alias_action :index, :show, :to => :read
|
||||
|
@ -18,7 +20,7 @@ module CanCan
|
|||
block_args << action if can_action == :manage
|
||||
block_args << (target.class == Class ? target : target.class) if can_target == :all
|
||||
block_args << (target.class == Class ? nil : target)
|
||||
return can_block.call(*block_args)
|
||||
return instance_exec(*block_args, &can_block)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -48,6 +50,12 @@ module CanCan
|
|||
target = args.pop[:to]
|
||||
@aliased_actions[target] = args
|
||||
end
|
||||
|
||||
def for_user(user)
|
||||
ability = new
|
||||
ability.user = user
|
||||
ability
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
15
lib/cancan/instance_exec.rb
Normal file
15
lib/cancan/instance_exec.rb
Normal file
|
@ -0,0 +1,15 @@
|
|||
# see http://eigenclass.org/hiki.rb?instance_exec
|
||||
class Object
|
||||
module InstanceExecHelper; end
|
||||
include InstanceExecHelper
|
||||
def instance_exec(*args, &block) # !> method redefined; discarding old instance_exec
|
||||
mname = "__instance_exec_#{Thread.current.object_id.abs}_#{object_id.abs}"
|
||||
InstanceExecHelper.module_eval{ define_method(mname, &block) }
|
||||
begin
|
||||
ret = send(mname, *args)
|
||||
ensure
|
||||
InstanceExecHelper.module_eval{ undef_method(mname) } rescue nil
|
||||
end
|
||||
ret
|
||||
end
|
||||
end
|
|
@ -77,4 +77,11 @@ describe CanCan::Ability do
|
|||
@ability.can?(:new, 123).should == :create_called
|
||||
@ability.can?(:edit, 123).should == :update_called
|
||||
end
|
||||
|
||||
it "should be able to access given user" do
|
||||
@ability_class.can(:preview, :all) { user }
|
||||
ability = @ability_class.for_user(:some_user)
|
||||
ability.user.should == :some_user
|
||||
ability.can?(:preview, 123).should == :some_user
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue
Block a user