6

몇 가지 일반 양식 기능을 위해 자체 엔진을 구축 한 Rails 응용 프로그램에서 CanCan 권한을 사용하고 있습니다. 사용자가 내 엔진 컨트롤러의 동작에 자유롭게 액세스 할 수 없도록 내 시스템의 사용 권한을 잠그고 싶습니다. 이 컨트롤러는 대부분 7 가지 REST 동작을 사용하기 때문에 CanCan의 load_and_authorize_resource을 각 컨트롤러의 맨 위에 사용하고 싶습니다. 나는이 같은 내 코드를 작성할 때CanCan : MainApp 이외의 네임 스페이스에서 load_and_authorize_resource

그러나 :

module MyEngine 
     class FormController < ApplicationController 
     load_and_authorize_resource 
     ... 
     end 
    end 

나는이 오류가 발생합니다 :

내 생각이 load_and_authorize_resource의 자동 로더가 내 MainApp 네임 스페이스에 연결되어 있는지
uninitialized constant Form 

및 다른 네임 스페이스에서 호출한다는 것을 인식하지 못하므로 MyEngine::Form.find(params[:id]) 대신 Form.find(params[:id])과 같은 호출이 수행됩니다.

이 경우 어떻게 해결할 수 있습니까? authorize!이 여전히 올바르게 작동하기 때문에 엄청난 문제가 아니므로 각 작업마다 개별적으로 인증을 정의 할 수 있지만 load_and_authorize_resource 메서드를 사용할 수 있다면 훨씬 더 깨끗합니다.

+0

가능한 [CanCan을 사용하는 네임 스페이스 컨트롤러 및 중첩 컨트롤러 인증] 복제본 (http://stackoverflow.com/questions/12334367/authorizing-namespaced-and-nested-controllers-using-cancan) –

답변

6

CanCan::ControllerResource#namespace에서 버그가 수 있도록 보인다 보시다시피

def namespace 
    @params[:controller].split("::")[0..-2] 
end 

, 그것은 ::에 의해 컨트롤러 경로를 분할하려고하지만 my_engine/my_controller의 형태로 제공됩니다.

그래서 수정은 바보 간단하다 :

def namespace 
    @params[:controller].split("/")[0..-2] 
end 

원더 그들이 오랫동안 그런 바보 같은 버그를 놓칠 수있는 방법. 풀 요청을 보내야합니다.

P. 방금 대답했습니다. 8)

+1

오! 훨씬 더 흥미 롭습니다. 그들은 master 브랜치에 수정 사항을 병합하는 것을 잊어 버리는 것 같습니다. https://github.com/ryanb/cancan/issues/663 –

+0

좋은 정보, 이것이 내가 필요한 것입니다! –

+1

이 패치는 [1.6.10]에 적용되었습니다 (https://github.com/ryanb/cancan/pull/675) –

8

CanCan에서 네임 스페이스 모델을 찾을 수 없습니다. 클래스를 지정하려고 : 모델 클래스가 컨트롤러와 다르게 네임 스페이스입니다

load_and_authorize_resource class: MyEngine::Form 
3

경우, :class 옵션을 지정해야합니다.

module MyEngine 
    class FormController < ApplicationController 
    load_and_authorize_resource :class => MyEngine::Form 
    ... 
    end 
end 
+0

이것에 대해 '초기화되지 않은 상수 MyEngine :: Form'이 나타납니다. – hlcs