Рекурсивные блоки в шаблонах Scala Play Framework

Я пишу шаблон для блога, в котором есть комментарии. Естественный способ написания шаблона для многопоточных комментариев - использование рекурсивного способа создания HTML. Что-то вроде этого:

@showComment(comment: models.Comment) = {
    <div class="comment">
        <div class="comment-metadata">
            <span class="comment-author">by @comment.author,</span>
            <span class="comment-date">
                @comment.postedAt.format("dd MMM yy")
            </span>
        </div>
        <div class="comment-content">
            <div class="about">Detail: </div>
            @Html(comment.content.replace("\n", "<br>"))
        </div>
        <a href="@action(controllers.Application.replyComment(comment.id()))">Reply</a>
        @comments filter { c => c.parent_id == comment.id } map { 
            c => @showComment(c)
        }
    </div>
}

Проблема в том, что использование рекурсивного блока приводит к ошибке:

Возникла ошибка: рекурсивный метод showComment нуждается в типе результата

Если я пытаюсь поместить тип возвращаемого значения в showComment, это вызывает ошибку:

Возникла ошибка: не найдено: значение showComment

Любое решение?

3 ответа

Решение

Это работает для меня:

Вложите код в @{}

@{

    //use regular scala here:
    def showComment(comment: models.Comment):Node = {
    ....
    }
    //the above just declared a recursive method, now call it:

   showComment(...)

}
  • определить рекурсивный метод
  • вызвать метод в конце блока
  • прибыль!

Я смог обойти это, переместив рекурсивный шаблон в собственный файл.

В Scala рекурсивный метод требует возвращаемый тип: см. Почему Scala требует возвращаемый тип для рекурсивных функций?

Я не знаю много (больше как ничего) о Play Framework, но попробую:

@showComment(comment: models.Comment):Node = {
<div class="comment">
    <div class="comment-metadata">
        <span class="comment-author">by @comment.author,</span>
        <span class="comment-date">
            @comment.postedAt.format("dd MMM yy")
        </span>
    </div>
    <div class="comment-content">
        <div class="about">Detail: </div>
        @Html(comment.content.replace("\n", "<br>"))
    </div>
    <a href="@action(controllers.Application.replyComment(comment.id()))">Reply</a>
    @comments filter { c => c.parent_id == comment.id } map { 
        c => @showComment(c)
    }
</div>
}
Другие вопросы по тегам