2014-02-13 2 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 только с одной бумагой, но хотел бы протестировать со всеми t он cancan, мне нужно создать завод со всеми этими возможностями для разных ролей

ответ

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 Я не знал о существовании черты: student do after (: create) {| user | user.add_role (: student)} конец признак: профессор do после (: create) {| пользователь | user.add_role (: Professor)} end – 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

это работает! thanks man = D благодарит за очень быстрый ответ – thiagovsk

+0

Добро пожаловать! Рад, что это помогло и получило удовольствие spec'ing :) –

+0

Спасибо, приятель, я начинаю с рельсов, В Бразилии все еще нова, и вы много помогаете здесь. – thiagovsk

Смежные вопросы