如何使用Pundit为两个控制器设置授权策略?

时间:2015-07-28 03:09:46

标签: ruby-on-rails-4 pundit railsapps

我正在使用RailsApps Pundit Tutorial学习Pundit,教程中的这句话让我很困惑:

  

鉴于策略对象名为UserPolicy,我们将使用它   对于来自Users控制器的授权,您可能会错误地假设   策略对象的名称将始终与该名称相匹配   控制器。事实并非如此。

  1. 如何创建一个策略(o策略集),允许用户使用" role_a"使用带有" role_b"的users_controller.index操作和用户使用orders_controller.index动作?

    1.1这是否需要两个不同的策略(UserPolicy和OrderPolicy),还是应该以不同的方式为每个控制器命名索引操作,以便在UserPolicy上区分它?

1 个答案:

答案 0 :(得分:2)

是的,它需要两个不同的政策( UserPolicy OrderPolicy

#user_policy.rb
class UserPolicy
attr_reader :current_user

  def initialize(current_user)
    @current_user = current_user
  end

  def index?
    @current_user.role_a?
  end
end

并使用index

users_controller方法
def index
  @user = User.find(params[:id])
  authorize @user
end

OrderPolicy

相同
#order_policy.rb
class OrderPolicy
attr_reader :current_user

  def initialize(current_user)
    @current_user = current_user
  end

  def index?
    @current_user.role_b?
  end
end

并使用index

orders_controller方法
def index
  @user = User.find(params[:id])
  authorize @user
end