使用cancancan的3种类型的角色的授权问题



我有用户表(由design创建(,我添加了一个角色列,可以是:admin、manager和agent。在user.rb中,我放了一个ENUM,如下所示:

class User < ApplicationRecord
enum role: { admin: 0, manager: 1, agent: 2 }
end

我正在使用cancancan,想做两件事:

1-如何根据注册用户的角色显示菜单或不同的按钮?在我看来是这样说的:

<% if current.present? && current_user.admin? %>
<%= link_to 'Purchases (Admin access)', admin_purchases_path, class: 'nav-link mr-5 ' %>
<% end %>

2-如何根据用户的角色显示特定页面?在我的User.rb中,我放了这个:

def admin?
self.role == 'admin'
end

我正在试用ability.rb:

user ||= User.new # guest user (not logged in)
if admin?
can :manage, :all
else
can :read, :all
end

在控制器上,我输入:

load_and_authorize_resource

但我得到了一个错误:

NoMethodError in Home#index
undefined method `admin?' for nil:NilClass
<% if current_user.admin? %> <<< On this line here

您可以使用安全导航运算符来避免零错误:

<% if current_user&.admin? %>

然而,它仍然有点反模式。使用CanCanCan这样的授权库的全部目的是整合授权逻辑,而不是将其散布在控制器和视图中。

相反,你的观点应该是询问CanCanCan用户是否被授权做链接所做的任何事情:

<% if can? :administrate, :purchases %>
<%= link_to 'Purchases (Admin access)', admin_purchases_path, class: 'nav-link mr-5 ' %>
<% end %>

它不必知道用户是管理员还是允许管理员管理购买。这是CanCanCan的工作。

user ||= User.new # guest user (not logged in)
if user.admin?
can :manage, :all
can :administrate, :all
else
can :read, :all
end

在我的User.rb中,我放了这个。。

该代码完全是多余的。enum role: { admin: 0, manager: 1, agent: 2 }已经创建了互迁移方法admin?manager?agent?

ability.rb的问题在于,您调用if admin?时没有实际指定收件人。您应该拨打if user.admin?

相关内容

  • 没有找到相关文章

最新更新