Я пытаюсь добавить в свой проект 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'

Кроме того, даже после того, как я вручную вернусь на страницу articleList, значение вывода метода getLikesCount() по-прежнему равно 0. Что вызывает все эти проблемы?

ОБНОВЛЕНИЕ:

На всякий случай, если вам интересно, мой метод showArticleList () выглядит так:

def showArticleList(){
        render (view: 'articleList',  model: [ articles: getArticle(), articleLikes: getArticleLike()]);
    }
0
Jack_Russell 13 Мар 2018 в 17:31

2 ответа

Лучший ответ

Хорошо, я нашел проблему. Я изменил строку объявления статьи на

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

И более того, проблема была также в моем if-else - я создавал новый объект ArticleLike, используя типы в качестве аргументов вместо имен полей, объявленных в моем классе домена, поэтому он должен быть

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

Вместо того

else{
                al = new ArticleLike(Article: article, ServiceUser: user, liked: true)
            }
0
Jack_Russell 15 Мар 2018 в 09:08

Пару вещей,

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
abdul 14 Мар 2018 в 07:27