Основной вопрос Grails: Как следующий код Grails определяет personInstance? - PullRequest
1 голос
/ 13 января 2010

Это код GSP, сгенерированный Grails для представления действия редактирования для объекта домена Person, который является частью моей модели, а также является основным классом для аутентификации подключаемым модулем безопасности ACEGI. Я вычеркнул кучу свойств, чтобы сделать его коротким. Файл находится в стандартном месте, grails-app/views/person/edit.gsp

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <meta name="layout" content="main" />
        <g:set var="entityName" value="${message(code: 'person.label', default: 'Person')}" />
        <title><g:message code="default.edit.label" args="[entityName]" /></title>
    </head>
    <body>
        <div class="nav">
            <span class="menuButton"><a class="home" href="${createLink(uri: '/')}">Home</a></span>
            <span class="menuButton"><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></span>
            <span class="menuButton"><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></span>
        </div>
        <div class="body">
            <h1><g:message code="default.edit.label" args="[entityName]" /></h1>
            <g:if test="${flash.message}">
            <div class="message">${flash.message}</div>
            </g:if>
            <g:hasErrors bean="${personInstance}">
            <div class="errors">
                <g:renderErrors bean="${personInstance}" as="list" />
            </div>
            </g:hasErrors>
            <g:form method="post" >
                <g:hiddenField name="id" value="${personInstance?.id}" />
                <g:hiddenField name="version" value="${personInstance?.version}" />
                <div class="dialog">
                    <table>
                        <tbody>

                            <tr class="prop">
                                <td valign="top" class="name">
                                  <label for="username"><g:message code="person.username.label" default="Username" /></label>
                                </td>
                                <td valign="top" class="value ${hasErrors(bean: personInstance, field: 'username', 'errors')}">
                                    <g:textField name="username" value="${personInstance?.username}" />
                                </td>
                            </tr>
...SNIP...
a bunch of props
                        </tbody>
                    </table>
                </div>
                <div class="buttons">
                    <span class="button"><g:actionSubmit class="save" action="update" value="${message(code: 'default.button.update.label', default: 'Update')}" /></span>
                    <span class="button"><g:actionSubmit class="delete" action="delete" value="${message(code: 'default.button.delete.label', default: 'Delete')}" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');" /></span>
                </div>
            </g:form>
        </div>
    </body>
</html>

У меня вопрос, как поле personInstance настраивается и заполняется?

Я подозреваю, что это основной вопрос, который противоречит основному недостатку понимания с моей стороны о том, как работает Граальс, но мне все же нужно знать.

Это связано с желанием создать мои собственные составные страницы, которые обращаются к объекту Person и связанным с ним данным, что является сердцем моего приложения. Я ожидал, что смогу создать новую страницу рядом с этой, давайте назовем ее map.gsp и каким-то волшебным образом получим personInstance. Я не могу понять, как это сделать, несмотря на попытку очевидного, и я думаю, что в центре моего понимания есть пробел.

1 Ответ

6 голосов
/ 13 января 2010

PersonInstance будет заполнен на контроллере. Когда вы отправляете форму, соответствующий контроллер получит карту, содержащую поля, присутствующие в вашей форме.

Итак, в вашем контроллере вы найдете команду типа

personInstance.properties = params

где params - карта, содержащая поля, отправленные для контроллера, а ключи - это имена элементов ввода, которые вы определили в своем файле gsp.

...