From 55c8a5045b5d962fb8b0ac9c14ba55232422a367 Mon Sep 17 00:00:00 2001 From: stellard Date: Tue, 18 Jan 2011 18:28:03 +0000 Subject: [PATCH] added cannot support and multiple can support --- lib/cancan/model_adapters/mongoid_adapter.rb | 22 +++++++++++++------ .../model_adapters/mongoid_adapter_spec.rb | 19 +++++++++++++++- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/lib/cancan/model_adapters/mongoid_adapter.rb b/lib/cancan/model_adapters/mongoid_adapter.rb index 70e39e2..24a5956 100644 --- a/lib/cancan/model_adapters/mongoid_adapter.rb +++ b/lib/cancan/model_adapters/mongoid_adapter.rb @@ -16,14 +16,22 @@ module CanCan end def database_records - @model_class.where(conditions) - end - - def conditions - if @rules.size == 0 - false_query + if @rules.size == 0 + @model_class.where(false_query) else - @rules.first.conditions + criteria = @model_class.all + @rules.each do |rule| + criteria = chain_criteria(rule, criteria) + end + criteria + end + end + + def chain_criteria rule, criteria + if rule.base_behavior + criteria.or(rule.conditions) + else + criteria.excludes(rule.conditions) end end diff --git a/spec/cancan/model_adapters/mongoid_adapter_spec.rb b/spec/cancan/model_adapters/mongoid_adapter_spec.rb index 8543990..60fa2d1 100644 --- a/spec/cancan/model_adapters/mongoid_adapter_spec.rb +++ b/spec/cancan/model_adapters/mongoid_adapter_spec.rb @@ -56,7 +56,7 @@ if ENV["MODEL_ADAPTER"] == "mongoid" lord = MongoidProject.create(:title => 'Lord') dude = MongoidProject.create(:title => 'Dude') - MongoidProject.accessible_by(@ability, :read).should == [sir] + MongoidProject.accessible_by(@ability, :read).entries.should == [sir] end it "should return everything when the defined ability is manage all" do @@ -154,7 +154,24 @@ if ENV["MODEL_ADAPTER"] == "mongoid" @ability.can :read, MongoidProject, :foo => {:bar => 1} MongoidProject.accessible_by(@ability, :read).entries.first.should == obj end + + it "should exclude from the result if set to cannot" do + obj = MongoidProject.create(:bar => 1) + obj2 = MongoidProject.create(:bar => 2) + @ability.can :read, MongoidProject + @ability.cannot :read, MongoidProject, :bar => 2 + MongoidProject.accessible_by(@ability, :read).entries.first.should == obj + end + it "should combine the rules" do + obj = MongoidProject.create(:bar => 1) + obj2 = MongoidProject.create(:bar => 2) + obj3 = MongoidProject.create(:bar => 3) + @ability.can :read, MongoidProject, :bar => 1 + @ability.can :read, MongoidProject, :bar => 2 + MongoidProject.accessible_by(@ability, :read).entries.should =~ [obj, obj2] + end + it "should not allow to fetch records when ability with just block present" do @ability.can :read, MongoidProject do false