2012-11-23 97 views
5

मैं मैंगोड प्लगइन के साथ Grails 2.1.1 का उपयोग कर रहा हूं। मुझे जेनरेट की गई सूची में कॉलम के क्रम बदलने के साथ समस्या है। grails scaffolding guide कहता है कि आपको बाधाओं में केवल सही ढंग से ऑर्डर गुणों की आवश्यकता है।जेनरेट टेबल में कॉलम ऑर्डर कैसे बदलें (मिंगोडब प्लगइन के साथ काम नहीं कर रहे ग्रिल बाधाएं)

मेरे डोमेन:

class Section { 

String idName 
String visible 
String required 
String name 
String bold 

static embedded = ['question'] 

List<Question> questions 
static hasMany = [questions : Question] 

static constraints = { 
    idName (blank: false) 
    name (blank: false) 
    visible (blank: false) 
    required (blank: false) 
    bold (blank: false) 
} 

@Override 
public String toString() { 
    name 
} 
} 

लेकिन कॉलम अभी भी वर्णानुक्रम कर रहे हैं। मैं स्थिर मचान का उपयोग कर रहा हूं, इसलिए बाधाओं में बदलाव के बाद मैं grails generate-all * कमांड का उपयोग करता हूं और सभी फ़ाइलों को ओवरराइड करता हूं।

और हाँ, मैंने कोड की सफाई और संकलन करने की कोशिश की, सर्वर की सफाई और पुनरारंभ करना (यह एसटीएस के साथ एकीकृत) और ब्राउज़र कैश की सफाई करना। क्या मोंगो डेटाबेस में समस्या है (हाइबरनेट प्लगइन अनइंस्टॉल किया गया है)?

इसके बाद मैंने भी grails टेम्पलेट्स स्थापित किए।

Collections.sort(props, comparator.constructors[0].newInstance([domainClass] as Object[])) 

किसी भी विचार मैं इस काम कर प्राप्त करने के लिए है कि मैं बाधाओं में सेट कैसे बदल सकते हैं: list.gsp में छँटाई विशेषताओं के साथ लाइन है?

+0

मैं एक ही पर्यावरण के साथ नई grails परियोजना शुरू हो जाएगी (लेकिन mongodb में बदलने के बिना) और बाधाओं द्वारा आदेश काम किया। तो मुझे यकीन है कि यह हाइबरनेट प्लगइन अनइंस्टॉल करने और/या mongodb प्लगइन स्थापित करने में समस्या है। मैं इसे देखूंगा और यहां जवाब दूंगा। – Gorky

उत्तर

2

एक जिरा मुद्दा भरा जाना चाहिए। एक पर https://github.com/grails/grails-core/blob/master/grails-crud/src/main/groovy/org/codehaus/groovy/grails/scaffolding/DefaultGrailsTemplateGenerator.groovy

void generateView(GrailsDomainClass domainClass, String viewName, Writer out) { 
    def templateText = getTemplateText("${viewName}.gsp") 

    if (templateText) { 
     def t = engine.createTemplate(templateText) 
     def multiPart = domainClass.properties.find {it.type == ([] as Byte[]).class || it.type == ([] as byte[]).class} 

     boolean hasHibernate = pluginManager?.hasGrailsPlugin('hibernate') 
     def packageName = domainClass.packageName ? "<%@ page import=\"${domainClass.fullName}\" %>" : "" 
     def binding = [pluginManager: pluginManager, 
       packageName: packageName, 
       domainClass: domainClass, 
       multiPart: multiPart, 
       className: domainClass.shortName, 
       propertyName: getPropertyName(domainClass), 
       renderEditor: renderEditor, 
       comparator: hasHibernate ? DomainClassPropertyComparator : SimpleDomainClassPropertyComparator] 

     t.make(binding).writeTo(out) 
    } 

} 

यह स्पष्ट है कि कॉल दृश्य जेनरेट है लग रहा है SimpleDomainClassPropertyComparator उपयोग करने का फैसला। Grails मूल रूप से हाइबरनेट पर निर्भर करने के लिए बनाया गया था। पिछले कुछ वर्षों में, दुनिया अतिरिक्त दृढ़ तंत्र का उपयोग कर रही है। यदि कोई DomainClassPropertyComparator को देखता है, तो हाइबरनेट पर कोई निर्भरता नहीं है। मुझे लगता है कि कोड का परीक्षण करना चाहिए यदि डोमेन ऑब्जेक्ट "कॉन्स्ट्रेनेंट्स" तय करता है कि डिफ़ॉल्ट रूप से DomainClassPropertyComparator का उपयोग करने के लिए कौन सा तुलनित्र उपयोग या सरल उपयोग करता है। यदि कोई बाधा नहीं मिलती है तो इसका व्यवहार वही होता है। DefaultGrailsTemplateGenerator द्वारा "hasHibernate" को कॉल की आवश्यकता नहीं है।

आसपास के काम के रूप में, आप मचान टेम्पलेट्स को स्थापित कर सकते हैं, _form.gsp संपादित कर सकते हैं और तुलनाकर्ता को बदल सकते हैं जो इसे DomainClassPropertyComparator उदा। मेरा _form।जीएसपी

<%=packageName%> 
<% import grails.persistence.Event %> 
<% import org.codehaus.groovy.grails.scaffolding.DomainClassPropertyComparator %> 


