【发布时间】:2015-09-27 20:16:09
【问题描述】:
请帮助解决问题。我使用 gem 'cancan' 并加入角色层次结构表。 架构:
create_table "roles", force: :cascade do |t|
t.string "name", limit: 255
end
create_table "roles_users", id: false, force: :cascade do |t|
t.integer "role_id", limit: 4
t.integer "user_id", limit: 4
end
create_table "users", force: :cascade do |t|
t.string "email", limit: 255, default: "", null: false
t.string "encrypted_password", limit: 255, default: "", null: false
end
我有 3 个角色: 表角色:
id name
0 user
1 manager
2 admin
我创建了 3 个用户并给了他们角色: 表角色_用户:
role_id user_id
2 2
1 3
0 1
ability.rb:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.role? :admin
can :manage, :all
cannot :update, Review
elsif user.role? :manager
can :read, Review
can :create, Review
can :update, Review
cannot :delete, Review
elsif user.role? :user
can :read, Review
can :create, Review
cannot :update, Review
cannot :delete, Review
else
can :read, Review
cannot :create, Review
cannot :update, Review
cannot :delete, Review
end
end
end
工厂:
FactoryGirl.define do
factory :user do
sequence(:email){ |i| "us#{i}@ad.ad" }
password 'qwertyui'
password_confirmation{ |u| u.password }
end
end
FactoryGirl.define do
factory :admin_status, class: Role do
role_id 2
user_id 2
end
factory :manager_status, class: Role do
role_id 1
user_id 3
end
factory :user_status, class: Role do
role_id 0
user_id 1
end
end
我需要通过 r 规范测试管理员用户的能力:
require 'rails_helper'
RSpec.describe Review, type: :model do
before(:each) do
@user = FactoryGirl.create(:user) #create admin
@ability = Ability.new(@user)
end
it "cannot delete review" do
expect(@ability).to be_able_to(:delete, Review)
end
end
但在运行测试控制台后显示以下错误消息:
kalinin@kalinin ~/rails/admin_book $ rspec spec/models/review_spec.rb
F
Failures:
1) Review cannot delete review
Failure/Error: expect(@ability).to be_able_to(:delete, Review)
expected to be able to delete Review
# ./spec/models/review_spec.rb:11:in `block (2 levels) in <top (required)>'
请帮助检查管理员用户的权限删除评论
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-4 rspec cancan