2

私のアプリでは、ユーザーは多くの会社を持っている可能性があり、企業内で crud アクションに対してさまざまな権限を持つことができます。現在、cancancan gem を使用しており、承認は次のようになっています。

ユーザー.rb

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_many :companies, through: :users_companies
  has_many :users_companies
  has_many :users_roles, dependent: :destroy
  has_many :roles, through: :users_roles

  validates :first_name, :last_name, presence: true

  def has_role?(role_sym)
    roles.any? { |r| r.name.underscore.to_sym == role_sym }
  end
end

Role.rb

class Role < ActiveRecord::Base
  has_many :users_roles
  has_many :users, through: :users_roles
end

ユーザーロール.rb

class UsersRole < ActiveRecord::Base
  belongs_to :user
  belongs_to :role
  #belongs_to :company
end

アビリティ.rb

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # in case of guest
  if user.has_role? :admin
    can :manage, :all
  else
    can :read, :all
  end
  if user.has_role? :moderator
    can :manage, Company
  else
    can :read, :all
  end
    end
end

ユーザーが別の会社を選択した場合、ユーザーは会社モデルを管理できますが、別の会社で権限を持っていません。ユーザーの会社IDを検出する方法は?

4

1 に答える 1

0

あなたが正しいことを理解していれば、それはあなたを助けるでしょう:

can :manage, Company { |company| user.company_id == company.id }

そしてそれを使用します:

if can? :manage, @company
  # do something
end
于 2015-09-22T13:22:05.710 に答える