<% excludedProps = Event.allEvents.toList() << 'version' << 'dateCreated' << 'lastUpdated' 
    persistentPropNames = domainClass.persistentProperties*.name 
    boolean hasHibernate = pluginManager?.hasGrailsPlugin('hibernate') 
    if (hasHibernate && org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsDomainBinder.getMapping(domainClass)?.identity?.generator == 'assigned') { 
     persistentPropNames << domainClass.identifier.name 
    } 

DomainClassPropertyComparator mattsComparator = new DomainClassPropertyComparator(domainClass) 
comparator = mattsComparator 

props = domainClass.properties.findAll { persistentPropNames.contains(it.name) && !excludedProps.contains(it.name) } 
    Collections.sort(props, comparator) 
    for (p in props) { 
     if (p.embedded) { 
      def embeddedPropNames = p.component.persistentProperties*.name 
      def embeddedProps = p.component.properties.findAll { embeddedPropNames.contains(it.name) && !excludedProps.contains(it.name) } 
      Collections.sort(embeddedProps, comparator) 
      %><fieldset class="embedded"><legend><g:message code="${domainClass.propertyName}.${p.name}.label" default="${p.naturalName}" /></legend><% 
       for (ep in p.component.properties) { 
        renderFieldForProperty(ep, p.component, "${p.name}.") 
       } 
      %></fieldset><% 
     } else { 
      renderFieldForProperty(p, domainClass) 
     } 
    } 

private renderFieldForProperty(p, owningClass, prefix = "") { 
    boolean hasHibernate = pluginManager?.hasGrailsPlugin('hibernate') 
    boolean display = true 
    boolean required = false 
    if (hasHibernate) { 
     cp = owningClass.constrainedProperties[p.name] 
     display = (cp ? cp.display : true) 
     required = (cp ? !(cp.propertyType in [boolean, Boolean]) && !cp.nullable && (cp.propertyType != String || !cp.blank) : false) 
    } 
    if (display) { %> 
<div class="fieldcontain \${hasErrors(bean: ${propertyName}, field: '${prefix}${p.name}', 'error')} ${required ? 'required' : ''}"> 
    <label for="${prefix}${p.name}"> 
     <g:message code="${domainClass.propertyName}.${prefix}${p.name}.label" default="${p.naturalName}" /> 
     <% if (required) { %><span class="required-indicator">*</span><% } %> 
    </label> 
    ${renderEditor(p)} 
</div> 
<% } } %> 
+0

जोड़ा गया [जिरा मुद्दा] (http://jira.grails.org/browse/GRAILS-9717) –

0

बाधाओं को आपके द्वारा वर्णित दृश्य को अपडेट करना चाहिए। grails generate-all --stacktrace चलाने का प्रयास करें यह संभव है कि स्क्रिप्ट तदनुसार दृश्य अपडेट करने से पहले समाप्त हो जाए। एक और रणनीति यह जांचना होगा कि समस्या नीचे दिए गए बयानों में है या नहीं, इसलिए उनसे छुटकारा पाएं और जांच करें कि तदनुसार विचारों को अपडेट करने से आप अपनी समस्या को हल करने के करीब आ जाएंगे।

static embedded = ['question'] 

List<Question> questions 
static hasMany = [questions : Question] 

आशा है कि इससे मदद मिलती है!

+0

विकल्प '--stacktrace' कोई और जानकारी नहीं देता है, लेकिन मुझे यकीन है कि स्क्रिप्ट सही ढंग से समाप्त होती है क्योंकि डोमेन दृश्यों में फ़ील्ड बदलने के बाद gsp फ़ाइलों में अपडेट किया जाता है। मेरे डोमेन के इन "अन्य बयान" के लिए, मैं परीक्षण मचान के लिए अपने प्रोजेक्ट में नए सरल डोमेन बनाया: 'वर्ग सरल { \t स्ट्रिंग zzz \t स्ट्रिंग केकेके \t स्ट्रिंग aaa \t स्थिर बाधाओं = { \t \t KKK() \t \t zzz() \t \t aaa() } } ' लेकिन कॉलम और जी में क्षेत्रों के नए विचारों के क्रम पैदा करने के बाद एसपी पेज अभी भी वर्णानुक्रमिक हैं। मुझे लगता है कि यह सिर्फ मेरी डोमेन परिभाषा की तुलना में कॉन्फ़िगरेशन या इस mongodb प्लगइन के बारे में अधिक है। – Gorky

0

कुछ परीक्षणों के बाद मुझे यकीन है कि हाइबरनेट प्लगइन के बिना केवल mongodb प्लगइन का उपयोग कुछ मचान सुविधाओं को अक्षम करने का कारण बनता है। उदाहरण के लिए विचार उत्पन्न करने के दौरान बाधाओं को खंडित किया जाता है। इस काम को करने के लिए आपको हाइबरनेट का उपयोग करने की आवश्यकता है। तो यदि आप स्वत: जेनरेट कोड चाहते हैं और अभी भी मोंगोडब का उपयोग करना चाहते हैं तो एक चाल है: हाइबरनेट के साथ प्रोजेक्ट बनाएं, उत्पन्न करें और समाप्त करें, फिर उत्पादन के लिए हाइबरनेट को अनइंस्टॉल करें और mongodb इंस्टॉल करें।

+0

अपडेट: मैथ्यू पायने ने बेहतर कामकाज का प्रस्ताव दिया। – Gorky

2

आप टेम्पलेट में नीचे लाइन टिप्पणी और देखने को पुनर्जीवित हैं, बाधाओं में आदेश मचान में आदेश

//Collections.sort(props, comparator.constructors[0].newInstance([domainClass] as Object[]))