2016-01-13 33 views
0

我有这样的models/ability.rbCancancan能力调试中轨控制台失败和RSpec

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 

    if user.role? :registered 
     can :read Post 
    end 

    end 

当我做这个轨控制台上

#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帖子时,我认证为浏览器上的注册用户,我不知道为什么它在两个轨道控制台和RSpec失败。

+0

结束尝试插入'byebug'只是'用户|| =前User.new'以下,然后运行通常的rails控制台命令。当byebug控制台显示时,首先检查'user'变量('puts user'),然后检查它的能力:'user.role? :注册' –

+0

@ Jay-ArPolidario我不熟悉byebug,但是当我在轨道控制台'user.first'然后'user.role'中执行此操作时,它输出''注册“' –

+0

我不知道用户-role gem你用过或者这是你自己的实现(我指的是'user.role?:registered')即使你说'user.role'输出“registered”,它不会自动代表'user.role? :注册“是真实的(取决于你的实施)。如果你的Gemfile中存在byebug,请尝试在user || = User.new'上方插入'byebug',然后保存该ability.rb文件,然后重新加载你的rails控制台。之后,再次尝试输入到rails控制台中的命令。之后,应该出现PCeb控制台。从,那里键入'user.role? :注册',告诉我输出 –

回答

1

按照我们discussion,我们的结论是,问题是无论是

  1. Rails的没有加载类的能力,或
  2. A码的某个地方以某种方式覆盖能力类。

解决方法的解决方案是通过附加到手动加载能力在文件的application.rb

require "#{Rails.root/app/models/ability.rb}"