简体   繁体   中英

Cancancan ability debugging fails in rails console and Rspec

I have this in models/ability.rb

class Ability
  include CanCan::Ability

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

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

  end

When I do this on rails console

#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

This spec I have written to test the ability also fails while i expect it to pass.

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

I can access and read posts in both /posts and /posts/:id when I am authenticated as a registered user on the browser, I have no idea why it is failing in both rails console and rspec.

Following our discussion , we concluded that the problem is either

  1. Rails didn't load the Ability class, or
  2. A code somewhere somehow overrides the Ability class.

The workaround-solution is to manually load the Ability file by appending the following at the end of the application.rb

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM