0

私はこのツタンカーメンをフォローしましたhttp://railsapps.github.com/tutorial-rails-bootstrap-devise-cancan.html私はこのようなことをしたいです:

before_filter :authenticate_user!
before_filter :authenticate_VIP!
before_filter :authenticate_admin!
before_filter :authenticate_somerole!

私はテーブルを持っています:roles、users、user_rolesそして私は別のテーブルを作成したくありません(rails g devise VIPは別のテーブルを作成します)。

メソッドauthenticate_ROLEが必要です。これを行う方法 ?

4

1 に答える 1

3

私には、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行い、adminCRUDを実行でき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コースを読むことしかできないため、管理者が実行できること(この場合は、コースの作成またはコースの編集)を表示したり、実行したりすることはできません。
これは私がオンラインテストアプリに組み込んだものです。アプリを参照して同じことを行うことができます。

于 2012-11-04T20:10:12.830 に答える