2011-01-21 7 views

cevap

4

DÜZENLEME - Sorunuzu yanlış yorumlamaktan dolayı özür dileriz. render yöntemi bir durum kodu alır. hiçbir şey bulunursa denetleyicisi Yani,

render status: 404 

veya

render view: you_not_found_view 

veya her ikisi (biri işlemek çağrıyı) deneyin.

+1

Bunu zaten yaptım, ancak etki alanı nesnesini bulamadığım halde nasıl render edeceğimi anlamadım: if if! (MyDomainClass.get (params ['i'])) {/ * Sonra ne...? * /} '. Response.sendError (404) işlevi "404" değerini döndürür, ancak bu hata sayfasını oluşturmaz - kullanıcı sadece boş bir sayfa görür. –

+0

Sadece Grails in Action p.331 ve geri dönen hata kodları için sınırlamalar olduğunu söylüyor - yanıt için içerik sağlayamıyorsunuz ve içerik türü "text/html" olacaktır. Bilmiyordum ve beni daha fazla karıştırıyor ... –

+0

@martin benim cevabını güncelledi – hvgotcodes

7

Ben 'NOTFOUND' özel bir 404 sayfası benim kontrolörleri, aşağıdaki kullandım:

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

Ben de UrlMapping.groovy özel hata sayfaları eşlenen şey

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

veya

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

Grails Docs - mapping to response codes

+1

En azından RESTful mimarileri için, bulunamadı kaynak için yeniden yönlendirme kötü bir uygulama olduğuna inanıyorum. –

+2

@JoshDiehl haklı. Bu uygulama önce bir 302, sonra bir 404 gönderir, hemen 404 dönmelisiniz. – peterp

0

İşte bunu yapmak için benim sihirli formülü. Belki de daha iyi bir yol var, ama bu da çalışıyor ve aynı 404 görünümü, dahili olarak 404 ya da grails üretip üretmediğinizi sağlıyor (örneğin, kontrolör bulunamadı).

Birincisi, AbstractView uzanan Görünüm sınıf oluşturmak:

class ErrorController { 

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

Şimdi görünümler altında hata görünüm oluşturmak/hata/notFound.gsp:

class NotFoundView extends AbstractView { 

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

Sonraki bir hata denetleyicisi oluşturmak

<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> 

çok önemlidir 01 kullanıyorsunuzg: applyLayout> etiketi. Düzeninizi kullanırsanız, düzeninizi iki kez oluşturur ve yuvaya yerleştirir.

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

Hepiniz denetleyicinizdeki gelen 404 olduğunu göndermek için şimdi hazırsınız: URL eşlemesi için Şimdi

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

Bu yaklaşım aynı zamanda kolayca 404 log sağlar, deneyin Çöz ve 301 ya da ne yapmak istersen yolla.