0

我有一个 GSP 页面:

<g:if test="freelancer">
        <g:each in="${ freelancer }" var="freelance">
            <a href="${ createLink(controller:'user', action:'homepage', id:freelance.user.username) }">${ freelance.firstName }</a>
        </g:each>
</g:if>

和一个动作:

def homepage() {
    println(params.id)
    def user = User.find{
        username == params.id
    }
    if(user){
        println(user.username + "!")
        return[user:user]
    }
}

和欢迎页面:

<body>
    Welcome ${ user.username }
</body>

在第一个 GSP 页面中,我得到了 firstName 链接,当我点击它查看他的主页时,我得到一个错误:

Cannot get property 'username' on null object

但是在我的 IDE 的控制台中,println(params.id)打印了一个用户名,但带有方括号。我的代码有什么问题?

4

3 回答 3

1

在您的“主页”操作中尝试

def user = User.find{ it.username == params.id }代替

def user = User.find{ username == params.id }

于 2013-06-19T19:03:39.603 回答
0

是的,您必须在标签中使用括号。那是第一名。

<g:if test="${freelancer}">

</g:if>

否则,groovy truth将始终将非空字符串评估为 true,因此您的测试将有缺陷。

另外,我会使用 g:link 而不是 html 'a' 标签。

    <g:each in="${ freelancer }" var="freelance">
        <g:link controller='user', action='homepage', id="${freelance.user.username}">
            ${freelance.firstName}
        </g:link>
    </g:each>

作为建议,请考虑使用 User.findByUsername() 而不是 find 闭包。

让我们知道这是否有效。;)

于 2012-07-04T19:16:18.243 回答
0

这是我的用户域类:

class User {
String username
String passwordHash
byte[] passwordSalt
Profile profile

static hasMany = [ roles: Role, permissions: String ]

static constraints = {
    profile(nullable:false)
    username(nullable: false, blank: false, unique: true, size:3..15)
    passwordHash(nullable:false, blank:false, minSize:6)
}

static mapping = {
    profile lazy:false
}

在 g:if 标签中,我将 freelancer 放在括号中并更改为User.findByUsername(). 但是有同样的错误。我不希望 params.id 作为列表。

于 2012-07-02T05:41:00.190 回答