【发布时间】:2017-07-20 06:24:07
【问题描述】:
我希望在我的 rails 应用程序中拥有 3 个用户级别,分别是管理员、经理、客户。所以我创建了一个设计模型作为用户,并添加了一个迁移来添加用户角色。所以当用户注册时,它存储用户角色(无论他是管理员、经理还是客户)。在我的应用程序中,有产品、交付、服务的模型和控制器。我想为每个模型设置访问级别。
因此管理员可以访问所有模型、控制器
经理有权访问产品、交付
客户可以访问服务
我已经编写了如下的能力模型
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.roles == "admin"
can :manage , :all
elsif user.roles == "manager"
can :read, Products, Delivery
elsif user.roles == "customer"
can :read, Services
end
end
end
在我的产品展示视图中,我有以下代码
<% if can? :manage ,@products%>
<h1>Products</h1>
<% @products.each do |product| %>
<p> <%= product.name%>
<p> <%= product.price %><br>
<p> <%= product.qty %><br>
<%end%>
<%end%>
但即使我以管理员身份登录,我也看不到内容。但是当我删除能力检查行时,它可以毫无问题地查看。所以我预测问题应该是使用过的方式授权。 我的用户模型如下。
class User < ApplicationRecord
belongs_to :role
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
ROLES = %i[admin manager customer]
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation, :role)
end
end
在views/devise/registrations/new.html.erb 我已包含以下代码块。
<div>
<%= f.collection_select(:role, User::ROLES, :to_s, lambda{|i| i.to_s.humanize}) %>
</div>
这就是我必须检查我的产品/显示视图中的能力
<% if can? :manage ,@products%>
<h1>Products</h1>
<% @products.each do |product| %>
<p> <%= product.name%>
<p> <%= product.price %><br>
<p> <%= product.qty %><br>
<%end%>
<%end%>
【问题讨论】:
标签: ruby-on-rails ruby devise cancan cancancan