私には、Users、Roles、RoleRelationshipsの3つのテーブルがあります(またはrole_users、それはあなた次第です)
これは私の役割テーブルです:
class Role < ActiveRecord::Base
attr_accessible :name
has_many :role_relationships
has_many :users, through: :role_relationships
end
ロールテーブルにはname
、「admin」、「teacher」、「vip」などのロールの列があります(必要に応じて)。
そしてこれはユーザーテーブルです:
class User < ActiveRecord::Base
devise ...
has_many :role_relationships
has_many :roles, through: :role_relationships
end
と私のRoleRelationshipテーブル:
class RoleRelationship < ActiveRecord::Base
attr_protected :role_id, :user_id
belongs_to :user
belongs_to :role
end
私は自分のアプリをセットアップしました。1人のユーザーが多くの役割を持つことができます。あなたは自分のやり方でセットアップすることができます。だから、私はrole?(role)
私の中に次のようなメソッドを持っていuser.rb
ます:
def role?(role)
return role == RoleRelationship.find_by_user_id(self.id).role.name
end
次に、私のabilities
ファイルで、ユーザーの能力を定義します。
def initialize(user)
user ||= User.new # guest user
if user.role? "teacher"
can :read, Course
can :manage, Topic, user_id: user.id
can :create, Topic
else user.role? "admin"
can :manage, Course
end
したがって、teacher
読み取りのみをCourse
行い、admin
CRUDを実行できCourse
ます。これを行うにload_and_authorize_resource
は、CoursesControllerのメソッドを使用します。
class CoursesController < ApplicationController
load_and_authorize_resource
before_filter :authenticate_user!
...
end
最後に、私の見解では、私は次のようなコードを使用しました:
<% if can? manage, @course %>
Only admin can work, see what happen here.
<% end %>
したがって、ご覧のとおり、teacher
コースを読むことしかできないため、管理者が実行できること(この場合は、コースの作成またはコースの編集)を表示したり、実行したりすることはできません。
これは私がオンラインテストアプリに組み込んだものです。アプリを参照して同じことを行うことができます。