2012-08-24 16 views
11

Attualmente sto leggendo e lavorando gli esempi in Getting Started with Grails, Second Edition by Scott Davis & Jason Rudolph.Impedire che il metodo in Grails Controller venga esposto come azione

Questo libro è stato scritto utilizzando Grails 1.2.

Hanno un esempio di codice in cui creano un metodo debug() chiamato da beforeInterceptor e ha spiegato che dal momento che debug() è un metodo, non viene esposto all'utente tramite URL. Spiegano che le chiusure sono esposte come azioni del controllore all'utente finale, ma i metodi non lo sono.

Ho anche visto sul Grails 1.3 documentation, alludono ad un metodo normale:

def auth() { ... } 

essere trattati come privato perché è un metodo, non una chiusura. Il che era vero a partire da Grails 1.3.

Tuttavia, a partire da Grails 2.0.0, Controller Actions can be implemented as both methods and closures.

Questo mi ha portato a chiedermi (e provare a capire) un modo per replicare la funzionalità disponibile in Pre-Grails 2.0.0 di creare un metodo in un controller che non viene esposto all'utente finale.

Ho pensato a 2 possibili approcci e mi chiedevo quale sarebbe stato migliore stile/pratica e perché?

  1. Impostazione di accesso come private, vale a dire private def auth()
  2. Impostazione allowedMethods per il metodo di stringa vuota:

    static allowedMethods = [save: "POST", update: "POST", delete: "POST", auth: ""] 
    

entrambi gli approcci sembrano per ottenere l'effetto desiderato. Tuttavia, il primo approccio fornisce un codice di errore HTTP 404 e il secondo approccio fornisce un codice di errore HTTP 405.

Qualcuno sa quale approccio sarebbe preferibile? Inoltre, ci sono altri approcci o una "tecnica delle migliori pratiche" per farlo?

risposta

13

In Grails 2.0, tutti i metodi contrassegnati come privati ​​o protetti non sono considerati azioni.

Contrassegnare un metodo in questo modo sarebbe più informativo per motivi di manutenzione, perché è visibile proprio alla dichiarazione del metodo se il metodo è utilizzabile invece di dover guardare indietro alla variabile allowedMethods. Inoltre, un metodo inaccessibile non verrà accidentalmente reso accessibile se la sua dichiarazione viene rimossa o non aggiunta a allowedMethods.

4

È preferibile contrassegnarlo come privato perché la 404 nasconde che c'è qualcosa lì dove è possibile utilizzare il 405 per sapere che c'era una funzione chiamata tale. (Non che sarebbe di grande utilità.)

Anche contrassegnare il metodo privato è bello come mostra al metodo che non è un'azione.

+2

+1, i metodi che non devono essere esposti solo non devono essere "esposti", non "non consentire". – shihpeng

Problemi correlati