2011-06-14 25 views
18

मैं उपयोगकर्ताओं को डोमेन कक्षाओं को पार करने और सामानों के डंप प्रिंट करने की अनुमति देना चाहता हूं। मेरे frist समस्या: निम्न काम करता है यह सोचते हैं ठीक:Grails: नाम से डोमेन क्लास

//this works 
class EasyStuffController{ 
    def quickStuff = { 
    def findAThing = MyDomainClass.findByStuff(params.stuff) 
    [foundThing:findAThing] 
    } 
} 

क्या उचित तरीके से मैं क्या नीचे कहने के लिए कोशिश कर रहा हूँ लिखने के लिए:

//this doesn't 
class EasyStuffController{ servletContext -> 
    def quickStuff = { 
    def classNameString = "MyDomainClass" //or params.whichOne something like that 
    def domainHandle = grailsApplication.domainClasses.findByFullName(classNameString) 
    //no such property findByFullName 
    def findAThing = domainHandle.findByStuff(params.stuff) 
    [foundThing:findAThing] 
    } 
} 



//this also doesn't 
class EasyStuffController{ servletContext -> 
    def quickStuff = { 
    def classNameString = "MyDomainClass" //or params.whichOne something like that 
    def domainHandle 
    grailsApplication.domainClasses.each{ 
     if(it.fullName==classNameString)domainHandle=it 
    } 
    def findAThing = domainHandle.findByStuff(params.stuff) 
    //No signature of method: org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass.list() is applicable 
    [foundThing:findAThing] 
    } 
} 

उन लाइनों के ऊपर बिल्कुल काम नहीं है। मैं उपयोगकर्ताओं को किसी भी डोमेन क्लास को चुनने और "सामान" के साथ चीज़ वापस लेने की क्षमता देने की कोशिश कर रहा हूं। धारणा: सभी डोमेन वर्गों में एक ही प्रकार का एक स्टफ फ़ील्ड होता है।

उत्तर

43

आप पूर्ण पैकेज जानते हैं, तो आप इस का उपयोग कर सकते हैं:

String className = "com.foo.bar.MyDomainClass" 
Class clazz = grailsApplication.getDomainClass(className).clazz 
def findAThing = clazz.findByStuff(params.stuff) 

कि भी अगर आप संकुल का उपयोग नहीं करते काम करेंगे।

आप संकुल का उपयोग लेकिन उपयोगकर्ताओं को केवल पैकेज के बिना वर्ग के नाम उपलब्ध कराने की जाएगी, और नाम सभी संकुल में अद्वितीय होते हैं, तो आप इस का उपयोग कर सकते हैं:

String className = "MyDomainClass" 
Class clazz = grailsApplication.domainClasses.find { it.clazz.simpleName == className }.clazz 
def findAThing = clazz.findByStuff(params.stuff) 
+0

मैं त्रुटि (दूसरी पद्धति का उपयोग करके प्राप्त और className = "खाता"): ऑब्जेक्ट 'Artefact> खाता' क्लास 'org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass' कक्षा 'java.lang.Class' के कारण ऑब्जेक्ट नहीं डाला जा सकता है: java.lang.ClassNotFoundException: Artefact > खाता – Mikey

+0

इसके बारे में क्षमा करें, मैंने जावा क्लास को डोमेन क्लास से प्राप्त करने के लिए उत्तर संपादित किया। –

+0

@ बर्ट: मेरा मानना ​​है कि, आपने अपने पहले उदाहरण की दूसरी पंक्ति में एक .clazz को याद किया (जैसा कि आपने दूसरे ब्लॉक में जोड़ा था)। दुर्भाग्यवश [मजाकिया नामकरण] (http://grails.org/doc/latest/api/org/codehaus/groovy/grails/commons/AbstractGrailsClass.html#getClazz%28%29) ने मेरे संपादन को अनुमोदित करने से रोका :-) – martin

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