第一个问题是,你为这个项目设定好自己的角色了吗?User
?
应用程序/模型/user.rb
class User < ActiveRecord::Base
attr_accessible :email, :password, :remember_me
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, # regular devise stuff
before_create :setup_default_role_for_new_users
ROLES = %w[admin default banned]
private
def setup_default_role_for_new_users
if self.role.blank?
self.role = "default"
end
end
end
正如你所看到的,我在这里有 3 个不同的角色,当创建新用户时,他们总是default
用户。现在 CanCan 设置完毕,假设您想要admin
能够做一切事情,default
用户可以使用自己的个人资料执行所有操作,banned
用户无法执行任何操作,访客用户可以查看个人资料:
class Ability
include CanCan::Ability
# Remember that CanCan is for a resource, meaning it must have a class(model).
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.role == "admin"
can :manage, :all
elsif user.role == "default"
can :manage, Profile, :user_id => user.id
elsif user.role == "banned"
cannot :manage, :all
else
can :read, Profile # guest user
end
end
end
这就是让用户只编辑自己的个人资料而不编辑其他人的方法。
其他一些方便的注意事项:确保您有一个user_id
列在你的Profile
桌子。另外,如果您可能需要让猜测用户看到这样的个人资料:
class ProfileController < ApplicationController
before_filter :authenticate_user!, :except => :show
load_and_authorize_resource
end
他们将无法使用任何其他操作,并且 CanCan 仍会检查其他所有操作的身份验证,除了show
.
祝你好运!
UPDATE: 为用户创建 :role 属性
我所做的是运行迁移,添加role
列到设计users
table:
rails generate migration add_role_to_users role:string
进而rake db:migrate
。新的迁移文件应如下所示,并检查您的数据库/模式.rb文件以确保其在用户表中的部分正确。如果不是那么rake db:drop
, then rake db:create
进而rake db:migrate
again.
class AddRoleToUsers < ActiveRecord::Migration
def self.up
add_column :users, :role, :string
end
def self.down
remove_column :users, :role
end
end
这就是你成功制作的方法user.role
work.
注意:请确保您离开该行:can :manage, Profile, :user_id => user.id
保持原样,没有任何变化。添加后应该可以工作role
列至user
.
重要的!如果您使用 Rails 3,请执行以下操作NOT MAKE role
attr_accessible
或者每个人都可以编辑自己的角色! Rails 4 用途参数强 http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html默认情况下,不受此问题的影响,因为您可以选择允许的参数。