【问题标题】:Undefined method `admin' using cancancan使用cancancan的未定义方法“admin”
【发布时间】:2019-06-24 21:10:02
【问题描述】:
class Ability
include CanCan::Ability

  user ||= User.new # guest user (not logged in)

  if user.admin
    can :manage, :all
  else
    can :read, :all
  end
end

我正在使用has_many through 关联。有 3 个表 - 用户、角色和用户角色。 UserRole 表用于连接用户和角色表。在 UserRole 表中,我存储了 user_id 和 role_id。没有名为 admin 的属性。如何更改上述代码以检查用户是否为管理员?

【问题讨论】:

  • 你使用 rolify gem 来做角色吗?
  • 没有。我用过 gem 'cancancan'
  • @Vasilisa 上面肯定有rolify gem。 Sneha 在 gemfile 中检查一次是否包含 rolify
  • @Sneha,我了解康康康。您是否实现了自己的角色,还是来自 rolify gem?按照 ray 的建议,检查 Gemfile
  • User.instance_methods.map(&:to_s).select { |x| x.match /admin/ } 在 rails 控制台中,它提供了什么?

标签: ruby-on-rails


【解决方案1】:

考虑你的角色表有字段'name'并且它有一些内容('admin'、'guest'等)

打开你的模型 app/models/user.rb 并在下面添加方法

def admin?
  self.roles.find_by_name('admin') ? true : false
  # since one user has many roles you should find by role name
  # whether it has role with name admin
  # if it find the record the method will return true 
end

在你的ability.rb中你可以设置如下

class Ability
include CanCan::Ability

  user ||= User.new # guest user (not logged in)

  if user.admin?    # I changed admin to admin? to match method above
    can :manage, :all
  else
    can :read, :all
  end
end

【讨论】:

    猜你喜欢
    • 2018-09-09
    • 1970-01-01
    • 2015-11-28
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    相关资源
    最近更新 更多