ruby-on-railsrspeccancancancancan

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.


Solution

  • 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"