Не использовать голову в списке внутри метода контроллера - PullRequest
3 голосов
/ 29 июня 2019

У меня есть следующий метод контроллера:

  def edit(bookId: Int): Action[AnyContent] = messagesAction {implicit request => {
    val books = Book.getBookId(bookId)
    if(books.nonEmpty) Ok(views.html.book.create(bookForm.fill(books.head)))
    else NotFound("Book is not found.")
  }}

Но я не удовлетворен тем, как я это делаю.

На самом деле, я бы не хотел проверятьпустота списка (vals).

Я пробовал что-то вроде:

  def edit2(bookId: Int): Action[AnyContent] = messagesAction {implicit request => {
    Book.getBookId(bookId).foreach(book => Ok(views.html.book.create(bookForm.fill(book))))
    NotFound("Book is not found.")
  }}

Он компилируется, но у меня каждый раз перенаправление NOtFound.

Как могЯ делаю это?

Ответы [ 3 ]

5 голосов
/ 29 июня 2019

Может быть, вы просто ищете соответствие шаблону?

Book.getBookId(bookId) match {
   //get head of list and ignore rest
   case book :: _ => Ok(views.html.book.create(bookForm.fill(book)))
   //if list is empty return not found 
   case Nil       => NotFound("Book is not found.")
}
4 голосов
/ 29 июня 2019

Причина, по которой ваш второй пример кода не работает, заключается в том, что в качестве возвращаемого значения используется результат последнего выражения метода, поэтому в вашем случае это всегда NotFound(...).

Если вы не хотите тестировать на books.nonEmpty, вы можете работать с headOption, как

Book.getBookId(bookId).headOption
  .map(book => Ok(views.html.book.create(bookForm.fill(book)))))
  .getOrElse(NotFound("Book is not found."))

Но я не уверен, что это легче понять, чем ваше оригинальное решение.

3 голосов
/ 29 июня 2019

Вы также можете сложить опцию, например, так:

Book.getBookId(bookId).headOption.fold(NotFound("Book is not found.")) { book =>
  Ok(views.html.book.create(bookForm.fill(book)))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...