7

El complemento (Nimble 0.3) que estoy usando en mi aplicación Grails, incluye algunos controladores y acciones asociadas. Quiero cambiar (ligeramente) el comportamiento de algunas acciones, y me preguntaba cómo puedo lograr eso.¿Cómo ampliar/anular las acciones del controlador de los complementos?

¿Puedo crear un controlador secundario que herede de mi controlador de complemento y anular parte de la implementación de la acción?

O, ¿puedo crear otro Controlador con el mismo nombre como el controlador de complemento pero ubicado en un paquete diferente?

Bueno, realmente lo que realmente necesito entender es: ¿cómo Grails determina qué acción del controlador llamar al cuando hay conflictos de nombres?

Respuesta

8

Asumiendo que tiene un controlador plug-in llamado PluginController y una acción 'foo' que desea anular, puede subclase el controlador:

class MyController extends PluginController { 

    def foo = { 
     ... 
    } 
} 

pero tendrá que hacer algunos trabajos en urlMappings:

class UrlMappings { 

    static mappings = { 
     "/$controller/$action?/$id?" { 
     constraints {} 
     } 

     "/myController/foo/$id?"(controller: "myController", action: "foo") 
     "/myController/$action?/$id?"(controller: "pluginController") 
     "/pluginController/$action?/$id?"(controller: "errors", action: "urlMapping") 

     "/"(view:"/index") 
     "500"(view:'/error') 
     "404"(controller: "errors", action: "notFound") 
    } 
} 

y esto depende de una ErrorsController:

class ErrorsController { 

    def notFound = { 
     log.debug "could not find $request.forwardURI" 
    } 

    def urlMapping = { 
     log.warn "unexpected call to URL-Mapped $request.forwardURI" 
     render view: 'notFound' 
    } 
} 

cuales rend una página 404 si llama a las viejas acciones del controlador "sin asignar". Tendrá que crear grails-app/views/errors/notFound.gsp para mostrar una página 404 adecuada.

La primera asignación de URL garantiza que se llame a su acción anulada. El segundo dirige todo lo demás al controlador original. Y el tercero envía 404s para acceso directo.

+0

Burt, ¿y si el complemento define '" 404 "(ver: '/ error')', puedo anular eso con mi propia asignación "404", pero a una acción en un controlador personalizado en su lugar? – raffian

0

Subclase la clase original y anulo el comportamiento que necesita. Estoy haciendo mucho de eso con otro plugin, y funciona genial.

Una forma alternativa es, por supuesto, usar el complemento en línea y simplemente modificar la fuente original, pero eso es peor, ya que tendrá un problema con las actualizaciones.

También soy usuario de Nimble, y si crees que tu extensión podría ser utilizada por otras personas, entonces podrías contribuir: es muy fácil tratar de asegurarte de que sea muy extensible.

+0

Jean, en realidad estoy de subclases el controlador original y anulando algunas acciones, pero Griales todavía ruta mis solicitudes a la mayor acciones (y no a la acción del controlador de subclase). Para que funcione, necesitaba cambiar el nombre de la acción dentro del complemento en línea. ¿Sabes cómo forzar a Grails a usar una acción de controlador en lugar de otra? – fabien7474

2

Con Grails 1.3.7 y Nimble plugin 0.4 descubrí que la solución de UrlMapping de Burt no funcionaba para mí. Sin embargo, la simple creación de un controlador que ambas subclases controlador plug-in y tiene el mismo nombre trabajado, por Burt other answer

class AuthController extends grails.plugins.nimble.core.AuthController{ 

    private static String TARGET = 'grails.plugins.nimble.controller.AuthController.TARGET' 

    def login = { 
     // custom logic here  
    } 
} 
Cuestiones relacionadas