Cancancan 能力调试在 rails 控制台和 Rspec 中失败
Cancancan ability debugging fails in rails console and Rspec
我在models/ability.rb
中有这个
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.role? :registered
can :read Post
end
end
当我在 rails 控制台上执行此操作时
#this returns a user with a role: "registered" attribute
user = User.first
post = Post.first
ability = Ability.new(user)
### This returns false ###
ability.can?(:read, post)
#=> false
我为测试该能力而编写的规范也失败了,而我希望它通过。
describe User, :type => :model do
let(:post) {create(:post)}
describe "abilities" do
subject(:ability){Ability.new(user)}
let(:user){nil}
context "when is a registered user" do
## the default value for the role attribute in the user factory is "registered"
let(:user) {create(:user)}
it {is_expected.to be_able_to :read, post}
end
end
end
当我在浏览器上被认证为注册用户时,我可以访问和阅读 /posts
和 /posts/:id
中的帖子,我不知道为什么它在 rails 中都失败了] 控制台和 rspec.
按照我们的discussion,我们得出的结论是问题要么是
- Rails 没有加载技能 class,或者
- 某处的代码以某种方式覆盖了能力 class。
workaround-solution是手动加载能力文件,在application.rb
末尾追加如下内容
require "#{Rails.root}/app/models/ability.rb"
我在models/ability.rb
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.role? :registered
can :read Post
end
end
当我在 rails 控制台上执行此操作时
#this returns a user with a role: "registered" attribute
user = User.first
post = Post.first
ability = Ability.new(user)
### This returns false ###
ability.can?(:read, post)
#=> false
我为测试该能力而编写的规范也失败了,而我希望它通过。
describe User, :type => :model do
let(:post) {create(:post)}
describe "abilities" do
subject(:ability){Ability.new(user)}
let(:user){nil}
context "when is a registered user" do
## the default value for the role attribute in the user factory is "registered"
let(:user) {create(:user)}
it {is_expected.to be_able_to :read, post}
end
end
end
当我在浏览器上被认证为注册用户时,我可以访问和阅读 /posts
和 /posts/:id
中的帖子,我不知道为什么它在 rails 中都失败了] 控制台和 rspec.
按照我们的discussion,我们得出的结论是问题要么是
- Rails 没有加载技能 class,或者
- 某处的代码以某种方式覆盖了能力 class。
workaround-solution是手动加载能力文件,在application.rb
require "#{Rails.root}/app/models/ability.rb"