2011-01-21 14 views
7

के लिए मेरा 'नहीं मिला' पृष्ठ दिखाएं Grails नियंत्रक कार्रवाई में अमान्य आईडी को संभालने का सबसे अच्छा तरीका क्या है?Grails: 404 लौटें और अमान्य आईडी

जब MyDomainClass.get(params['i']) मेरे नियंत्रक कार्रवाई में शून्य लौटाता है, तो मैं चाहता हूं कि उपयोगकर्ता मेरा कस्टम 'नहीं मिला' पृष्ठ और 404 HTTP प्रतिक्रिया कोड वापस लौटाए - मैं इसे करने का सबसे साफ तरीका नहीं समझ सकता।

धन्यवाद।

उत्तर

4

संपादित करें - मैं आपके प्रश्न को गलत तरीके से पढ़ने के लिए क्षमा चाहता हूं। रेंडर विधि एक स्टेटस कोड लेता है। नियंत्रक में तो, अगर कुछ भी नहीं पाया जाता है,

render status: 404 

या

render view: you_not_found_view 

या दोनों (कॉल एक में प्रस्तुत करना) का प्रयास करें।

+1

मेरे पास पहले से ही है, लेकिन यह समझ में नहीं आता कि मुझे यह कब प्रस्तुत करना है जब मुझे अपना डोमेन ऑब्जेक्ट नहीं मिल रहा है: 'if (! MyDomainClass.get (पैराम्स [' i ']) {/ * फिर क्या...? * /} '। 'Response.sendError (404) 'करने से ठीक है' 404'', लेकिन उस त्रुटि पृष्ठ को प्रस्तुत नहीं करता है - उपयोगकर्ता बस एक खाली पृष्ठ देखता है। –

+0

मैंने अभी एक्शन पी में Grails को पढ़ा है।331 और यह कहता है कि त्रुटि कोड लौटने की सीमाएं हैं - आप प्रतिक्रिया के लिए सामग्री प्रदान नहीं कर सकते हैं और सामग्री का प्रकार 'टेक्स्ट/html' होगा। जो मुझे नहीं पता था और मुझे आगे भ्रमित करता है ... –

+0

@ मार्टिन ने मेरा जवाब – hvgotcodes

7

मैं अपने नियंत्रकों, जहां '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 - mapping to response codes

+1

अपडेट किया है, मुझे विश्वास है कि कम से कम विश्वसनीय संसाधनों के लिए, संसाधन नहीं मिला संसाधन के लिए रीडायरेक्ट करना बुरा व्यवहार है। –

+2

@ जोशडिएल सही है। यह कार्यान्वयन पहले 302 भेजता है, फिर 404, आपको तुरंत 404 वापस लौटना चाहिए। – peterp

0

यह करने के लिए मेरा जादू सूत्र यहां है। शायद एक बेहतर तरीका है, लेकिन यह एक काम करता है और सुनिश्चित करता है कि वही 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 भेजें, या जो भी आप करना चाहते हैं।

संबंधित मुद्दे