यह करने के लिए मेरा जादू सूत्र यहां है। शायद एक बेहतर तरीका है, लेकिन यह एक काम करता है और सुनिश्चित करता है कि वही 404 दृश्य प्रस्तुत करता है कि आप 404 उत्पन्न करते हैं या grails आंतरिक रूप से करता है (उदाहरण के लिए कोई नियंत्रक नहीं मिला)।
सबसे पहले, एक दृश्य वर्ग कि AbstractView फैली बनाएँ:
class ErrorController {
def notFound = {
return render(view: '/error/notFound')
}
}
अब दृश्य में अपनी त्रुटि दृश्य बनाने/त्रुटि/notFound.gsp:
class NotFoundView extends AbstractView {
@Override
protected void renderMergedOutputModel(Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response) {
response.sendError(HttpServletResponse.SC_NOT_FOUND)
}
}
इसके बाद, एक त्रुटि नियंत्रक बनाने
<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>
यह महत्वपूर्ण है कि आप 01 का उपयोग करते हैंजी: लागू करेंआउट> टैग। यदि आप अपने लेआउट का उपयोग करते हैं तो दो बार और घोंसला खुद को प्रस्तुत करेंगे।
अब यूआरएल मानचित्रण के लिए:
"404"(controller: 'error', action: 'notFound')
आप सभी को भेजने के लिए है कि 404 अपने नियंत्रक से अब पूरी तरह तैयार हैं:
def myAction = {
Thing thing = Thing.get(params.id)
if (!thing) {
return new ModelAndView(new NotFoundView())
}
}
यह दृष्टिकोण भी आप आसानी से 404 लोग इन की सुविधा देता है, करने की कोशिश इसे हल करें और एक 301 भेजें, या जो भी आप करना चाहते हैं।
मेरे पास पहले से ही है, लेकिन यह समझ में नहीं आता कि मुझे यह कब प्रस्तुत करना है जब मुझे अपना डोमेन ऑब्जेक्ट नहीं मिल रहा है: 'if (! MyDomainClass.get (पैराम्स [' i ']) {/ * फिर क्या...? * /} '। 'Response.sendError (404) 'करने से ठीक है' 404'', लेकिन उस त्रुटि पृष्ठ को प्रस्तुत नहीं करता है - उपयोगकर्ता बस एक खाली पृष्ठ देखता है। –
मैंने अभी एक्शन पी में Grails को पढ़ा है।331 और यह कहता है कि त्रुटि कोड लौटने की सीमाएं हैं - आप प्रतिक्रिया के लिए सामग्री प्रदान नहीं कर सकते हैं और सामग्री का प्रकार 'टेक्स्ट/html' होगा। जो मुझे नहीं पता था और मुझे आगे भ्रमित करता है ... –
@ मार्टिन ने मेरा जवाब – hvgotcodes