UrlMappings и Forms - как они работают? - PullRequest
0 голосов
/ 23 февраля 2012

UrlMappings - отличная функция для ссылок, но они также работают для форм?

Предположим, у нас есть такое отображение:

"/map/$a" {
    controller="form"
    action="show"
}

a <g:link controller="form" action="show" params="[a:'test'] /> теперь будет переписан как <a href="/appname/map/test" />

Но такая форма:

<g:form controller="form" action="show">
   <g:textField name="a" />
</g:form>

не будет иметь тот же эффект. Это приведет к запросу /appname/form/show?a=whatever

Я знаю, что форму нельзя переписать во время создания HTML, как ссылку - главным образом потому, что значение параметра в настоящее время неизвестно, но я надеялся, что этот URL будет перенаправлен в «nice» URL.

Есть ли способ делать такие вещи в граалях? Или я должен написать свой собственный редирект?

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Наверное, я нашел ответ:

Перезапись URL-адреса работает только во время визуализации HTML-кода. Так

<g:form controller="form" action="show" params="[a:'test']">
   <g:textField name="b" />
</g:form>

приведет к /appname/map/test. Но это не то, чего я хочу - я хочу, чтобы URL был переписан при отправке формы.

Итак, я придумал действие перенаправления:

class FormController {

    def index() { }
    def show() {
        render("yep"+params.a)
    }
    def submit() {
        redirect(controller:'form',action:'show',params:params)
    }
}

и я переписываю свою форму как

<g:form controller="form" action="submit">
   <g:textField name="a" />
</g:form>

Кажется, что это прекрасно работает (за счет одного перенаправления)

1 голос
/ 23 февраля 2012

Как вы упомянули, это невозможно сделать во время рендеринга страницы из-за неизвестных значений параметров. Кроме того, вы можете себе представить проблемы, которые возникнут, когда вы выйдете за пределы одного поля формы.

Вы можете написать JavaScript, чтобы сделать симпатичный URL в onSubmit, или, если вы делаете это повсеместно, вы можете создать собственный тег.

...