Grails数据库操作和视图呈现

时间:2018-03-13 14:31:04

标签: grails groovy controller gsp

我试图在我的Grails项目中添加一个简单的功能,类似于youtube将允许用户喜欢/不喜欢文章。这是一个非常原始的页面,用于显示带有喜欢的文章和一个让人喜欢的控制器。可能。唉,每当调用此方法时,它都会尝试渲染一个未显示的视图,而不是返回到前一个视图。这是.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>

这是我的控制器&#39;喜欢&#39;方法代码:

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()]);
    }

2 个答案:

答案 0 :(得分:1)

有几件事,

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") } 这应该有用。

答案 1 :(得分:0)

好的,我发现了这个问题。我已将Article声明行更改为

Article article = Article.findById(params.getIdentifier())

更重要的是,问题也在我的if-else内 - 我通过使用类型作为参数而不是在我的Domain类中声明的字段名称来创建新的ArticleLike对象,所以它应该是< / p>

}else{
            al = new ArticleLike(article: article, serviceUser: user, liked: true)
        }

而不是

else{
                al = new ArticleLike(Article: article, ServiceUser: user, liked: true)
            }