Ruby On Rails Pundit Gem授权仪表板

时间:2018-03-15 23:31:06

标签: ruby-on-rails ruby pundit

我如何为提供各种模型数据的仪表板控制器提供权威授权?

我的DashboardsController看起来像这样:

class DashboardsController < ApplicationController
  before_action :authenticate_user!
  before_action :set_user
  before_action :set_business
  after_action :verify_authorized

  def index

  end


  private

  def set_user
    @user = current_user
  end
  def set_business
    @business = current_user.business
  end


end

如何在DashboardsPolicy中为@user和@business授权?

2 个答案:

答案 0 :(得分:0)

Pundit希望将当前用户和模型对象传递给它。在这种情况下,我认为你想要的是一个DashboardsPolicy类,你会授权它:

  def index
    authorize(@business)
  end

来自README

  

Pundit将调用current_user方法来检索要发送的内容   这个论点

     

授权方法自动推断Post会有一个   匹配PostPolicy类,并实例化此类,交付   当前用户和给定记录

README中还有一个关于无头策略的特定部分,它使用仪表板作为示例操作:https://github.com/varvet/pundit#headless-policies

您还可以创建一个普通的ruby对象,它接受两个实体并将其用作您的对象进行授权:

class UserBusiness
  def initialize(user, business)
  end

  ...other methods here
end

@model = UserBusiness.new(user, business)
authorize(@model)

答案 1 :(得分:0)

我认为尝试访问仪表板不是基于名为仪表板的资源的策略,而只是业务策略中的一种特殊方法。

因此,我会将此作为方法BusinessPolicy添加到dashboard

# in your controller
authorize @business, :dashboard?

# and the business_policy
class BusinessPolicy < ApplicationPolicy
  def dashboard?
    # condition depending on a `user` (current_user) and a record (business)
    user.admin? || user.business == record
  end
end

或者它可能更简单。如果允许某人在允许她展示业务时看到该信息中心,则只需在您的控制器中重复使用BusinessPolicy#show?

authorize @business, show?