2012-08-24 13 views
11

Ich lese derzeit durch und arbeite die Beispiele in Getting Started with Grails, Second Edition by Scott Davis & Jason Rudolph.Verhindern Methode in Grails Controller als Aktion freigegeben werden

Dieses Buch wurde mit Grails 1.2 geschrieben.

Sie haben ein Codebeispiel, wo sie eine debug()-Methode erstellen, die von beforeInterceptor aufgerufen wird, und erklärt, dass seit debug() eine Methode ist, wird es dem Benutzer über URL nicht ausgesetzt. Sie erklären, dass Closures dem Endbenutzer als Controller-Aktionen offen gelegt werden, Methoden jedoch nicht.

ich auch auf der Grails 1.3 documentation sah, verweisen sie auf eine reguläre Methode:

def auth() { ... } 

als privat behandelt werden, weil es sich um ein Verfahren, kein Verschluss ist. Was ab Grails 1.3 galt.

Allerdings ab Grails 2.0.0, Controller Actions can be implemented as both methods and closures.

Das brachte mich dazu, mich zu wundern (und zu versuchen, herauszufinden) eine Möglichkeit, die in pre-Grails 2.0.0 vorhandene Funktionalität zu replizieren, eine Methode in einem Controller zu erstellen, der nicht dem Endbenutzer zugänglich gemacht wird.

Ich dachte über zwei mögliche Ansätze nach und fragte mich, welcher wäre besser Stil/Praxis und warum?

  1. als private Einstellung Accessor, das heißt private def auth()
  2. Einstellung allowedMethods für die Methode zu leeren String:

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

beiden Ansätze schienen die gewünschte Wirkung zu erreichen. Der erste Ansatz gibt jedoch einen HTTP-Fehlercode 404 und der zweite Ansatz gibt einen HTTP-Fehlercode 405.

Wer weiß, welcher Ansatz vorzuziehen wäre? Gibt es noch andere Ansätze oder eine "Best-Practice-Technik"?

Antwort

13

In Grails 2.0 werden alle als privat oder geschützt gekennzeichneten Methoden nicht als Aktionen betrachtet.

Das Markieren einer Methode auf diese Weise wäre aus Wartungsgründen informativer, da direkt an der Methodendeklaration sichtbar ist, ob die Methode umsetzbar ist, anstatt auf die Variable allowedMethods zurückblicken zu müssen. Eine nicht zugängliche Methode wird auch nicht versehentlich zugänglich gemacht, wenn ihre Deklaration entfernt oder nicht zu allowedMethods hinzugefügt wird.

4

Es ist am besten, es als privat zu markieren, weil der 404 verbirgt, dass es dort irgendetwas gibt, wo der 405 verwendet werden könnte, um zu wissen, dass es eine Funktion namens das gab. (Nicht, dass es viel nützen würde.)

Auch die Methode privat zu markieren ist nett, wie es bei der Methode zeigt, dass es keine Aktion ist.

+2

+1, Methoden, die nicht nur ausgesetzt werden sollten nicht "ausgesetzt" werden, nicht "nicht zulassen". – shihpeng