2012-06-18 6 views

答えて

1

あなただけのクラスを確認することができますので、現在のユーザーモデルは、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 
+0

ありがとうStefan。残念ながら、それは動作していないようです。ユーザーケースのみが適用されますが、管理者は適用されません。私が管理者としてログインするときは、ゲスト特権しかありません。おそらく私は間違ったことをしているのですが、私は理解できません。 – user1464499

+1

あなたの管理者に 'Ability#initialize'が呼び出されていない可能性があります。ロギングを追加し、[デフォルトの変更](https://github.com/ryanb/cancan/wiki/Changing-Defaults)をチェックしてください。 – Stefan

1

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

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 
10

はのは、あなたのアプリケーションは、2つの別々のDevise-を持っていると仮定しましょうUserAdminと呼ばれる強力なユーザーモデルです。これは、current_usercurrent_adminのようなメソッドを並べて使用することを意味します。

レッツさらにこれは、他の人が提案した、まさにですが、あなたがする必要がある別のステップがあります

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 

...あなただけの/すべてのカンカン権限設定を含む単一のAbilityクラスを、希望していることを前提としてい取る。

デフォルトでは、CanCanはメソッドcurrent_userが存在するとみなし、Abilityの設定と比較するUserオブジェクトを返します。ただし、管理者のユーザーはcurrent_adminを使用して見つけることができます。 CanCanに管理オブジェクトを見つける場所を知らさずに、彼らは見直されることは決してないので、決して許可を得ることはできません。 管理者を扱うときは、デフォルトを変更する必要があります。

は1つが利用可能な場合は今私達の能力クラスは、管理オブジェクトを見ていきますと、何も存在しない場合、通常のユーザーに頼る... 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 

を次の行を追加します。

さらなる開発が...詳細については

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

、ウィキでChanging Defaultsを参照してください、私たちは自分自身の個別の能力クラスに管理者権限を移動することができます。適切な記事を私に指摘するためのStefanへの名誉。

FYI - CanCanは死んでいる、長いライブCanCanCan最新のバグ修正と新機能同じネームスペースなので、Gemfileのドロップイン宝石の代替品に過ぎません。

gem 'cancancan', '~> 1.8' 
+1

検索した後についに完全な答えが見つかりました – coderVishal

関連する問題