Search code examples
rubyruby-on-rails-4devisecancan

Issue With CanCan during abilities configuration?


Im new to CanCan and am using it in Rails 4.2.0. I have Both User and Admin privileges set up and have hit a hiccup when setting can and cannot statement in the abilitiy.rb when trying to set the user permissions that talk to the Visitor_parking Model.

my ability.rb file looks like:

class Ability
  include CanCan::Ability

  def initialize(user)

    if user.admin?
        #Grants Admin Permissions to Sites Model
        can :create, Site
        can :read, Site
        can :update, Site
        can :destroy, Site
        #Grants Admin Permissions to Residents Model
        can :create, Resident
        can :read, Resident
        can :update, Resident
        can :destroy, Resident
        #Grants Admin Permissions to Vehicles Model
        can :create, Vehicle
        can :read, Vehicle
        can :update, Vehicle
        can :destroy, Vehicle
        #Grants Admin Permissions to Parking Model
        can :create, Parking
        can :read, Parking
        can :update, Parking
        can :destroy, Parking
        #Grants Admin Permissions to Visitor Parking Model
        can :create, Visitor_parking
        can :read, Visitor_parking
        can :update, Visitor_parking
        can :destroy, Visitor_parking
        #Grants Admin Permissions to Trespass Model
        can :create, Trespass
        can :read, Trespass
        can :update, Trespass
        can :destroy, Trespass
        #Grants Admin Permissions to Reports Model
        can :create, Report
        can :read, Report
        can :update, Report do |report|
            report.user == user
        end
        cannot :destroy, Report
    else
        #Grants User Permissions to Sites Model
        cannot :create, Site
        can :read, Site
        cannot :update, Site
        cannot :destroy, Site
        #Grants User Permissions to Residents Model
        cannot :create, Resident
        can :read, Resident
        can :update, Resident
        cannot :destroy, Resident
        #Grants User Permissions to Vehicles Model
        cannot :create, Vehicle
        can :read, Vehicle
        can :update, Vehicle
        cannot :destroy, Vehicle
        #Grants User Permissions to Parking Model
        can :create, Parking
        can :read, Parking 
        can :update, Parking
        cannot :destroy, Parking
        #Grants User Permissions to Visitor Parking Model
        ##can :create, Visitor_parking
        ##can :read, Visitor_parking
        ##can :update, Visitor_parking
        ##cannot :destroy, Visitor_parking
        #Grants User Permissions to Trespass Model
        can :create, Trespass
        can :read, Trespass
        cannot :update, Trespass
        cannot :destroy, Trespass
        #Grants User Permissions to Reports Model
        can :create, Report
        can :read, Report
        can :update, Report do |report|
            report.user == user
        end
        cannot :destroy, Report

    end

I know some are going to say that i should use the manage all feature of can can however there will be rules in the admin segment as well so I wanted to CRUD it all out and change as needed.

the Problem lies in the user (else) portion of the code above. (Section commented out with the ## ) the admin privileges work perfectly but when i attempt to set the user privileges i get the following error and am not sure where to go with it.

Error Message I get:

Unable to autoload constant Visitor_parking, expected /Users/TaurenLTD1/Desktop/PatrolPro/Patrol/app/models/visitor_parking.rb to define it

    cannot :destroy, Parking
        #Grants User Permissions to Visitor Parking Model
      -->  can :create, Visitor_parking is what is hilighted red in the error message (but matches the admin perfectly)??? --->
        can :read, Visitor_parking
        can :update, Visitor_parking
        cannot :destroy, Visitor_parking

This is what the VisitorParking Model Looks Like in full

class VisitorParking < ActiveRecord::Base

  # Adds Relationships to Visitor Parking
  belongs_to :user
  belongs_to :site

  # Adds Import / Export Functionality To Reports
   def self.import(file)
    CSV.foreach(file.path, headers: true) do |row|
      VisitorParking.create! row.to_hash
    end
  end

  def self.to_csv
    CSV.generate do |csv|
      csv << column_names
      all.each do |visitor_parking|
        csv << visitor_parking.attributes.values_at(*column_names)
      end
    end
  end

end

i am a bit of a rails amateur and this is the first time I've ever worked with cancan so it may be something small I'm just not picking up... Any help is greatly appreciated!


Solution

  • You spelled VisitorParking wrong: Visitor_parking. Try to fix it.

    I'm not sure how it can work in the if branch of your conditional, to be honest.