はカンカンのwikiからAbilities in DatabaseとAbility for Other Usersを参照してください。
class Ability
include CanCan::Ability
def initialize(user)
can do |action, subject_class, subject|
user.permissions.find_all_by_action(aliases_for_action(action)).any? do |permission|
permission.subject_class == subject_class.to_s &&
(subject.nil? || permission.subject_id.nil? || permission.subject_id == subject.id)
end
end
end
end
EDIT
いくつかの負荷の最適化:
class Ability
include CanCan::Ability
def initialize(user, context = nil)
if context.nil?
can do |action, subject_class, subject|
user.permissions.find_all_by_action(aliases_for_action(action)).any? do |permission|
permission.subject_class == subject_class.to_s &&
(subject.nil? || permission.subject_id.nil? || permission.subject_id == subject.id)
end
elsif context == :post
can :manage, Post, :id => y
elsif context == :users
can :manage, User, :id => x
end
...
やコントローラで:
class UsersController
protected
def current_ability
Ability.new(current_user, :users)
class PostsController
protected
def current_ability
Ability.new(current_user, :posts)
はい、私は同じようにそれを実装しましたこれは今、しかしそれはあまりにも多くの再作成DBへのクエストは、ページの読み込み時に発生します。私はこれを行うための適切な方法があることを知りたい。 –
あなたはメモリ内のパーミッションテーブルを作成したり、2番目のコンテキスト変数を能力コンストラクタに渡したり、コンテキストに基づいてコンテキストを読み込み、古典的なCanCanを使用してそれらを定義することができます – clyfe
これは最も簡単な方法です。そうする必要があります。ありがとう –