Grails 数据库操作和视图渲染
Grails database action and view rendering
我正在尝试向我的 Grails 项目添加一个简单的功能,类似于 youtube 将允许用户 like/unlike 一篇文章。有一个非常原始的页面来显示他们喜欢的文章和一个使 'liking' 成为可能的控制器。 las,无论何时调用此方法,它都会尝试呈现不存在的视图,而不是返回到前一个视图。这是 .gsp 正文代码:
<g:each in="${articles}" var="article">
<table class="table-bordered">
<tr>Article title: ${article.title}</tr><br>
<tr>Author: ${article.author}</tr><br>
<tr>Page: ${article.page}</tr><br>
<tr>Likes: ${article.getLikesCount()}</tr><br>
<g:link resource="Article" action="articleLiked" id="${article.id}" params="[articleId: article.id]">Like it!</g:link>
</table>
</g:each>
这是我的控制器的 'like' 方法代码:
def articleLiked(Article article){
ServiceUser user = springSecurityService.currentUser
ArticleLike al = ArticleLike.findByArticleAndServiceUser(article, user)
if(al){
al.liked = true
}else{
al = new ArticleLike(Article: article, ServiceUser: user, liked: true)
}
al.save()
showArticleList()
}
因此,我遇到了这个异常:
Error 500: Internal Server Error
URI
/article/articleLiked/1
Class
javax.servlet.ServletException
Message
Could not resolve view with name '/article/articleLiked' in servlet with name 'grailsDispatcherServlet'
另外,即使我手动返回articleList页面,getLikesCount()
方法输出的值仍然是0。这是什么问题造成的?
更新:
以防万一你想知道,我的 showArticleList() 方法如下所示:
def showArticleList(){
render (view: 'articleList', model: [ articles: getArticle(), articleLikes: getArticleLike()]);
}
几件事,
def articleLiked(){
ServiceUser user = springSecurityService.currentUser
Article article = Article.get(params.id)
ArticleLike al = ArticleLike.findByArticleAndServiceUser(article, user)
// the rest of your code
如果你想重定向到另一个动作,你应该使用重定向。所以将 showArticleList()
更改为 redirect(action: "showArticleList")
}
那应该可以。
好的,我找到问题了。我已将文章声明行更改为
Article article = Article.findById(params.getIdentifier())
而且,问题也出在我的 if-else
- 我一直在通过使用类型作为参数而不是在我的域 class 中声明的字段名称来创建新的 ArticleLike 对象,所以应该是
}else{
al = new ArticleLike(article: article, serviceUser: user, liked: true)
}
而不是
else{
al = new ArticleLike(Article: article, ServiceUser: user, liked: true)
}
我正在尝试向我的 Grails 项目添加一个简单的功能,类似于 youtube 将允许用户 like/unlike 一篇文章。有一个非常原始的页面来显示他们喜欢的文章和一个使 'liking' 成为可能的控制器。 las,无论何时调用此方法,它都会尝试呈现不存在的视图,而不是返回到前一个视图。这是 .gsp 正文代码:
<g:each in="${articles}" var="article">
<table class="table-bordered">
<tr>Article title: ${article.title}</tr><br>
<tr>Author: ${article.author}</tr><br>
<tr>Page: ${article.page}</tr><br>
<tr>Likes: ${article.getLikesCount()}</tr><br>
<g:link resource="Article" action="articleLiked" id="${article.id}" params="[articleId: article.id]">Like it!</g:link>
</table>
</g:each>
这是我的控制器的 'like' 方法代码:
def articleLiked(Article article){
ServiceUser user = springSecurityService.currentUser
ArticleLike al = ArticleLike.findByArticleAndServiceUser(article, user)
if(al){
al.liked = true
}else{
al = new ArticleLike(Article: article, ServiceUser: user, liked: true)
}
al.save()
showArticleList()
}
因此,我遇到了这个异常:
Error 500: Internal Server Error
URI
/article/articleLiked/1
Class
javax.servlet.ServletException
Message
Could not resolve view with name '/article/articleLiked' in servlet with name 'grailsDispatcherServlet'
另外,即使我手动返回articleList页面,getLikesCount()
方法输出的值仍然是0。这是什么问题造成的?
更新:
以防万一你想知道,我的 showArticleList() 方法如下所示:
def showArticleList(){
render (view: 'articleList', model: [ articles: getArticle(), articleLikes: getArticleLike()]);
}
几件事,
def articleLiked(){
ServiceUser user = springSecurityService.currentUser
Article article = Article.get(params.id)
ArticleLike al = ArticleLike.findByArticleAndServiceUser(article, user)
// the rest of your code
如果你想重定向到另一个动作,你应该使用重定向。所以将 showArticleList()
更改为 redirect(action: "showArticleList")
}
那应该可以。
好的,我找到问题了。我已将文章声明行更改为
Article article = Article.findById(params.getIdentifier())
而且,问题也出在我的 if-else
- 我一直在通过使用类型作为参数而不是在我的域 class 中声明的字段名称来创建新的 ArticleLike 对象,所以应该是
}else{
al = new ArticleLike(article: article, serviceUser: user, liked: true)
}
而不是
else{
al = new ArticleLike(Article: article, ServiceUser: user, liked: true)
}