如何在没有控制器的情况下告诉 current_user 给 Pundit

How to tell the current_user to Pundit without a controller

我正在 运行使用包含 Pundit 授权的现有 .html_erb 模板 delayed_job 提取数据,例如:

<%if policy(client).view_contacts? %>

通常 Pundit 会在控制器中寻找 'current_user' 方法来设置 Pundit 策略 class。 但是我没有控制器,因为作业是 运行 从 ActiveJob 使用 ActionView::Base 的实例进行渲染。

我可以将所有策略调用更改为以下形式:

<%if ClientPolicy.new(my_current_user,client).view_contacts? %>

但是我更希望有一个 'current_user' 方法可以被 Pundit

找到

我通过动态包含 Pundit 并将 current_user 的 attr_accessor 添加到正在执行渲染的 ActionView::Base 版本来解决这个问题。

  @av =  ActionView::Base.new(Rails.root.join('app', 'views'))
  @av.class_eval do
     include ApplicationHelper
     include Pundit
     attr_accessor :current_user #for pundit
  end
  @av.current_user=@user

现在,当从视图调用 policy(client) 方法时,它使用 attr_accessor 获取当前用户。