Запретить метод в контроллере Grails быть выставленным как действие

В настоящее время я просматриваю и обрабатываю примеры в Начало работы с Grails, второе издание Скотта Дэвиса и Джейсона Рудольфа.

Эта книга была написана с использованием Grails 1.2.

У них есть образец кода, где они создают метод debug(), который вызывается beforeInterceptor, и объясняет, что, поскольку debug() - это метод, он не отображается пользователю через URL. Они объясняют, что Closures отображаются как действия контроллера для конечного пользователя, но методы - нет.

Я также видел на документации Grails 1.3, они ссылаются на обычный метод:

def auth() { ... } 

рассматривается как закрытый, поскольку это метод, а не закрытие. Это было так же, как и у Grails 1.3.

Однако, с Grails 2.0.0, Действия с контроллером могут быть реализованы как в обоих методах, так и в закрытии.

Это заставило меня задаться вопросом (и попытаться выяснить) способ репликации функциональности, доступной в pre-Grails 2.0.0, для создания метода в контроллере, который не будет отображаться конечному пользователю.

Я подумал о двух возможных подходах и задавался вопросом, что будет лучше стиль/практика и почему?

  • Установка доступа как частного, т.е. private def auth()
  • Настройка allowMethods для пустого метода:

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

оба подхода, казалось, достигли желаемого эффекта. Однако первый подход дает код ошибки 404 HTTP, а второй подход дает код ошибки HTTP 405.

Кто-нибудь знает, какой подход предпочтительнее? Кроме того, существуют ли какие-либо другие подходы или "техника наилучшей практики" для этого?

Ответ 1

В Grails 2.0 любые методы, помеченные как частные или защищенные, не считаются действиями.

Маркировка метода таким образом была бы более информативной по причинам обслуживания, потому что она видна прямо в объявлении метода, является ли метод действительным, вместо того, чтобы оглядываться на переменную allowedMethods. Кроме того, недоступный метод не будет случайно доступен, если его объявление будет удалено или не добавлено в allowedMethods.

Ответ 2

Лучше всего отметить его как private, потому что 404 скрывает, что там есть что-то там, где 405 можно было бы использовать, чтобы знать, что есть функция, называемая так. (Не то, чтобы это было бы очень полезно.)

Также важно отметить, что метод private является хорошим, поскольку он показывает, что метод не является действием.