-1

助けが必要!:)


ユースケース: 管理者は「スーパー管理者」の役割を持っている場合に別の管理者を作成でき、管理者は「エージェント」も作成できます

管理者モデルの役割:

  1. スーパー管理者
  2. 管理者

管理者は両方の役割を作成でき、「エージェント」を作成できます


エージェントは「ユーザー」を作成できますが、「エージェント」を作成することはできず、他のエージェントによって作成されたユーザーは表示されません。彼の役割は「エージェント」の 1 つだけです。


問題は次のとおりです。アビリティで「管理者」、「エージェント」、および「ユーザー」を初期化する方法は、3 つの異なるモデルであるためです。

class Ability
  def initialize(user)
    user ||= User.new # guest user (not logged in)
    can :read, Photo, Photo.unowned do |photo|
      photo.groups.empty?
    end
  end
end

注: ユーザーは Agent の下にあり、Agent は Admin の下にあります。異なるモデルにする必要があります。

4

2 に答える 2

2

さて、私はあなたが「ユーザー」のような基本モデルであなたの役割を定義することを提案します。次に、これを使用してユーザー階層を作成します。モデルは役割を初期化する必要があります。ユーザーを作成するとします。その場合、ロールは:userのようになります。アクションを実行しようとするユーザーは、(コントローラーが明確に定義されている場合)「初期化」を実行します。

initializeメソッドは、ロールを初期化するのではなく、その特定のロールのルールを初期化することです。

class Ability
   def initialize(user)
      user ||= User.new # guest user (not logged in)

      if user.role == :admin
         can :read, Photo, Photo.unowned do |photo|
           photo.groups.empty?
      elsif user.role == :agent 
         # rules for agents
      else
         # rules for others
      end
  end
end
于 2012-09-27T13:43:05.897 に答える
0

必要なのはネストされた属性です。これにより、ユーザーのタイプごとに個別のモデルを持つ単一の User モデルを持つことができます (さまざまなロールが必要とする情報のタイプが大きく異なる場合)。たとえば、エージェントには教育、分野または地域、および個人の Web サイト属性があり、通常のユーザーには会社、お気に入りの引用などがあります。

User モデルには、すべての役割が必要とする情報 (電子メール、パスワード、名前、役割) が含まれますが、各役割のモデルには、その役割に固有の情報が含まれます。このようにして、CanCan のドキュメントに従って承認を行うことができますが、役割固有の情報は引き続き保持されます。

nested_attributes には優れた Railscast があります: http://railscasts.com/episodes/196-nested-model-form-part-1 (パート 1) および http://railscasts.com/episodes/197-nested-model-フォーム パート 2

注:これらの railscast のエピソードは、質問と回答の機能を作成することに特化していますが、それらが教える概念は、あなたの状況に直接適用できます。

于 2012-09-26T23:02:35.390 に答える