如何将grails控制器映射到视图

时间:2014-09-16 16:34:23

标签: grails

尝试做一些(我认为)应该非常直接的事情。简而言之,将连接的grails连接到一个mysql数据库,经过一些摆弄后,我得到了它的工作。然后我创建了一个控制器,我想用它从数据库服务器中提取一些有用的数据,但不想发送域,因为我真的不想再将数据存储在数据库中。

控制器看起来像这样(称为DbstatsController):

package dbfscalls
import groovy.swing.SwingBuilder;
import java.awt.FlowLayout

class DbstatsController {
    def userlist() {
        def query = Calls.where {}.projections { distinct 'user' }
        def userret = query.list()
        [userret:userret]
    }
    def index() {
        int numberOfRecords = Calls.count()
        [ numberOfRecords:numberOfRecords ]
        def pf = Calls.read(1)
        def firstDate = pf.CallDate
        def pl = Calls.read(numberOfRecords)
        def lastDate = pl.CallDate

    }
}

默认情况下,它要查找从数据库生成报告的第一个和最后一个日期以及数据库中的entires数。 然后,我希望能够要求用户列表获取不同用户的列表。

接下来,我创建了一个视图(在视图/ dbstats下),如下所示:

<g:select name="userstorep"
          from="${dbstats.userlist()}"
          size="15" multiple="yes" optionKey="id"
          value="${author?.usertorep}" />

当我调用它时,发生的一切就是我收到一条错误消息:

| Error 2014-09-16 17:24:38,030 [http-bio-8080-exec-6] ERROR errors.GrailsExceptionResolver  - NullPointerException occurred when processing request: [GET] /DBFSCalls/dbstats/index
Cannot invoke method userlist() on null object. Stacktrace follows:
Message: Error evaluating expression [dbstats.userlist()] on line [1]: Cannot invoke method userlist() on null object
    Line | Method
->>    1 | run       in /Users/bengtbjorkberg/Documents/workspace-ggts/DBFSCalls/grails-app/views/dbstats/index.gsp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Caused by NullPointerException: Cannot invoke method userlist() on null object
->>    1 | doCall    in Users_bengtbjorkberg_Documents_workspace_ggts_DBFSCalls_grails_app_views_dbstats_index_gsp$_run_closure2
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    198 | doFilter  in grails.plugin.cache.web.filter.PageFragmentCachingFilter
|     63 | doFilter  in grails.plugin.cache.web.filter.AbstractFilter
|   1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    617 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run       in java.lang.Thread

我确信我错过了最明显的事情,但是在浏览过这些信息的过程中,我无法弄明白我失踪了什么(明显是我确定的流血)。会猜测我必须创建对象(域控制器),但不知道如何。

1 个答案:

答案 0 :(得分:1)

在渲染视图时,控制器提供了一个模型来执行此操作 - 因此您不能直接访问控制器进行渲染,而是使用控制器提供的模型。

在您的情况下,index视图默认呈现,您必须提供模型。

请参阅http://grails.org/doc/latest/guide/theWebLayer.html#modelsAndViews

控制器中的

[ numberOfRecords:numberOfRecords ]现在看起来像一个noop。把它放在index方法的末尾,在那里添加你的userlist(例如,不要返回地图,但只有cound并将其作为键添加到地图中)并使用它在select直接(不是dbstats.)。