在我的GSP文件中
<g:form controller="hello" action="createUser">
<g:select id="users" class="required" name="users" from="${hello.HelloController.userList()}" noSelection="['':'-Select user-']"/>
在我的HelloController中
class HelloController {
..
def users= []
...
def userList= {
return users;
}
我得到的错误
groovy.lang.MissingMethodException
Message
No signature of method: static hello.HelloController.userList() is applicable for argument types: () values
我尝试使用from=${userList()}
并将userList更改为static。所有这些都会带来更多错误这在我在新计算机上设置新环境时运行grails升级之前曾经工作
答案 0 :(得分:1)
你应该在这里改变一些事情。
一,定义控制器动作的首选方法是方法而不是闭包。
class HelloController {
def userList() {
return users
}
}
二,你的观点不应该是调用控制器方法。您的控制器操作应返回视图渲染所需的模型。
class HelloController {
def list() {
return [userList: users]
}
}
然后在您的视图中hello/list.gsp
,您可以访问userList
。
答案 1 :(得分:1)
HelloController.userList()
那是试图在HelloController类上调用静态方法,并且该静态方法不存在。无论如何,你真的不应该从GSP调用控制器方法。控制器应该在GSP渲染之前完成其工作。如果GSP需要用户列表,您应该让控制器操作检索用户并在呈现GSP之前将它们放入模型中。可能的情况是,从GSP调用自定义标记是有意义的,但是你需要有一些理由来证明这一点。通常,让控制器将数据放入模型中会更有意义。
class MyController {
def someActionWhichRendersTheViewInQuestion() {
def users = // initialize this with a query or whatever you need
[users: users]
}
}
然后在你的GSP ......
<g:select id="users" class="required" name="users" from="${users}" noSelection="['':'-Select user-']"/>
我希望有所帮助。