Получить ошибку при использовании findBy() в Grails

У меня есть страница 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) печатает имя пользователя, НО с квадратными скобками. Что не так в моем коде?


person Jack Daniel    schedule 01.07.2012    source источник
comment
Таким образом, результат params.id должен быть списком действий на главной странице? Можете ли вы опубликовать исходный код вашего домена?   -  person Fabiano Taioli    schedule 02.07.2012
comment
Нам также, вероятно, нужно посмотреть, как вы заполняете свою коллекцию фрилансеров и передаете ее в представление. Ваш User.find излишен. Просто выполните User.findByUsername(params.id). Я также удивлен, что ваш g:if работает. У вас нет ${} фрилансера для вашего теста. Без разницы.   -  person Gregg    schedule 02.07.2012


Ответы (3)


В действии "домашняя страница" попробуйте

def user = User.find{ it.username == params.id } вместо

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

person Ashish Joseph    schedule 19.06.2013

Да, вам придется использовать скобки в теге. Это номер один.

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

</g:if>

В противном случае отличная правда всегда будет оценивать непустую строку как истину, поэтому ваш тест будет ошибочным.

Кроме того, я бы использовал ссылку g: вместо тега 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() вместо поиска закрытия.

Дайте нам знать, если это сработает. ;)

person Tiago Farias    schedule 04.07.2012

Это мой класс пользовательского домена:

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 в виде списка.

person Jack Daniel    schedule 02.07.2012