Grails: верните 404 и покажите мою страницу 'Not Found' для неверного идентификатора - PullRequest
7 голосов
/ 21 января 2011

Каков наилучший способ обработки недействительных идентификаторов в действии контроллера Grails?

Когда MyDomainClass.get(params['i']) возвращает нулевое значение в моем действии контроллера, я хочу, чтобы пользователь увидел мою пользовательскую страницу «Не найдено», и для возврата кода ответа HTTP 404 - я не могу найти самый чистый способ сделать это.

Спасибо.

Ответы [ 3 ]

8 голосов
/ 25 января 2011

Я использовал следующее в своих контроллерах, где notFound - это пользовательская страница 404:

def show = {
        def referenceData = ReferenceData.get( params.id )    
        if (referenceData)
        { return [ referenceData : referenceData ] }
        else 
        { redirect(uri:'/notFound') }
    }

Я также отобразил пользовательские страницы ошибок в UrlMapping.groovy, что-то вроде

static mappings = {
   "403"(controller: "errors", action: "forbidden")
   "404"(controller: "errors", action: "notFound")
   "500"(controller: "errors", action: "serverError")
}

или

static mappings = {
   "403"(view: "/errors/forbidden")
   "404"(view: "/errors/notFound")
   "500"(view: "/errors/serverError")
}

Grails Docs - сопоставление с кодами ответов

4 голосов
/ 21 января 2011

РЕДАКТИРОВАТЬ - Я прошу прощения за неправильное прочтение вашего вопроса.метод рендеринга принимает код состояния.Поэтому в контроллере, если ничего не найдено, попробуйте

render status: 404

или

render view: you_not_found_view

или оба (в одном вызове рендеринга).

0 голосов
/ 30 апреля 2012

Вот моя волшебная формула для этого. Может быть, есть лучший способ, но этот работает и гарантирует, что один и тот же вид 404 будет отображаться независимо от того, генерируете ли вы 404, или Grails делает это внутренне (например, не найден контроллер).

Сначала создайте класс View, расширяющий AbstractView:

class NotFoundView extends AbstractView {

@Override
    protected void renderMergedOutputModel(Map<String, Object> model,
      HttpServletRequest request, HttpServletResponse response) {
        response.sendError(HttpServletResponse.SC_NOT_FOUND)
    }
}

Далее создайте контроллер ошибок:

class ErrorController {

    def notFound = {
        return render(view: '/error/notFound')
    }
}

Теперь создайте свое представление об ошибках в views / error / notFound.gsp:

<g:applyLayout name="main">
<!doctype html>
<html>
<head>
    <title>Oops! Not found!</title>
</head>

<body>
    <h1>Not Found</h1>

    <section id="page-body">
        <p>Nothing was found at your URI!</p>
    </section>

</body>
</html>
</g:applyLayout>

крайне важно , чтобы вы использовали тег . Если вы используете макет, он будет рендериться дважды и вкладывать себя.

Теперь для сопоставления URL:

"404"(controller: 'error', action: 'notFound')

Теперь все готово для отправки этого 404 с вашего контроллера:

def myAction = {
    Thing thing = Thing.get(params.id)
    if (!thing) {
         return new ModelAndView(new NotFoundView())
    }
}

Этот подход также позволяет вам легко регистрировать 404, пытаться разрешить его и отправлять 301, или все, что вы хотите сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...