6

ユーザーは多くの組織に所属できます。ユーザーが所属する組織ごとに異なる役割/権限をユーザーに割り当てられるようにしたいと考えています。

たとえば、ユーザー「kevin」は組織「stackoverflow」と「facebook」に属している可能性があります。kevin は、stackoverflow の管理者と、facebook の通常のメンバー (読み書き) になることができるはずです。

ただし、CanCan gem は、単一の組織のユーザー ロールにしか対応していないようです。私はまだ初心者ですが、収集できる限り、CanCan gem はユーザーの役割がメイン アプリにのみ関連付けられていることを前提としています。

できれば CanCan gem を使用して、さまざまな組織に個別の役割を割り当てるにはどうすればよいですか?

4

2 に答える 2

8

ロールを User モデルの文字列フィールドとして保存する必要があると考えています。あなたはまったくする必要はありません:

class User
  has_many :roles
end

class Role
  belongs_to :user
  belongs_to :organization
  attr_accessible :level
end

class Ability
  def initialize(user)
    can :read, Organization
    can :manage, Organization do |organization|
      user.roles.where(organization_id:organization.id,level:'admin').length > 0
    end
    can :write, Organization do |organization|
      user.roles.where(organization_id:organization.id,level:'member').length > 0
    end
  end
end
于 2013-02-21T08:00:37.487 に答える
3

このようなものがあります。解決策は、current_abilityメソッドをオーバーライドすることです。あなたの場合、おそらくユーザーと組織の結合テーブルがあります。それを呼びましょうuser_organizations。この結合テーブルには、特定の組織のユーザーの役割も格納されていると思いますよね?それでは、そのテーブルを使用して現在の能力を定義しましょう。アプリケーションコントローラーで

def current_ability
  # assuming you have a current_user and current_organization method
  Ability.new UserOrganization.where(user_id: current_user.id, organization_id: current_organization.id).first
end

# ability.rb
class Ability
  include CanCan::Ability
  def initialize(user_organization)
    user_organization ||= UserOrganization.new

    case user_organization.role
    when 'admin'
    when '...'
    when nil
      # for users not a member of the organization
    end
  end
end

これがあなたにいくつかのアイデアを与えることを願っています

于 2013-02-21T07:21:58.490 に答える