Grails: Как сделать кнопку SAVE внутри одной таблицы и заставить ее работать? - PullRequest
0 голосов
/ 11 октября 2010

У меня есть создание внутри таблицы / списка, которое предоставляет Grails.

Вот фотки того, что у меня

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

Как видите, я создаю все в первой строке таблицы, а затем во 2-й строке и далее - фактический список.

В последнем столбце 2-й строки видно, что у меня есть кнопка ОБНОВЛЕНИЕ и кнопка удаления.

Кнопка удаления работает нормально, но у меня проблемы с кнопкой UPDATE.

Вот код этого последнего столбца

<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: 'Are you sure you want to delete?')}');" />
</g:form>

А вот что у меня есть для удаления и обновления в контроллере

def delete = {
    def densityInstance = Density.get(params.id)
    if (densityInstance) {
        try {
            densityInstance.delete(flush: true)
            flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'density.label', default: 'Density'), params.id])}"
            redirect(action: "list")
        }
        catch (org.springframework.dao.DataIntegrityViolationException e) {
            flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'density.label', default: 'Density'), params.id])}"
            redirect(action: "show", id: params.id)
        }
    }
    else {
        flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'density.label', default: 'Density'), params.id])}"
        redirect(action: "list")
    }
}

Кажется, что DELETE работает нормально, и вот ОБНОВЛЕНИЕ (может быть, это SAVEF def, который мне нужно отредактировать, я не уверен, и поэтому я спрашиваю.

Вот ОБНОВЛЕНИЕ:

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])
                return
            }
        }
        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 {
            render(view: "list", model: [densityInstance: densityInstance])
        }
    }
    else {
        flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'density.label', default: 'Density'), params.id])}"
        redirect(action: "list")
    }
}

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

1 Ответ

2 голосов
/ 11 октября 2010

g:form у вас есть только в последнем столбце таблицы, с одним скрытым параметром формы, идентификатором.Удаление работает, так как все, что ему нужно, это идентификатор.Для обновления требуются остальные записи формы.Каждое редактируемое поле имеет запись формы, но они не заключены в g:form, поэтому их данные не отправляются вместе с формой.

Вам нужно сделать так, чтобы g:form заключил все столбцы строки таблицы.Например:

<g:form>
  <tr>
    <td>${densityInstance?.id}<g:hiddenField name="id" value="${densityInstance?.id}" /></td>
    <td><g:textField name="commodity" value="${...}"/></td>
    ...
    <td>
      <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: 'Are you sure you want to delete?')}');" />
    </td>
  </tr>
</g:form>
...