2009-11-28 23 views
8

Tôi có một danh sách các đối tượng Team có thuộc tính Integer seed. Tôi muốn chỉnh sửa tất cả hạt giống của đội cùng một lúc, trong một hình thức duy nhất. Tôi là chắc chắn rằng Grails hỗ trợ các tham số được lập chỉ mục, nhưng tôi không thể làm cho nó hoạt động.Tham số được lập chỉ mục của Grails

Đây là những gì tôi có, và nó hoạt động nhưng tôi nhảy qua cách quá nhiều vòng và phải có cách tốt hơn.

GSP:

<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> 

điều khiển:

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) 
} 

Mà không phải là khủng khiếp? Cách quá nhiều tiếng ồn. Làm thế nào tôi có thể làm một cái gì đó dọc theo dòng:

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

Đó là, làm thế nào để lập bản đồ params tên team[0].seed, team[0].id, team[1].seed, team[1].id vào một danh sách?

Trong Stripes bạn chỉ có thể có tài sản List<Team> và nó sẽ chỉ hoạt động. Tôi mong đợi không ít từ Grails! ;-)

Cảm ơn trước sự giúp đỡ của bạn.

Trả lời

6

Cuối cùng tôi đã tìm ra cách để làm điều này mà không có bất kỳ shenanigans nào.

Quên thông số ẩn và chỉ sử dụng ID nhóm trong thông số hạt giống. Trong GSP:

<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> 

Sau đó, trong bộ điều khiển:

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

trình như một say mê.

-1

Không chắc chắn nếu điều này giúp nhưng bạn có thể sử dụng một kết thúc với nó như:

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

Bạn có thể xây dựng một danh sách từ này instaed xuất ra html. hoặc xây dựng biểu mẫu của bạn với nó.

+0

Tôi đã sử dụng đóng để tạo biểu mẫu. Câu hỏi đặt ra là, làm thế nào để lấy các tham số được lập chỉ mục trong bộ điều khiển để xây dựng một danh sách? – foxdonut

11

params không chỉ là Bản đồ thông thường, là GrailsParameterMap tự động xây dựng các cấu trúc phụ Bản đồ dựa trên việc tách tên thông số bằng '.'. Bạn có thể tận dụng điều này bằng cách sử dụng gsp sau:

<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> 

NB: không có [] trong thuộc tính tên. Bộ điều khiển giờ đây khá đơn giản bằng cách sử dụng một số ma thuật Grails đen:

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

Thao tác đầu tiên findAll lọc ra tất cả các thông số có dấu chấm bên trong. Phần còn lại là bản đồ bản đồ chứa id hàng trong số kidseed trong v.

Tôi hy vọng điều này sẽ trả lời câu hỏi của bạn.

+2

Tôi tự hỏi liệu có ai khác đang gặp khó khăn khi làm việc này không. Sử dụng grails 1.3.4, thay vì nhận được sơ đồ con dự kiến, tôi nhận được những gì trông giống như một chuỗi đại diện của các bản đồ phụ. Ví dụ: params.toString() "[filters.1.value: 123, filters: [" 1 ": [" value ":" 123 "]," 1.value ":" 123 "], action: list, controller : user] " – bcowdery

+0

Nó cảm thấy xấu xí, nhưng nó hoạt động. Cảm ơn! –

+0

Vâng, tôi đang gặp tất cả các loại rắc rối với điều này trong năm 2015. Dường như grails hiện trả về tất cả các giá trị tham số như chuỗi, làm cho chuỗi 'maplist' thực sự vô dụng như bcowdery được tìm thấy cách đây nhiều năm. – user2782001

1

Năm 2015 .... Grails làm việc một chút khác nhau bây giờ và bạn có thể thấy mình chạy vào chuỗi chứ không phải là dự kiến ​​phụ maps.I có vài việc phải làm việc bằng cách làm
cái gì đó như ..

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

EDIT: By The Way ...

đầu vào có cùng tên, như

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

Được đưa vào danh sách NẾU nhiều hơn thì một bản được gửi. Vì vậy, nếu cả hai bên trên đều được chọn

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

Bạn sẽ nhận được danh sách.

Nhưng nếu chỉ có một người được chọn, bạn KHÔNG nhận được một Danh sách (ít nhất là trong bản sao trang trại tôi sử dụng), bạn sẽ nhận được một giá trị duy nhất.

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

Điều đó có nghĩa trong một bộ điều khiển, nếu tôi được làm một cái gì đó giống như

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

Nó sẽ ném ra một lỗi nếu chỉ có một mục đã được gửi. Một cách hấp dẫn để giải quyết vấn đề này là

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

Nếu tham số được đặt và không phải danh sách, nó sẽ đặt giá trị vào danh sách trống; Nếu tham số được thiết lập và một danh sách, toán tử cộng sẽ thêm tất cả các giá trị riêng lẻ vào danh sách trống; nếu tham số không được thiết lập, nó sẽ thêm hai danh sách rỗng với nhau, tạo ra một danh sách trống duy nhất.

+0

Bất kỳ ý tưởng nào về lý do này? Tại sao các bản đồ con lồng nhau bị hỏng? – U47

Các vấn đề liên quan