好的,我正在尝试使用Devise和CanCan的组合在我的项目中创建用户角色系统。我知道这是一个很受欢迎的组合,但经过半打半完成的教程后,我终于有了一些工作,但我仍然遇到了问题。
以下是说明:用户可以注册,他们可以是管理员,工作人员或客户。他们选择的选项会按原样保存到数据库,但是当我尝试在CanCan中使用这些选项时会出现问题。这是我的代码,所以你可以看到我到目前为止:
user.rb
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :remember_me,
:subdomain, :first_name, :last_name
validates_presence_of :email
validates_uniqueness_of :email, :case_sensitive => false
ROLES = %w[admin worker client]
def role?(role)
roles.include? role.to_s
end
end
role.rb
class Role < ActiveRecord::Base
has_many :assignments
has_many :users, :through => :assignments
end
assignment.rb
class Assignment < ActiveRecord::Base
belongs_to :user
belongs_to :role
end
ability.rb (这是针对CanCan)
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new #guest user
if user.role? :admin
can :manage, :all
else
can :read, :all
end
if user.role?(:worker)
can :create, Project
can :update, Project do |project|
project.try(:user) == user
end
end
end
end
project.rb
class Project < ActiveRecord::Base
has_many :lists, :dependent => :destroy
has_many :messages, :dependent => :destroy
belongs_to :user
attr_accessible :title, :description
validates :title, :presence => true,
:length => { :minimum => 5 }
end
这些都是我的模特。我在这里遵循了教程:http://railscasts.com/episodes/192-authorization-with-cancan并确保我的代码是相同的,虽然改变了用户角色,但我一直得到同样的错误:
我的项目控制器中有load_and_authorize_resource
,我的项目视图中有:{/ p>
<% if can? :edit, @project %>
<td><%= link_to 'Edit', edit_project_path(project) %></td>
<% end %>
现在没什么可行的。这有点紧迫,我并不是Rails所经历的所有人,所以我非常感谢任何人的帮助或建议。如果您需要查看我的更多代码或想要描述更多我想要完成的内容,请告诉我。谢谢!
答案 0 :(得分:2)
您缺少用户与角色之间的关系:)
在您的user.rb
上has_many :assignments
has_many :roles, :through => :assignments
然后user.roles将被定义;)