Using CanCan to authorize a resource based on the association of many, many

I have two models, events and users who share many contacts. The user can be an administrator, manager or producer. Only one who belongs to an event should be able to read this event. I tried to apply this restriction to the opportunity model, but it fails, and every manufacturer can read all the events. What am I doing wrong?

class Event < ActiveRecord::Base
 has_and_belongs_to_many :producers, :class_name => "User", :join_table => "events_producers"
end


class CreateEventUserJoinTable < ActiveRecord::Migration
  def self.up
    create_table :events_producers, :id => false do |t|
      t.integer :event_id
      t.integer :user_id
    end
  end

  def self.down
    drop_table :events_producers
  end
end

class Ability
  include CanCan::Ability
  def initialize(user)
    user ||= User.new() # Guest user
    if user.role? :manager
      can :manage, :all
    elsif user.role? :admin
      can :read, Event
      can :update, Event
      can :create, Event
    elsif user.role? :producer
      can :read, Event do |event|
          event.try(:producers).include?(user)
        end
    end
  end
end
+3
source share
2 answers

, :

can :read, Event, :producers => {:user_id => user.id}

, .

+7

All Articles