【问题标题】:Grails database action and view renderingGrails 数据库操作和视图渲染
【发布时间】:2018-03-13 14:31:04
【问题描述】:

我正在尝试向我的 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>

这是我的控制器的“喜欢”方法代码:

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'

另外,即使我手动返回到文章列表页面,getLikesCount() 方法输出的值仍然是 0。是什么导致了这一切?

更新:

如果您想知道,我的 showArticleList() 方法如下所示:

def showArticleList(){
        render (view: 'articleList',  model: [ articles: getArticle(), articleLikes: getArticleLike()]);
    }

【问题讨论】:

    标签: grails groovy controller gsp


    【解决方案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") } 应该可以的。

    【讨论】:

    • 感谢您的回答。它仍然无法正常工作,异常不再显示,但由于某种原因,ArticleLike 数据库表中没有添加任何内容。我认为将参数传递给方法存在问题 - 我创建了debugStuff(),它应该在调用articleLiked() 时打印多个空行,但它没有发生。看起来该方法根本没有被调用
    • 你在用什么主意?您不需要创建任何方法来调试它。你不能放一个断点吗?
    • 导致有时在控制台上查看比单击和查找变量更快。我也一直在使用调试器
    【解决方案2】:

    好的,我找到了问题所在。我已将文章声明行更改为

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

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

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

    而不是

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      相关资源
      最近更新 更多