6

ich CanCan für Berechtigungen in meiner Rails-Anwendung bin mit, in dem ich meinen eigenen Motor für einige generische Form Funktionalität aufgebaut habe. Ich möchte Berechtigungen in meinem System sperren, damit Benutzer nicht frei auf die Aktionen meiner Engine Controller zugreifen können. Diese Controller verwenden größtenteils nur die 7 REST-Aktionen, deshalb möchte ich CanCans load_and_authorize_resource oben auf jedem Controller verwenden.CanCan: load_and_authorize_resource in anderem Namensraum als die MainApp

Allerdings, wenn ich meinen Code wie folgt schreiben:

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

ich diesen Fehler:

uninitialized constant Form 

Meine Vermutung ist, dass der automatische Lader in load_and_authorize_resource ist gebunden an meinem MainApp Namespace und nicht erkennt, dass ich es in einem anderen Namespace nenne, und so auch ein Aufruf wie Form.find(params[:id]) statt MyEngine::Form.find(params[:id]).

Wenn dies der Fall ist, wie kann ich dieses Problem beheben? Es ist keine große Sache, weil authorize! noch richtig funktioniert, so kann ich die Berechtigung in jeder Aktion einzeln definieren, aber es würde das Gefühl, viel sauberer, wenn ich in der Lage war, die load_and_authorize_resource Methode zu verwenden.

+0

mögliches Duplikat von [Autorisieren von Namespaced- und Nested-Controllern mit CanCan] (http://stackoverflow.com/questions/12334367/authorizing-namespaced-and-nested-controllers-using-cancan) –

Antwort

6

Es scheint ein Fehler in CanCan::ControllerResource#namespace zu sein:

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

Wie Sie sehen, es versucht Controller Weg durch :: zu spalten, aber es kommt in Form von my_engine/my_controller.

Also das Update ist stumm einfach:

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

Wonder, wie sie so lange solch einen dummen Fehler verpassen könnte. Sollen sie eine Pull-Anfrage senden.

P.S. Sie haben sich gerade angemeldet, um zu antworten 8)

+1

Oh! Es ist noch interessanter: Sie scheinen einfach vergessen zu haben, den Fix zum "Master" Zweig zu verschmelzen. https://github.com/ryanb/cancan/issues/663 –

+0

Nice one, das war genau das, was ich brauche! –

+1

Ein Patch dafür wurde angewendet [in 1.6.10] (https://github.com/ryanb/cancan/pull/675) –

8

CanCan nicht Namespace Modelle. Versuchen Klasse angeben:

load_and_authorize_resource class: MyEngine::Form 
3

Wenn die Modellklasse anders als der Controller Namespace ist, müssen Sie die :class Option angeben.

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

Ich bekomme dafür 'uninitialisierte Konstante MyEngine :: Form'. – hlcs