如何在没有控制器的情况下告诉 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 获取当前用户。
我正在 运行使用包含 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 获取当前用户。