13

How would I go about defining abilities for several devise models?

4

3 に答える 3

17

あなたのアプリに、 と と呼ばれる、Devise を利用した 2 つの別個のユーザー モデルがあるとUserAdminます。current_userこれは、 と をcurrent_admin並べて使用することを意味します。

Abilityさらに、すべての CanCan アクセス許可設定を含む単一のクラスしか持っていない/必要であると仮定しましょう...

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    case user
    when User
      can :create, Comment
      can :read, :all
    when Admin
      can :manage, :all
    end
  end
end

これはまさに他の人が提案したことですが、実行する必要がある別のステップがあります。

デフォルトでは、CanCan はメソッドcurrent_userが存在すると想定し、設定と比較するために User オブジェクトを返しAbilityます。ただし、管理者ユーザーは を使用して見つけることができますcurrent_admin。管理オブジェクトの場所を CanCan に通知しないと、管理オブジェクトがレビューされることはなく、アクセス許可も取得されません。管理者に対処するときは、デフォルトを変更する必要があります。

以下を追加してapplication_controller.rb...

def current_ability
  if admin_signed_in?
    @current_ability ||= Ability.new(current_admin)
  else
    @current_ability ||= Ability.new(current_user)
  end
end

これで、Ability クラスは、利用可能な場合は Admin オブジェクトを調べ、存在しない場合は通常の User にフォールバックします。

さらなる開発により、管理者権限を独自の別の能力クラスに移動できます...

def current_ability
  if admin_signed_in?
    @current_ability ||= AdminPowers.new(current_admin)
  else
    @current_ability ||= Ability.new(current_user)
  end
end

詳細については、Wiki の「デフォルトの変更」を参照してください。適切な記事を教えてくれたStefanに感謝します。

参考までに-- CanCan は死んでいます。CanCanCanは長生きします。バグ修正と新機能で最新の状態に。名前空間は同じなので、Gemfile 内のドロップインの gem 置換にすぎません。

gem 'cancancan', '~> 1.8'
于 2014-05-21T00:49:18.277 に答える
3

これは私のために働いた -

class Ability
  include CanCan::Ability

  def initialize(user)
    if user.is_a?(Admin)
      can :manage, :all
    elsif user.is_a?(User)
      can :create, Comment
      can :read, :all
    else
      can :read, :all
    end
  end
end
于 2012-09-27T02:27:17.883 に答える
2

現在のユーザー モデルは に渡されるためAbility#initialize、そのクラスを確認するだけです。

class Ability
  include CanCan::Ability

  def initialize(model)
    case model
    when Admin
      can :manage, :all
    when User
      can :create, Comment
      can :read, :all
    else
      can :read, :all
    end
  end
end
于 2012-06-18T23:17:05.947 に答える