2016-10-25 156 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