2011-10-26 7 views
10

私は能力クラスを定義して、ログインしたユーザーに応じて、その能力のクラスを提供することができますどのように私は思っていた。Railsのできる複数の工夫の私は、アクティブな管理を使用していますモデル

、ことができ及び考案用CAN能力クラス私はUserとAdminUserモデルを作成しました。

私たちは確かにカスタム機能ファイルと使用を定義することができることを決定するために、私はこのwikiエントリを使用していた

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 

    if (user) 
     can :manage, Item 
    end 
    end 
end 

今私のability.rbでこれを持っている代わりにability.rbの:

付ける機能https://github.com/ryanb/cancan/wiki/changing-defaults

しかし、私がやってみたかったです、「管理者以外のユーザーが」で署名されている場合ability.rb使用することができ、カスタムユーザーadminがで署名されている場合。

質問:カスタムのものは必要なく、1つのability.rbファイルでアクセス許可を設定できますか?

+0

ああ、そうです。私はあなたがUserとAdminUserのために別のクラスを使用したことに気付かなかった。 Active Adminで使用するクラスを変更できるはずですが、そのシステムのユーザーではないため、どこにあるのか正確にはわかりません。おそらくあなたの初期化子をチェックする必要があります。 – jdl

答えて

12

私は実際にActiveAdminを使用したことがないので、何かが欠落しているかどうかは完全にはわかりませんが、そのフレームワークがCanCanに依存しているようには見えません。だからこそ私はあなたがcurrent_abilityメソッドを定義していると仮定しています。そのメソッドはwikiで説明されていて、Ability.new(current_user)でインスタンス化されています。

それが事実だし、あなたのcurrent_userUserまたはAdminUserいずれかであることができれば、何の問題がAbilityクラスで、そのためにチェックでもありません:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 

    if user.kind_of? AdminUser 
     can :manage, Item 
    elsif user.kind_of? User 
     can :read, Item 
    end 
    end 
end 

あなたは、単にユーザーのを見てみることができますそれに応じてルールを変更してください。さらに厳しいチェックのためにkind_of?の代わりにis_a?を使用することもできますが、後で継承することを決定した場合はおそらく必要ではなく、問題を引き起こす可能性があります。

もう1つの方法は、両方のモデルでadmin?メソッドを定義することです。明示的な型チェックはRubyではあまり一般的ではないので、これはもっと良い方法かもしれません。

class User < ActiveRecord::Base 
    def admin? 
    false 
    end 
end 

class AdminUser < ActiveRecord::Base 
    def admin? 
    true 
    end 
end 

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 

    if user.admin? 
     can :manage, Item 
    else 
     can :read, Item 
    end 
    end 
end 
関連する問題