如何限制对rails(cancan gem)中不同用户角色的模型的访问?

时间:2017-07-17 10:06:10

标签: ruby-on-rails ruby devise cancan

我想在我的rails应用程序中使用3个用户级别作为Admin,Manager,Customer。 所以我创建了3个设计模型作为管理员,经理和客户。 在我的应用程序中,有产品,交付,服务的模型和控制器。 我想为每个模型设置访问级别。

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

经理可以访问产品,交货

客户可以访问服务

我如何编写符合这些要求的能力模型 我写的如下。不知道这是否正确。

class Ability
  include CanCan::Ability
    def initialize(user)
        # Define abilities for the passed in user here. For example:
        #
          user ||= User.new # guest user (not logged in)
          if user.admin?
            can :manage, :all
          elsif user.manager?
            can :manage, product ,delivery
          elsif user.customer?
            can :manage, services
          end
    end

请帮助我编写模型代码,以限制不同的用户角色访问。 请给我足够的帮助!

1 个答案:

答案 0 :(得分:0)

我认为解决这个问题最简单的方法就是在你的控制器中。让我们说你有一个带控制器的书模型,只想让管理员访问这个部分。最好在预订控制器中创建一个方法,并使用before action方法调用它:

class BookingsController < ApplicationController
  before_action :check_admin

  def check_admin
    return unless admin_signed_in?
    redirect_to root_path, error: 'You are not allowed to access this part of the site'
  end
end

这将在每次预订控制器中发生任何事情时执行check_admin方法,并且将重定向到您的根路径,除非管理员已登录.Dextise还附带user_signed_in?和manager_signed_in?如果您已经创建了带有这些名称的模型,那就是帮助者。

您可以通过决定执行操作的控制器操作来定制更多内容,例如

before_action :check_admin, only: [:edit, :create, :delete, :update, :new]

只会在这些控制器操作之前执行检查,并允许任何人访问索引并显示操作。