在grails中使用findBy()时出错

时间:2012-07-01 19:08:54

标签: grails groovy gsp grails-controller

我有一个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)打印一个用户名,但是用方括号输出。我的代码出了什么问题?

3 个答案:

答案 0 :(得分:1)

在“首页”操作中尝试

def user = User.find{ it.username == params.id }而不是

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

答案 1 :(得分: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标签中,我将自由职业者放在括号中并更改为User.findByUsername()。但是也有同样的错误。我不希望params.id作为列表。

答案 2 :(得分:0)

是的,您必须在标记中使用括号。这是第一。

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

</g:if>

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

另外,我会使用g:link而不是html&#39; a&#39;标签

    <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闭包。

如果有效,请告诉我们。 ;)