Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用CanCan将用户角色实现到项目中_Ruby On Rails_Ruby On Rails 3_Devise_Cancan_Authentication - Fatal编程技术网

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

Ruby on rails 使用CanCan将用户角色实现到项目中,ruby-on-rails,ruby-on-rails-3,devise,cancan,authentication,Ruby On Rails,Ruby On Rails 3,Devise,Cancan,Authentication,好的,所以我尝试在我的项目中创建一个用户角色系统,使用Desive和CanCan的组合。我知道这是一个流行的组合,但在完成了半打半完成的教程后,我终于找到了一些可行的方法,但仍然有一个问题 这里有一个描述:用户可以注册,他们可以是管理员、工作人员或客户端。他们选择的选项会保存到数据库中,但当我尝试在CanCan中使用这些选项时,问题就出现了。这是我的代码,您可以看到我目前拥有的: user.rb class User < ActiveRecord::Base devise :data

好的,所以我尝试在我的项目中创建一个用户角色系统,使用Desive和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
class Role < ActiveRecord::Base
  has_many :assignments
  has_many :users, :through => :assignments
end
class Assignment < ActiveRecord::Base
  belongs_to :user
  belongs_to :role
end
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
project.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
class Role < ActiveRecord::Base
  has_many :assignments
  has_many :users, :through => :assignments
end
class Assignment < ActiveRecord::Base
  belongs_to :user
  belongs_to :role
end
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

现在什么都没用。这有点紧急,我在Rails方面没有那么多经验,所以我非常感谢你们提供的任何帮助或建议。如果您需要查看更多我的代码,或者希望更多地描述我试图实现的目标,请告诉我。谢谢

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

在你的user.rb上

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

然后将定义user.roles;)

3件事,首先,在您的用户模型中尝试替换
角色。包括?role.to_s
self.roles.include?角色。到_
。第二,你的宝石是最新的吗?确保您使用的是最新版本,可能只需运行
bundle update
。第三,如果你有时间重构的话,我建议将rolify gem添加到Desive和cancan组合中,因为它太棒了。非常感谢你的回复!Rorra,我添加了代码,它消除了错误。然而,似乎即使我的用户是Admin(),并且我已经在ability.rb中设置了用户角色来管理所有内容,我仍然看不到编辑链接。(在ability.rb中使用与上述相同的代码)。但是,当我在
user | | |=user.new#guest user
之后将代码更改为拥有
can:manage,:all
时,这意味着站点上的每个人都将拥有管理所有权限,我可以看到编辑链接,因此问题存在于我的
if user.role?:管理员可以:manage,:all
codeok,所以我的答案至少值得一票:P尝试运行控制台(如脚本/rails控制台),并检查您的用户是否实际拥有管理员角色。也许你可以做一些像User.where(电子邮件:“my_User\u email\u hear”)。first.role?:管理员,如果您的用户实际拥有或不拥有该角色,那么您正在调试,现在的问题很有可能是您的用户没有管理员角色,或者它拥有管理员角色,但无法检索。当然,您应该获得投票权哈哈,很抱歉:)所以我打开了控制台,我得到的是:。角色正在数据库中保存。我还替换了我的代码
if user.role?:管理员
与您的
如果用户。其中(电子邮件:keenanpayne15@yahoo.com)第一个角色是什么管理员
,没有任何更改。这就像CanCan的模型无法读取角色一样,除非我的语法关闭。。。。再次感谢你的帮助。本周我将完成一个最终项目,非常感谢您的帮助。您可以在控制台上运行:User.where(电子邮件:keenapayne15@yahoo.com“”。第一。角色和用户。其中(电子邮件:keenapayne15@yahoo.com你的角色是什么管理员,看起来您的用户除了与角色表有关联外,还有一个名为role的属性,这可能是让您感到困惑的问题,因为通过查看role属性,您认为该用户具有“admin”角色,但实际上他只是在名为role的未使用列上具有该角色。我想说的是,你和角色之间有一个m:N关系,并且你有一个字段和一个命名为role的字段。我不想让它以任何方式与数据库关联,只想与我在user.rb
ROLES=%w[admin worker client]
中声明的常量数组关联。