无法自动加载常量角色,预期role.rb在rails cancan基于角色的授权中定义它的问题

时间:2017-08-02 08:35:51

标签: ruby-on-rails devise cancan

我正在使用cancan文档开发基于角色的用户授权的rails应用程序。 https://github.com/ryanb/cancan/wiki/Role-Based-Authorization 我想在我的rails应用程序中使用3个用户级别作为Admin,Manager,Customer。所以我创建了一个设计模型作为用户,并添加了迁移以向其添加用户角色。因此,当用户注册时,它会存储用户角色(无论他是管理员,经理还是客户)。在我的应用程序中,有产品,交付,服务的模型和控制器。我想为每个模型设置访问级别。

因此,管理员可以访问所有模型,控制器

经理可以访问产品,交付

客户可以访问服务

我写的能力模型如下

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]

end

角色模型

class ApplicationController < ActionController::Base

end

当尝试访问产品控制器show view时,我收到以下错误。

LoadError in ProductsController#show
Unable to autoload constant Role, expected /Users/tharindu/MyTasks/try2/mynewtask/app/models/role.rb to define it

Extracted source (around line #7):
5
6
7
8
9
10

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

       if user.role == "admin"
         can :manage, :all, @products
       elsif user.role == "manager"
         can :read, Products, Delivery,Accounts

请帮我解决这个问题

2 个答案:

答案 0 :(得分:1)

您的角色模型没有定义角色类。变化

class ApplicationController < ActionController::Base

class Role < ApplicationRecord

答案 1 :(得分:1)

您尝试实施的教程没有单独的Role模型,而您正在添加关联belongs_to :role。而是将role保存在User表中。因此,删除应该解决问题的关联。

目前User只有一个role您也可以使用bitmask为教程中提到的多个角色分配给他。

但是使用这两种方法中的任何一种都不能创建单独的模型,因此无法定义关联,而是需要创建实例方法。对于单独的Role模型,请参阅:https://github.com/ryanb/cancan/wiki/Separate-Role-Model