2012-02-16 55 views
0

我有一个控制器,这是越来越与用户相关联的对象的列表,并使用渲染方法将它传递给视图,就像这样:Grails的 - 视图中不识别模型

class HomeController { 
def index() { 
    def postList = user.posts 

    postList.each{ it -> 
     println "Title: " + it.title 
    } 

    render(view: "/index", model: [returnPosts: postList]) 
} 

在我鉴于我有以下代码:现在

<h2>Recent Posts:</h2> 
<ul> 
    <g:each var="post" in="${returnPosts}"> 
    <li><g:link controller="post" action="show" id="${post.id}">${post.title}</g:link></li> 
    </g:each> 
</ul> 

,在我的控制,我已经把在“调用println”语句,以确保该列表不为空,果然不是。但是,当我打开页面时,即使在控制器中,println语句显示它不是,但每个标记都不会运行一次,就好像“returnPosts”变量为空。

我一直在疯狂试图弄清楚这一点,任何人都可以看到为什么视图无法访问此变量的任何原因?

+0

在GSP中尝试使用'<%System.out.println“returnPosts:”+ returnPosts%>“。直接写入控制台输出保存了我的生活几次...这是第一件要做的事情,看看returnPosts确实为null时进入视图 – Grooveek 2012-02-16 09:41:56

+0

一切似乎都正确。也许你在某处犯了一个错字? – 2012-02-16 10:01:21

+1

如果您使用的是小于2.0.0的Grails版本,则问题出在您的操作声明上。你有'def index(){'当你应该有'def index = {'。由于Grails不认为这是一个有效的动作,它会跳过控制器并直接渲染'.gsp'文件,并且模型从不会被填充。如果你使用Grails 2.0.0,那么问题就在别的地方。 – 2012-02-16 14:40:13

回答

0

您似乎有一个名为'post'的控制器属性,而且您的g.each var是'post'。那里有潜在的问题?

0

有几件事情可以解决这个问题。首先,如果你的视图被称为index.gsp,那么你不需要显式地调用render,而是返回一个模型对象列表。您的代码看起来就像这样:

def index() { 
    def postList = user.posts 

    postList.each{ it -> 
     println "Title: " + it.title 
    } 
    [returnPosts: postList] 
} 

你也可以做的另一件事是明确地导入您在访问视图中的模型对象。这并不重要,但考虑到它是一个常见词汇,您可以尝试使用除了文章之外的其他名称。因此,您的gsp将如下所示:

<%@ page import="com.blah.post" %> 
<h2>Recent Posts:</h2> 
<ul> 
    <g:each in="${returnPosts}" var="post"> 
    <li><g:link controller="post" action="show" id="${post.id}">${post.title}</g:link></li> 
    </g:each> 
</ul>