2012-02-24 4 views
3

Я потратил немного времени, пробираясь через CanCan для работы вложенных ресурсов. Он работает так, как ожидалось, в браузере, но я не могу получить соответствующую спецификацию возможностей. Я предполагаю, что это имеет какое-то отношение к тому, как CanCan обрабатывает вложенные маршруты. Любые предложения по правильной проверке отказоустойчивых способностей (отмечены ниже)? Благодарю.Тестирование вложенных возможностей CanCan с помощью RSpec

describe "Network" do 
    let(:network) { Network.new } 

    describe "#read" do 
     it "allows a user that meets the can_read? requirements" do 
     NetworkManagementPolicy.stub_chain(:new, :can_read?).and_return(true) 
     ability_for(user).should be_able_to(:read, network) 
     end 

     it "denies a user that does not meet the can_read? requirements" do 
     NetworkManagementPolicy.stub_chain(:new, :can_read?).and_return(false) 
     ability_for(user).should_not be_able_to(:read, network) 
     end 

     describe "Affiliation" do 
     let(:affiliation) { Affiliation.new } 

     describe "#manage" do 
      it "allows a user that meets the can_modify? requirements" do 
      # NOTE: Not sure why this is failing; Something to do with how 
      # CanCan handles nested resources? 
      # 
      # NetworkManagementPolicy.stub_chain(:new, :can_modify?).and_return(true) 
      # ability_for(user).should be_able_to(:manage, affiliation) 
      end 

      it "denies a user that does not meet the can_modify? requirements" do 
      NetworkManagementPolicy.stub_chain(:new, :can_modify?).and_return(false) 
      ability_for(user).should_not be_able_to(:manage, affiliation) 
      end 
     end 
     end 
    end 
    end 

Класс способности определяет следующее, относящееся к сетям чтения и управлению присоединениями. Класс NetworkManagementPolicy возвращает true/false на основе определенных критериев и работает, как ожидалось. Даже когда вы удаляете вызовы этого класса и возвращаете true/false, я не могу получить спецификации возможностей.

can :read, Network do |network| 
    can :manage, Affiliation do |affiliation| 
     NetworkManagementPolicy.new(network).can_modify?(current_user) 
    end 

    NetworkManagementPolicy.new(network).can_read?(current_user) 
    end 
+1

Вы уверены, что можете вызывать второй 'can' внутри блока? Я не вижу таких примеров на странице [Определение способностей с блоками] (https://github.com/ryanb/cancan/wiki/Defining-Abilities-with-Blocks). Помните, что блок не оценивается до тех пор, пока не будет проверено разрешение. –

ответ

0

Нам нужна более подробная информация о ваших моделях и «can_read?». условия для правильного ответа на этот вопрос. Я не уверен, как ваша модель Affiliation относится к NetworkManagementPolicy или Network.

Однако, учитывая, что сеть has_many network_management_polices и что каждая аффилиация присоединена к пользователю и сети со стандартными соглашениями с рельсами, это должно заставить вас двигаться.

class NetworkManagementPolicyController < ApplicationController 
    load_and_authorize_resource :network 
    load_and_authorize_resource :network_management_policy, through: :network 
end 

can :manage, NetworkManagementPolicy, network: { affiliations: { user_id: current_user.id} } 
Смежные вопросы