Использование CanCan для авторизации ресурса на основе ассоциации «многие ко многим» - PullRequest
3 голосов
/ 06 мая 2011

У меня есть две Модели, События и Пользователи, которые имеют связь между многими.Пользователь может быть администратором, менеджером или продюсером.Только производитель, который принадлежит событию, должен иметь возможность прочитать это событие.Я пытался применить это ограничение к модели способностей, но она не удалась, и каждый производитель мог прочитать все события.Что я делаю не так?

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

Ответы [ 2 ]

7 голосов
/ 16 ноября 2012

Немного устарел ваш вопрос, но без использования блока вы можете определить вышеуказанное условие следующим образом:

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

В дополнение к этой строке не нужно спрашивать, есть ли у пользователя роль производителя.

0 голосов
/ 31 августа 2011

Проблема в том, что условия в блоке способностей не используются при вызове на основе класса, например Индекс действий. См. https://github.com/ryanb/cancan/wiki/Defining-Abilities-with-Blocks для уточнения.

Для действий с индексами вы должны определить ограничения вне блока.

...