Play Framework 2.4, как использовать оператор return в контроллере Action
Есть ли способ вернуть значение внутри контроллера действий.
У меня есть метод в моей модели User, который возвращает количество друзей данного пользователя.
def nrOfFriends(current_user: Long): Int = {
DB.withConnection{ implicit connection =>
var nr: Int = SQL("select count(*) from friend where user_id_1=" + current_user + " or user_id_2=" + current_user).as(scalar[Int].single)
nr
}
}
В моем контроллере я просто хочу вернуть значение из модели
def freunde() = IsAuthenticated { username => _ =>
User.findByUsername(username).map { user =>
var nr: Int = Friend.nrOfFriends(user.id.get)
Ok(""+nr)
}.getOrElse(Forbidden)
}
Но так, как написано, он напечатает "пустую строку", соединенную с номером
Если я заменяю Ok(""+nr) на Ok(nr), я получаю следующую ошибку:
"Невозможно записать экземпляр Int в ответ HTTP. Попробуйте определить Writeable[Int]"
Мне нужно, чтобы мое действие возвращало значение, чтобы я мог передать значение из действия в header.views.html внутри панели навигации что-то в этом роде
<a href="#">@Freund.freunde Friends</a>
2 ответа
Действие контроллера обрабатывает запрос и генерирует результат для отправки клиенту. Другими словами, действие возвращает значение play.api.mvc.Result, представляющее HTTP-ответ для отправки веб-клиенту. В вашем примере Ok создает ответ 200 OK. Тело ответа должно быть одного из предопределенных типов, включая text/plain, json и html. Число друзей является целым числом и НЕ является приемлемым типом тела. Поэтому простой способ решения этой проблемы - преобразовать ее в текстовый / обычный текст с помощью .toString ().
С другой стороны, вы можете определить модуль записи для Int, который позволит Play узнать, как преобразовать целое число в формат json.
Для получения более подробной информации, пожалуйста, посмотрите на этот https://www.playframework.com/documentation/2.2.x/ScalaActions.
Если вы хотите, чтобы ваш ответ был просто значением nr
Вы можете просто позвонить nr.toString
:
def freunde() = IsAuthenticated { username => _ =>
User.findByUsername(username).map { user =>
var nr: Int = Friend.nrOfFriends(user.id.get)
Ok(nr.toString)
}.getOrElse(Forbidden)
}
Ошибка, которую вы получаете, указывает на то, что Int
не имеет неявного Writeable[Int]
в рамках. Так что игра не знает, как отображать Int
в ответ http.
Вы можете добавить марку Int
записываемый, помещая это в область видимости:
implicit val intWriteable = play.api.http.Writeable[Int](_.toString.getBytes, None)
Тогда вы сможете просто сказать:
Ok(nr)
без ошибок.
Тем не менее, похоже, что вы просто хотите получить результат nrOfFriends
внутри несвязанного шаблона. Если это так, вы должны использовать Action
совсем. Вместо этого просто вызовите функцию модели внутри шаблона, где вам нужны данные.
<a href="#">@User.nrOfFriends(user.id) Friends</a>
Конечно, вам нужно будет передать пользователя и шаблону.
Вы не опубликовали полный образец всего кода, который вы пытаетесь выполнить, поэтому я думаю, что это лучшее, что я могу сделать на данный момент. Возможно, попробуйте опубликовать базовый шаблон, который ваш <a>
в.
Важным моментом является то, что Action
Они предназначены для получения ответа HTTP, а не только для простых данных внутри приложения.