2017-05-12 2 views
1

는 I는 cancancan 보석의 역할 기능 (레일 5 POSTGRES 고안)을 선언.cancancan 행 기반 필터

난 단지 show SalesDatum 예를 들어 user_id 로그인 한 수 있기 때문 쇼 작업에서 작동하십시오 USER_ID에 기록하기 때문에

제대로

http://localhost:8080/projects/19/sales_data/961 가 인증 도착은 sales_data에 USER_ID 일치

http://localhost:8080/projects/19/sales_data/800 로그인 한 user_id가 sales_data의 user_id와 일치하지 않아 인증되지 않았습니다.

그러나 제가 ge t 색인 조치 : http://localhost:8080/projects/19/sales_data 변수의 @sales_data에있는 모든 판매 데이터가 표시됩니다. 관련 USER_ID와 데이터를 표시

load_and_authorize_resource 
def index 
    @sales_data = SalesDatum.where(project_id:params[:project_id]) 
end 

가 어떻게에만 인덱스 조치를받을 수 있나요 : 그래서, 그것은 data.id 800 및 961

판매 데이터 컨트롤러를 보여줄 것인가? Cancan은 user_id에 따라 걸러 낼 수 있습니까?

+0

컨트롤러 쿼리를'SalesDatum.where (project_id : params [: project_id]). (user_id :'current_user.id')'로 편집 할 수 있습니다. – HoosierCoder

+0

이것이 내가 Pundit에 찬성하여 CanCanCan을 포기한 이유입니다. 믿을 수 없을 정도로 간단한 DSL은 인증 범위를 정의하거나 사소한 일을 전혀 다루지 않습니다. – max

답변

1

해시 구문을 사용하여 규칙을 정의해야합니다.

can [:update, :show, :destroy, :index], SalesDatum, user_id: user.id 

당신은 또한 그러므로 edit 행동과를 정의 할 수 있습니다 :

로 단순화 할 수
can [:edit, :update, :show, :destroy, :index], SalesDatum, user_id: user.id 

: SalesDatum가있는 경우

can :manage, SalesDatum, user_id: user.id 

belongs_to :user 당신은 또한 쓸 수 있습니다 정의 :

can :manage, SalesDatum, user: user 
+0

이것은 훌륭합니다. 블록 구문으로이를 수행하는 좋은 방법이 아닙니까? – HoosierCoder

+1

블록 구문은 항상 컬렉션이 아닌 인스턴스에서만 작동하므로 마지막 선택 항목이어야합니다. 컬렉션의 경우 해시 구문을 사용해야합니다. – coorasse