2016-01-13 78 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}"