我正在尝试运行示例Collab-Todo应用程序,如书籍Beginning Groovy and Grails,第123页(作者:Christopher M. Judd,Joseph Faisal Nusairat和James Shingler出版:Apress and Edition:2008)。这是我的User.groovy文件:
package collab.todo
class User {
String userName
String firstName
String lastName
static hasMany = [todos: Todo, categories: Category]
static constraints = {
userName(blank:false,unique:true)
firstName(blank:false)
lastName(blank:false)
}
String toString () {
"$lastName, $firstName"
}
}
UserController.groovy如下:
package collab.todo
class UserController {
def scaffold = User
def login = {
}
def handleLogin = {
def user = User.findByUserName(params.userName)
if (!user) {
flash.message = "User not found for userName: ${params.userName}"
redirect(action:'login')
}
session.user = user
redirect(controller:'todo')
}
def logout = {
if(session.user) {
session.user = null
redirect(action:'login')
}
}
}
我可以像往常一样创建,阅读,更新或删除User表。这是我的用户视图的示例屏幕截图: 在脚手架视图中,我试图使用user / login.gsp中的以下代码段显示下拉列表中的所有用户列表(根据本书):
<g:select name='userName' from="${User?.list()}"
optionKey="userName" optionValue="userName"></g:select>
但我在登录页面中获得的是一个没有填充值的下拉列表: 以下是登录页面的屏幕截图:
如果我改变
from="${User?.list()}"
到
from="${User.list()}"
我收到NullPointerException。那么有什么线索呢?
答案 0 :(得分:3)
看起来无法从您的视图中找到User
类。
请尝试以下方法之一:
将import语句添加到视图中。
<%@ page import="collab.todo.User" %>
或使用from
属性中的完全限定名称。
from="${collab.todo.User.list()}"
最佳做法是从控制器传递用户列表:
def login = {
[users: User.list()]
}
在视图中使用该集合
from="${users}"