1

Rails 3 のアプリケーション ロジックをいくつか書き直しているところです。私の DB モデリングについて皆さんの知恵を借りたいと思います。

私のアプリでは、ユーザーはページ、グループ、および画像にアクセスできます。これは、ポリモーフィックな関連付けとして非常に簡単に実行できます。

class Permission < ActiveRecord::Base
  belongs_to :resource, :polymorphic => true 
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :permissions
end

class Page < ActiveRecord::Base
  has_many :permissions, :as => :resource
end

# the same for Page and Picture

ただし、これらのアクセス許可には、AdminPermission、CollaboratorPermission、OwnerPermission など、さまざまな種類も必要です。どうすればそれを行うことができますか?私はこれを行うことができるようにしたい:

p = Page.first
u = User.first
u.admin_permissions.create(:resource => p) 

# should return AdminPermission class, not just Permission
per = User.first.permissions.first 
# should return Page
per.resource

私の質問は次のとおりです。これをどのようにモデル化できますか? これらすべてを 1 つのクラスで行うのではなく、オブジェクトごとに Permission クラスを作成した方がよいでしょうか? これを行うスマートな方法はありますか?Rails のロール/認証プラグインは、ユーザーが特定のロールであることに依存しているため、あまり好きではありません。ここでは、権限によって役割が変わります。ユーザーはグループの管理者になることができますが、イメージのコラボレーターになります。

4

1 に答える 1

2

独自の承認が必要ない場合は、さまざまなプロジェクトのさまざまなユーザーにさまざまな機能を定義する方法について、CanCanと Ryan Batesのコメントを調べることができます。詳細についてはそれを読むことができますが、 current_ability メソッドをオーバーライドする必要があります。

# in controller
def current_ability
  @current_ability ||= Ability.new(current_user, current_project)
end

# in Ability class
def initialize(user, project)
  if user.admin_for_project?(project)
    can :manage, :all
  else
    can :read, :all
  end
end
于 2012-11-02T15:52:44.163 に答える