Переменная не работает в теге GSP, но работает с обычным текстом - PullRequest
3 голосов
/ 29 апреля 2011

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

Для этого я создал ссылку, используя правильный тег GSP, и хочу передать идентификатор пользователя из объекта Spring Security UserDetails, используя правильный помощник.

Проблема в том, что это работает, когда я нахожусь в теге GSP, как после Edit my User, но не там, где он мне действительно нужен, в атрибуте id.

<g:link controller="user" action="show" id="${sec.loggedInUserInfo(field: "id")}">
    Edit my User ${sec.loggedInUserInfo(field: "id")}
</g:link>

Ожидаемый:

<a href="/Backoffice/user/show/1"> Edit my User 1 </a>

Неверный результат:

<a href="/Backoffice/user/show"> Edit my User 1 </a>

Класс UserDetails, к которому тег Lib имеет доступ, находится здесь:

   import org.codehaus.groovy.grails.plugins.springsecurity.GrailsUser
   import org.springframework.security.core.GrantedAuthority

   class UserDetails extends GrailsUser {
       final String displayName
       final String email
       final String gravatarImage

   ...

Идентификатор определяется как объект в базовом классе GrailsUser.

класс GrailsUser расширяет пользователя {

private final Object _id

    ...
* *} Тысяча двадцать-один

И будет закодирован как HTML здесь:

/**
 * Renders a property (specified by the 'field' attribute) from the principal.
 *
 * @attr field REQUIRED the field name
 */
def loggedInUserInfo = { attrs, body ->

    // TODO support 'var' and 'scope' and set the result instead of writing it

    String field = assertAttribute('field', attrs, 'loggedInUserInfo')

    def source
    if (springSecurityService.isLoggedIn()) {
        source = determineSource()
        for (pathElement in field.split('\\.')) {
            source = source."$pathElement"
            if (source == null) {
                break
            }
        }
    }

    if (source) {
        out << source.encodeAsHTML()
    }
    else {
        out << body()
    }
}

Забавно: это работает. Но я действительно хотел бы использовать согласованный синтаксис gsp для ссылок и хотел бы понять, почему код, размещенный сверху, не работает.

<a href="${createLink( controller : "user", action : "show", id : sec.loggedInUserInfo(field: "id"))}">Edit my User</a>

Ответы [ 2 ]

7 голосов
/ 29 апреля 2011

Похоже, неправильное цитирование - вам нужно экранировать " внутри id="...".Для простоты попробуйте использовать field: 'id' вместо field: "id".

0 голосов
/ 29 апреля 2011

Вы должны передать идентификатор в качестве параметра, вы просто присваиваете идентификатор своей ссылке.

<g:link controller="user" action="show" params="[id:${sec.loggedInUserInfo(field: "id")}]" id="${sec.loggedInUserInfo(field: "id")}">
    Edit my User ${sec.loggedInUserInfo(field: "id")}
</g:link>

Используйте firebug , чтобы увидеть точный рендеринг html ссылки g:..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...