2012-02-16 57 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>