1

好的,所以我正在尝试使用 Devise 和 CanCan 的组合在我的项目中创建一个用户角色系统。我知道这是一个流行的组合,但是在完成了半打半完成的教程之后,我终于得到了一些工作,但仍然有问题。

这是一个描述:用户可以注册,他们可以是管理员、工人或客户。他们选择的选项按原样保存到数据库中,但是当我尝试在 CanCan 中使用这些选项时出现问题。这是我的代码,所以你可以看到我到目前为止:

用户.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

角色.rb

class Role < ActiveRecord::Base
  has_many :assignments
  has_many :users, :through => :assignments
end

赋值.rb

class Assignment < ActiveRecord::Base
  belongs_to :user
  belongs_to :role
end

能力.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

项目.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并确保我的代码是相同的,尽管改变了用户角色,但我一直收到同样的错误:

CanCan 的 Rails 错误

load_and_authorize_resource在我的项目控制器和我的项目视图中有:

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

现在什么都没有。这有点紧急,而且我在 Rails 方面的经验并不多,所以我将非常感谢你们中的任何人提供的任何帮助或建议。如果您需要查看我的更多代码或想描述更多我想要完成的工作,请告诉我。谢谢!

4

1 回答 1

2

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

在您的 user.rb 上

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

然后 user.roles 将被定义;)

于 2012-12-11T02:54:42.530 回答