使用CanCan将用户角色实现到项目中

时间:2012-12-11 02:40:06

标签: ruby-on-rails ruby-on-rails-3 devise cancan authentication

好的,我正在尝试使用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并确保我的代码是相同的,虽然改变了用户角色,但我一直得到同样的错误:

Rails error with CanCan

我的项目控制器中有load_and_authorize_resource,我的项目视图中有:{/ p>

<% if can? :edit, @project %>
    <td><%= link_to 'Edit', edit_project_path(project) %></td>
<% end %>

现在没什么可行的。这有点紧迫,我并不是Rails所经历的所有人,所以我非常感谢任何人的帮助或建议。如果您需要查看我的更多代码或想要描述更多我想要完成的内容,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:2)

您缺少用户与角色之间的关系:)

在您的user.rb

has_many :assignments
has_many :roles, :through => :assignments

然后user.roles将被定义;)