2009-11-28 9 views
8

मेरे पास Team ऑब्जेक्ट्स की एक सूची है जिसमें Integer seed संपत्ति है। मैं एक ही रूप में, सभी टीमों के बीज एक बार में संपादित करना चाहता हूं। मैं सुनिश्चित करता हूं कि Grails अनुक्रमित पैरामीटर का समर्थन करता है, लेकिन मैं इसे काम करने के लिए नहीं मिल सकता है।Grails अनुक्रमित पैरामीटर

यहां मेरे पास है, और यह काम करता है लेकिन मैं के माध्यम से बहुत सारे हुप्स के माध्यम से कूद रहा हूं और वहां एक बेहतर तरीका होना चाहिए।

जीएसपी:

<g:form action="setSeeds"> 
... 
    <g:each in="${teams}" status="i" var="team"> 
    <input type="hidden" name="teams[${i}].id" value="${team.id}"> 
    <input type="text" size="2" name="teams[${i}].seed" value="${team.seed}"> 
    </g:each> 
</g:form> 

नियंत्रक:

def setSeeds = { 
    (0..<30).each { i -> 
    def team = Team.get(Integer.parseInt(params["teams[${i}].id"])) 
    team.seed = Integer.parseInt(params["teams[${i}].seed"]) 
    } 
    redirect(action:list) 
} 

कि भयानक नहीं है? रास्ता बहुत ज्यादा शोर। मैं की तर्ज पर कुछ कैसे कर सकते हैं:

params.teams.each { t -> 
    def team = Team.get(t.id) 
    team.seed = t.seed 
} 

यही है, मैं कैसे team[0].seed, team[0].id, team[1].seed, एक सूची के लिए नामित किया गया team[1].id पैरामीटर मैप करते हैं?

Stripes में आपके पास List<Team> संपत्ति हो सकती है और यह केवल काम करेगी। मुझे Grails से कम उम्मीद है! ;-)

आपकी सहायता के लिए अग्रिम धन्यवाद।

उत्तर

6

मुझे अंत में पता चला कि बिना किसी शेंगेन के इसे कैसे किया जाए।

छिपे पैरामीटर के बारे में भूल जाओ और बीज पैरामीटर में टीम आईडी का उपयोग करें। जीएसपी में:

<g:form action="setSeeds"> 
... 
    <g:each in="${teams}" var="team"> 
    <input type="text" size="2" name="teams.seeds.${team.id}" 
     value="${team.seed}"> 
    </g:each> 
</g:form> 

फिर, नियंत्रक में:

params.teams.seeds.each { teamId, seed -> 
    def team = Team.get(teamId.toInteger()) 
    team.seed = seed.toInteger() 
    team.save() 
} 
redirect(action:list) 

वर्क्स एक आकर्षण की तरह।

-1

सुनिश्चित नहीं हैं कि अगर यह मदद करता है, लेकिन आप की तरह इसके साथ एक बंद इस्तेमाल कर सकते हैं:

<g:each in="${teams}"> 
    <p>id: ${it.id}</p> 
    <p>seed: ${it.seed}</p> 
</g:each> 

इस एचटीएमएल outputting के instaed से आप शायद एक सूची का निर्माण कर सकता है। या इसके साथ अपना फॉर्म बनाएं।

+0

मैं पहले से ही एक फॉर्म बनाने के लिए बंद करने का उपयोग कर रहा हूं। सवाल यह है कि, मैं सूची बनाने के लिए नियंत्रक में अनुक्रमित पैरामीटर कैसे प्राप्त करूं? – foxdonut

11

params नियमित मानचित्र से अधिक है, यह GrailsParameterMap है जो स्वचालित रूप से '।' द्वारा पैरामीटर नामों को विभाजित करने के आधार पर उप-मानचित्र संरचनाएं बनाता है। आप नीचे दिए गए जीएसपी का उपयोग करके इस का लाभ ले सकता है:

<g:form action="seed"> 
<g:each in="${teams}" status="i" var="team"> 
    <input type="hidden" name="teams.${i}.id" value="${team.id}"> 
    <input type="text" size="2" name="teams.${i}.seed" value="${team.seed}"> 
    </g:each> 
