Канкан состояние - PullRequest
       2

Канкан состояние

0 голосов
/ 22 февраля 2012

Я использую CanCan в проекте для управления различным уровнем роли в каждой сущности для каждого проекта.Я делаю это:

# encoding: utf-8
class Ability
    include CanCan::Ability 
    def initialize(user)
        user ||= User.new            
        if user.is_admin == true
            can :manage, :all
        else 
            can :read, :all
            Project.all.each do |project|
                current_role_name = user.roles.find_by_project_id(project.id).role_name.name
                if current_role_name.eql?'Auteur senior'
                    can :manage, [Project, Introduction, Abstract, Text, Conclusion, Asset, Attachment], :project_id => project.id
                elsif current_role_name.eql?'Auteur junior'
                    can :manage, [Introduction, Abstract, Attachment], :project_id => project.id
                    can :update, Text, :project_id => project.id, :user_level => current_role_name 
                    can :manage, [Asset], :project_id => project.id, :user_level => current_role_name
                elsif current_role_name.eql?'Équipe phylogéniste'
                    can :manage, [Attachment], :project_id => project.id
                    can :manage, [Text, Asset], :project_id => project.id, :user_level => current_role_name
                end
            end    
        end
    end 
end

Это работает, когда я проверяю user role_name, но после того, когда я хочу использовать условие, подобное этому:

can :update, Text, :project_id => project.id, :user_level => current_role_name

Условие не имеет никакогоэффект.Как я могу заставить это работать?

Ответы [ 3 ]

1 голос
/ 23 февраля 2012

Я наконец нашел решение:

В соответствующем контроллере я заменил authorize_resource на load_and_authorize_resource и все.

1 голос
/ 22 февраля 2012

Я обычно использую:

1- определение ролей в моем классе пользователя и их влияние на пользователей.

class User
  # CanCan roles ( see Users::Ability)
  ROLES = %w[auteur_senior auteur_junior]

  def roles=(roles)
    self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.sum
  end

  def roles
    ROLES.reject do |r|
      ((roles_mask || 0) & 2**ROLES.index(r)).zero?
    end
  end

  def is?(role)
    roles.include?(role.to_s)
  end

  # define all bollean set/get methods for roles
  ROLES.each do |r|
    define_method "is_#{r}" do
      self.roles += [r]
      self
    end
    define_method "is_#{r}?" do
      roles.include?(r)
      self
    end
  end
end

2-InНа способности я влияю на возможности каждой роли

class Ability
  include CanCan::Ability
  def initialize(user)
    @user = user || User.new  # for guest

    @user.roles.each { |role| send(role) }
  end

  def auteur_junior
    can :manage, [Introduction, Abstract, Attachment], :project_id => project.id
    can :update, Text, :project_id => project.id, :user_level => current_role_name 
    can :manage, [Asset], :project_id => project.id, :user_level => current_role_name
  end

  def auteur_scenior
    can :manage, [Project, Introduction, Abstract, Text, Conclusion, Asset, Attachment], :project_id => project.id
  end

end
0 голосов
/ 11 июня 2016

Метод authorize_resource вызывает authorize! для класса, если ему не передан экземпляр.Не используя load_resource или load_and_authorize_resource, вы передаете ноль в authorize_resource before_filter.

Пример из документации CanCan :

#authorize_resource(*args) ⇒ Object
authorize!(params[:action].to_sym, @article || Article)

Есливы хотите загружать записи из базы данных с помощью собственного метода (вместо CanCan load_resource) и иметь больший контроль, тогда вы можете создать свой собственный метод, например load_thing, и вызывать его с помощью prepend_before_filter :load_thing. Это загрузит запись в переменную экземпляра до вызова authorize_resource, гарантируя, что переменная экземпляра не равна nil, и проверены правила, указанные в файле способностей.

...