2014-12-17 3 views
3

새로운 인공 발판을 만들 때 app/policies/application_policy.rb에서 사용할 수있는 기본 전문가 설정을 사용하고 싶습니다. 하나도 만들지 않고 model_name_policy.rb 나는 항상 unable to find policy 오류가 발생합니다.기본 app/policies/application_policy.rb를 사용하는 방법은 무엇입니까?

특정 모델에 대한 규칙을 설정하지 않았을 때 어떻게 기본값을 사용할 수 있습니까?

+0

혹시 이것에 대한 해결책을 찾았습니까? 나는 같은 상황에 처해 있으며 최종 접근 방식에 대해 궁금합니다. – geoboy

답변

1

각 모델에 대한 정책을 만들지 않고도 방법을 모르지만 응용 프로그램 정책을 상속하는 정책을 만들 수 있습니다. 귀하의 ApplicationPolicy는 다음과 같이 보일 수 있습니다 : 새로운 발판을 설정할 때

class ApplicationPolicy 
    def index? 
    true 
    end 

    def show? 
    true 
    end 

    ... More actions ... 
end 

는, 단순히 응용 프로그램 정책에서 상속 빈 정책을 추가 :

class UserPolicy < ApplicationPolicy 

end 

작업은 ApplicationPolicy에서 상속합니다. 필요한 경우 언제든지 기본값을 무시할 수 있습니다.

classUserPolicy < ApplicationPolicy 
    show? 
    @user.admin == true ? true : false 
    end 
end 

희망이 있습니다.

+0

조언 해 주셔서 감사합니다. 나는 새로운 클래스에 대한 정책 파일을 만들 필요가없는 진정한 기본값을 찾고있다. – wintermeyer

+0

찾았습니까? –

2

가장 쉬운 방법은 Pundit::PolicyFinder#policy!에 의해 제기 된 Pundit::NotDefinedError에서 구출하는 것입니다.

을 감안할 때 기본 정책 :

# app/policies/application_policy.rb: 
ApplicationPolicy = Struct.new :user, :record do 
    def index? 
    true 
    end 

    def show? 
    true 
    end 

    # ... other sensible defaults 

end 

당신이 레일 컨트롤러에이를 사용하는 가정 :

# app/controllers/application_controller.rb: 
class ApplicationController 
    include Pundit 

    # ... 

    private 

    def policy(record) 
    super 
    rescue Pundit::NotDefinedError 
    ApplicationPolicy.new pundit_user, record 
    end 
end 

면책 조항 : 나는 또한 명시해야하는 암시 적 기본 정책 is generally frowned upon를 작성. 가장 단순한 경우 또는 가장 비관적 인 기본값 (모두 거짓)을 제외하고 지나치게 관대 한 정책이 통과하기가 너무 쉽습니다.