Grails: Как мне исключить create.gsp и save.gsp и переместить его в первую строку списка в list.gsp? - PullRequest
1 голос
/ 22 октября 2010

Я хочу избавиться от create.gsp и save.gsp и разместить все на одной странице. Я переместил все эти поля в первую строку моего списка в list.gsp

.

Но теперь я не знаю, как связать его с остальными данными и заставить его работать.

Я должен заставить работать кнопку создания. Но тогда я не могу заставить работать кнопку обновления.

Вот изображение того, как выглядят первые строки

http://i56.tinypic.com/25jwmdf.jpg

Все создается в первой строке, затем вы нажимаете кнопку CREATE, и создается новая строка со всеми данными, помещенными в текстовые поля. Первая строка не имеет идентификатора, но все остальные имеют.

Я также получил кнопку стирания, чтобы работать. Таким образом, в основном, единственное, чего не хватает, это кнопки UPDATE.

Есть идеи ??

Заранее спасибо!

EDIT

Вот что у меня в контроллере:

    def update = {

            def densityInstance = Density.get(params.id)
            if (densityInstance) {
                if (params.version) {
                    def version = params.version.toLong()
                    if (densityInstance.version > version) {

                        densityInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'density.label', default: 'Density')] as Object[], "Another user has updated this Density while you were editing")
                        render(view: "list", model: [densityInstance: densityInstance,'Rcommodity':params?.Rcommodity])
                    }
                }
                densityInstance.properties = params
                if (!densityInstance.hasErrors() && densityInstance.save(flush: true)) {
                    flash.message = "${message(code: 'default.updated.message', args: [message(code: 'density.label', default: 'Density'), densityInstance.id])}"
                    redirect(action: "list", id: densityInstance.id)
                }
                else {
                    redirect(action: "list", id: densityInstance.id)
                }
            }
            else {
                flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'density.label', default: 'Density'), params.id])}"
                redirect(action: "list")
            }
        }

И так как grails делает это по столбцам, строка немного грязная, но вот она:

<g:each in="${densityInstanceList}" status="i" var="densityInstance">
                    <g:form action="update">
                        <tr class="${(i % 2) == 0 ? 'even' : 'odd'}">
                            <td>${fieldValue(bean: densityInstance, field: "id")}</td>
                            <td><g:textField name="Rcommodity" value="${densityInstance?.commodity}"  class="input" onKeyPress="return alpha(event)"/>&nbsp;<img src="${resource(dir:'images/skin',file:'information.png')}" ></td>
                            <td><g:textField name="Rorigin" value="${densityInstance?.origin}" maxlength="3" size="5" class="input" onKeyPress="return alpha(event)"/>&nbsp;<img src="${resource(dir:'images/skin',file:'information.png')}" ></td>
                            <td><g:textField name="Rshipper" value="${densityInstance?.shipper}" size="3" class="input" onkeypress="return IsNumeric(event)"/> <g:textField name="RshipperName" value="${densityInstance?.shipperName}" size="15" class="input-b" onfocus="this.blur()"/>&nbsp;<img src="${resource(dir:'images/skin',file:'information.png')}" ></td>
                            <td><g:textField name="Ragent" value="${densityInstance?.agent}" size="3" class="input" onkeypress="return IsNumeric(event)"/> <g:textField name="RagentName" value="${densityInstance?.agentName}" size="15" class="input-b" onfocus="this.blur()"/>&nbsp;<img src="${resource(dir:'images/skin',file:'information.png')}" ></td>
                            <td><g:textField name="Rdest" value="${densityInstance?.dest}" size="5" class="input" onKeyPress="return alpha(event)"/>&nbsp;<img src="${resource(dir:'images/skin',file:'information.png')}" ></td>
                            <td><g:textField name="Rdensity" value="${densityInstance?.density}" size="15" class="input" onkeypress="return IsNumeric(event)"/></td>
                            <td><g:textField name="RAM" value="${densityInstance?.AM}"  size="1" class="input"/></td>
                            <td width="100">
                            <g:form>
                                <g:hiddenField name="id" value="${densityInstance?.id}" />
                                <g:actionSubmit class="editar" action="update" value="${message(code: 'default.button.editar.label', default: '&nbsp;&nbsp;&nbsp;')}" />
                                <g:actionSubmit class="eliminar" action="delete" value="${message(code: 'default.button.eliminar.label', default: '&nbsp;&nbsp;&nbsp;')}" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Esta seguro que desea Eliminar?')}');" />
                            </g:form>
                            </td>
                        </tr>
                    </g:form></g:each>

Ответы [ 2 ]

0 голосов
/ 21 января 2011

Я считаю, что проблема заключается в том, что ваши actionSubmits отправляют форму, содержащую их, а ваши элементы данных находятся во внешней форме, поэтому ваш вызов действия обновления не получает никаких данных для обновления.Если вы поместите некоторую отладку в начало действия обновления, вы можете доказать или опровергнуть эту теорию.println "${params}"

0 голосов
/ 22 октября 2010

Для того, чтобы избавиться от create.gsp и edit.gsp, действия вашего контроллера должны работать точно так же, как в scaffolding, за исключением save {} и update {} должны заканчиваться

redirect(action: list)

.чтобы кнопки «Обновить» работали, каждое «Обновление» должно отправить свою форму (одна строка таблицы) для действия «обновить».Все остальное, что касается update {}, должно остаться таким, как было.

Эта строковая форма наверняка должна содержать все свойства объекта.

UPDATE после примера кода.

  1. (РЕДАКТИРОВАТЬ: ох, я постоянно читаю код) Зачем вам нужно 2 вложенных формы g:?Я бы попробовал пойти с одним.Просто отладьте то, что передается действию обновления - в params содержатся поля объекта.
  2. Я бы также исключил лишние вызовы для перенаправления (action: "list") в коде.
  3. Похоже, вы не используете $ {id} в списке действий?Если это так, вам не нужно передавать его в качестве параметра действия списка.
  4. Я полагаю, однажды вы захотите отправить строки таблицы через Ajax .Для этого заключите каждую строку в, извлеките строку в отдельный шаблон и отправьте другому действию, скажем, ajaxUpdate, которое выполнит то же самое, но завершится рендерингом (template: 'lineTemplate').Затем замените g: form на g: formRemote update = "[success: 'line $ {densityInstance.id}', сбой:" line $ {densityInstance.id} '] "и альт.Это также будет работать для действия «отменить».
...