第一个问题是,您是否为User 设置了角色?
app/models/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
这就是您让用户只编辑他们自己的个人资料而不是其他人的方式。
其他一些方便的注意事项:确保您的Profile 表中有一个user_id 列。此外,如果您可能需要让猜测用户看到这样的个人资料:
class ProfileController < ApplicationController
before_filter :authenticate_user!, :except => :show
load_and_authorize_resource
end
他们将无法使用任何其他操作,CanCan 仍会检查除 show 之外的所有其他内容的身份验证。
祝你好运!
更新:为用户制作 :role 属性
我所做的是运行迁移,将role 列添加到设计users 表中:
rails generate migration add_role_to_users role:string
然后是rake db:migrate。新的迁移文件应如下所示,并检查您的 db/schema.rb 文件以确保其正确地与用户表分开。如果不是,则rake db:drop,然后rake db:create,然后再次rake db:migrate。
class AddRoleToUsers < ActiveRecord::Migration
def self.up
add_column :users, :role, :string
end
def self.down
remove_column :users, :role
end
end
这就是您成功使user.role 工作的方法。
注意:请确保您离开:can :manage, Profile, :user_id => user.id,保持原样不变。将role 列添加到user 后应该可以工作。
重要!如果您使用 Rails 3,请不制作role attr_accessible 或者每个人都可以编辑他们的角色! Rails 4 默认使用Strong Parameters 并且不受此问题的影响,因为您可以选择允许的参数。