2016-10-25 114 views
1

当调用此控制器的show方法的GET请求时,我收到“Pundit :: PolicyScopingNotPerformedError”。任何帮助赞赏。Rails Pundit授权未执行

控制器:

class DashboardsController < ApplicationController 
    before_action :authorize_dashboard_for_customer, only: :show 
    after_action :verify_authorized, except: :index 
    after_action :verify_policy_scoped, only: :show 

    expose(:dashboards) { 
    Customer.find(params[:customer_id]).dashboards 
    } 

    expose(:dashboard) { 
    Dashboard.find(params[:id]) 
    } 

    expose(:customer) { 
    Customer.find(params[:customer_id]) 
    } 

    def index 
    end 

    def show 
    end 



    private 

    def authorize_dashboard_for_customer 
    authorize dashboard, :show? 
    end 
end 

这里是权威人士政策:

class DashboardPolicy < ApplicationPolicy 

    def index? 
    show? 
    end 

    def show? 
    customer = user.try(:customer) 
    return false if customer.blank? 

    @record.customers.present? && @record.customers.include?(customer) || user.role == 'admin' 
    end 
end 

我读过关于这个其他职位,但仍然没有看到我在做什么错在这里。我仍然不清楚解决策略范围在做什么,但在这种情况下,我可以从调试声明中看到它正在实施策略,所以我不确定问题是什么。

回答

1

在您的控制器中,您正在检查以确保使用after_action :verify_policy_scoped, only: :show调用策略作用域,但是您没有为您的操作中的作用域调用任何内容。您可以使用Scopes根据登录的用户权限来限制结果。例如,索引屏幕上的管理员用户可能会看到所有结果,但非管理员可能只能看到某些记录。国际海事组织你不应该在展会上需要示波器,所以你应该能够删除verify_policy_scoped

+0

谢谢 - 这有助于一些。 @斯科特 - 你说_但你没有在行动中为范围调用任何东西_我会在策略方法还是在控制器方法中调用这个范围? – Andrew

+0

@andrew您将范围类添加到您的策略类,然后从控制器调用它以检索记录。 – Scott