2011-05-05 90 views
2

我有兩個共享多對多關聯的模型,事件和用戶。用戶可以是管理員,經理或製片人。 只有屬於某個事件的生產者才能夠讀取該事件。我試圖在能力模型上應用這個限制,但它失敗了,每個生產者都可以閱讀所有事件。我究竟做錯了什麼?使用CanCan授權基於多對多關聯的資源

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 

回答

6

有點老了你的問題,但沒有塊的使用情況,您可以定義像上述條件:

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

除了與該行,它應該沒有必要問,如果用戶有一個生產者的角色。