6

Estoy usando CanCan para los permisos en mi aplicación Rails en la que he creado mi propio motor para algunas funcionalidades de formularios genéricos. Me gustaría bloquear los permisos en mi sistema para que los usuarios no puedan acceder libremente a las acciones de mis controladores del motor. Estos controladores, en su mayor parte, solo hacen uso de las 7 acciones de REST, por lo que me gustaría usar el load_and_authorize_resource de CanCan en la parte superior de cada controlador.CanCan: load_and_authorize_resource en el espacio de nombres que no sea el de MainApp

Sin embargo, cuando escribo mi código como este:

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

consigo este error:

uninitialized constant Form 

Mi conjetura es que el cargador automático en load_and_authorize_resource está ligado a mi espacio de nombres MainApp, y no reconoce que lo estoy llamando en un espacio de nombre diferente, al igual que una llamada como Form.find(params[:id]) en lugar de MyEngine::Form.find(params[:id]).

Si este es el caso, ¿cómo puedo solucionarlo? No es un gran problema porque authorize! todavía funciona correctamente, por lo que puedo definir la autorización en cada acción individualmente, pero sería mucho más claro si pudiera usar el método load_and_authorize_resource.

+0

posible duplicación de [Autorización de controladores espaciados por nombre y anidados utilizando CanCan] (http://stackoverflow.com/questions/12334367/authorizing-namespaced-and-nested-controllers-using-cancan) –

Respuesta

6

parece ser un error en CanCan::ControllerResource#namespace:

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

Como se ve, se trata de dividir ruta controlador por :: pero viene en forma de my_engine/my_controller.

Así que la solución es simple tonto:

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

preguntarse cómo podía faltar un error tan estúpido por tanto tiempo. Les enviaremos una solicitud de extracción.

P.S. Acabo de registrarme para responder 8)

+1

¡Oh! Es aún más interesante: parece que olvidan fusionar la corrección con la rama 'master'. https://github.com/ryanb/cancan/issues/663 –

+0

Bueno, esto era justo lo que necesitaba! –

+1

Se aplicó un parche para esto [en 1.6.10] (https://github.com/ryanb/cancan/pull/675) –

8

CanCan no puede encontrar modelos con espacios de nombres. Intenta especificar la clase:

load_and_authorize_resource class: MyEngine::Form 
3

Si la clase de modelo es un espacio de nombres diferente que el controlador, tendrá que especificar la opción :class.

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

Obtengo 'constante no inicializada MyEngine :: Form' para esto. – hlcs

Cuestiones relacionadas