不使用控制器方法内的列表

Rob*_*lds 3 scala playframework

我有以下一种控制器方法:

  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.")
  }}
Run Code Online (Sandbox Code Playgroud)

但是我对自己的工作方式不满意。

实际上,我不想测试列表(书籍val)是否为空。

我尝试了类似的东西:

  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.")
  }}
Run Code Online (Sandbox Code Playgroud)

它确实可以编译,但是我每次都有NOtFound重定向。

我该怎么办?

Har*_*ebe 5

您的第二个代码示例不起作用的原因是,该方法的最后一个表达式的结果用作返回值,因此在您的情况下始终为NotFound(...)

如果你不想来测试books.nonEmpty,你可以一起工作headOption就像

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

但是我不确定这是否比原始解决方案更容易理解。


Krz*_*sik 5

也许您只是在寻找模式匹配?

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.")
}
Run Code Online (Sandbox Code Playgroud)