<g:submitButton name="update" value="Update" /> 
</g:form> 

एनबी: कोई [] में नाम का श्रेय नहीं है। नियंत्रक अब कुछ काला Grails जादू का उपयोग कर बहुत सरल है:

log.error "params = ${params}" 
params.teams.findAll {k,v -> !k.contains(".")}.each { k,v -> 
     bindData(Team.get(v.id), v) 
} 

पहला ऑपरेशन findAll डॉट के अंदर के साथ सभी मापदंडों को फ़िल्टर कर देता। शेष k और id और seed में v में पंक्ति आईडी रखने वाले मानचित्रों का नक्शा है।

मुझे आशा है कि यह आपके प्रश्न का उत्तर देगा।

+2

मुझे आश्चर्य है कि किसी और को काम करने में परेशानी हो रही है। अपेक्षित उप-मानचित्र प्राप्त करने के बजाय, grails 1.3.4 का उपयोग करके मुझे उप-मानचित्र की स्ट्रिंग प्रस्तुति की तरह दिखता है। उदाहरण के लिए, params.toString() "[फ़िल्टर .1 .value: 123, फ़िल्टर: [" 1 ": [" मूल्य ":" 123 "]," 1.value ":" 123 "], क्रिया: सूची, नियंत्रक : उपयोगकर्ता] " – bcowdery

+0

यह थोड़े बदसूरत लगता है, लेकिन यह काम करता है। धन्यवाद! –

+0

हाँ, मुझे 2015 में इस तरह के सभी प्रकार की परेशानी हो रही है। लगता है कि अब grails सभी पैरामीटर मान स्ट्रिंग्स के रूप में लौटाता है, जो 'मैपलिस्ट' स्ट्रिंग को व्यावहारिक रूप से बेकार बनाता है क्योंकि साल पहले बीकॉडीरी मिलती थी। – user2782001

1

2015 में .... Grails अलग तरह से अब एक छोटे से काम करता है और आप अपने आप को के बजाय तार में चल उम्मीद उप maps.I
कुछ की तरह करने से काम करने के लिए कुछ मिल गया .. मिल सकता है

params.nested.each{ 
       if(!it.getKey().contains('.')){ 
       //to get a map rather than a string...  
        params.nested[it.getKey()]; 
       } 
      }; 

संपादित करें:

रास्ता तक ...

आदानों एक ही नाम है कि, की तरह

<input name="item.choice" type="checkbox" value="3" /> 
    < input name="item.choice" type="checkbox" value="4"/> 

एक सूची में डाल दिया गया है और फिर एक सबमिट किया गया है। तो यदि उपरोक्त दोनों को

<input name="item.choice" type="checkbox" value="3" checked /> 
    < input name="item.choice" type="checkbox" value="4" checked/> 

आपको एक सूची प्राप्त होगी।

लेकिन अगर केवल एक चेक किया गया है तो आपको एक सूची नहीं मिलती है (कम से कम grails verison में मैं उपयोग करता हूं), आपको एक ही मूल्य मिलता है।

 <input name="item.choice" type="checkbox" value="3" checked /> 
    < input name="item.choice" type="checkbox" value="4" /> 

एक नियंत्रक में इसका मतलब है कि, अगर मैं यह एक त्रुटि फेंक होगा यदि केवल एक आइटम प्रस्तुत की गई थी की तरह

params['item.choice'].each{ 
      def item=Item.get(it) 
    } 

कुछ करने के लिए थे। इस के आसपास पाने के लिए एक तरह से ग्रूवी

([]+(params['item.choice']?:[])).each{ 
     def item=Item.get(it) 
} 

पैरामीटर सेट कर दिया जाता है और एक सूची, यह खाली सूची में मूल्य डालता है है; यदि पैरामीटर सेट और एक सूची है, तो प्लस ऑपरेटर खाली व्यक्तिगत सूची में सभी व्यक्तिगत मान जोड़ देगा; यदि पैरामीटर सेट नहीं है, तो यह एक साथ दो खाली सूचियां जोड़ देगा, जो एक खाली सूची बनाता है।

+0

कोई विचार क्यों यह मामला है? नेस्टेड उप-मानचित्र क्यों टूटे हैं? – U47

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