How would I go about defining abilities for several devise models?
3 に答える
あなたのアプリに、 と と呼ばれる、Devise を利用した 2 つの別個のユーザー モデルがあるとUser
しAdmin
ます。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'
これは私のために働いた -
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
現在のユーザー モデルは に渡されるため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