2014-02-13 29 views
2
class Ability 

include CanCan::Ability 

def initialize(user) 

user ||= User.new # guest user 

if user.has_role? :student 
    can :create, Atendimento 
end 

if user.has_role? :professor 
    can :create, Atendimento 
end 
if user.has_role? :administrative 
    can [:read, :create], [Atendimento] 
    can [:edit, :update], Atendimento 
    can :manage, [Type, Place] 
end 
if user.has_role? :admin 
    can :manage, :all 
end 
end 
end 

添加幾個對象和我廠FactoryGirl如何與不同的角色

FactoryGirl.define do 
factory :user do |f| 
f.name "Alessandro" 
f.username "alessandrocb" 
f.matricula "123456789" 
f.password "123456789" 
f.password_confirmation "123456789" 
f.after(:create) {|user| user.add_role(:student)} 
end 

我需要那些嘲笑收到的所有角色,但現在我只能學生角色

我使用RSpec

測試
subject(:ability){ Ability.new(user) } 
let(:user){ nil } 

context "when is an User" do 
let(:user) { FactoryGirl.create(:user) } 

發生了什麼事情是這樣的:我只能用rspec測試只有1張紙,但想用全部測試t他可以掃描,我需要創建具有所有這些可能性爲不同角色的工廠

回答

6

首先解決

FactoryGirl.define do 
    factory :user do 
    name "Alessandro" 
    username "alessandrocb" 
    (...) 
    trait :student do 
     after(:create) {|user| user.add_role(:student)} 
    end 
    trait :professor do 
     after(:create) {|user| user.add_role(:professor)} 
    end 
    trait :administrative do 
     after(:create) {|user| user.add_role(:administrative)} 
    end 
    trait :admin do 
     after(:create) {|user| user.add_role(:admin)} 
    end 
    end 
end 

然後,您可以使用並結合這些特徵是這樣的:

# Create a student 
create :user, :student 

# Create a user who is both professor and admin 
create :user, :professor, :admin 

解決方法二

FactoryGirl.define do 
    factory :user do 
    name "Alessandro" 
    username "alessandrocb" 
    (...) 
    ignore do 
     role 
    end 
    after(:create) do |user, params|  
     user.add_role(params.role) if params.role 
    end 
    end 
end 

然後:

# Create a student 
create :user, role: :student 

注意,第二個解決方案不允許你結合角色就像它一樣。但是你可以使用一個數組來實現這一點。

+0

它的一個很好的解決方案,感謝求助= D我不知道這個特性的存在:學生做了 之後(:create){| user | user.add_role(:student)} end trait:professor do after(:create){| user | user.add_role(:professor)} 結束 – thiagovsk

+0

yu能起來我的帖子嗎? – thiagovsk

2

我最近遇到了類似的問題。這裏是我的用戶廠:

FactoryGirl.define do 

    sequence :email do |n| 
    "user#{n}@example.com" 
    end 

    factory :user do 
    email 
    password 'password' 

    factory :admin_user do 
     role 'administrator' 
    end 

    factory :support_user do 
     role 'support' 
    end 

    factory :editor_user do 
     role 'editor' 
    end 

    factory :sales_user do 
     role 'sales' 
    end 

    factory :author_user do 
     role 'author' 
    end 

    factory :guest_user do 
     role 'guest' 
    end 

    end 

end 

從那裏我可以調用相關的工廠了規範:

create(:editor_user) 

,或者根據您的用戶模型和它的助理屬性,你也可以建立一個像工廠:

create(:user, role: 'guest') # my User model has a properly called 'role' 
+0

它的工作原理!感謝man = D感謝您的快速回復 – thiagovsk

+0

歡迎您!很高興它幫助和樂趣spec'ing :) –

+0

感謝哥們,我開始與鐵軌,在巴西仍然是新的,你在這裏幫助很多。 – thiagovsk

相關問題