我具有以下控制器方法:
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.")
}}
但是我对自己的操作方式不满意。
实际上,我不想测试列表(书籍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.")
}}
它确实可以编译,但是每次都具有NOtFound重定向。
我该怎么办?
答案 0 :(得分:5)
也许您只是在寻找模式匹配?
Book.getBookId(bookId).headOption
.map(book => Ok(views.html.book.create(bookForm.fill(book)))))
.getOrElse(NotFound("Book is not found."))
答案 1 :(得分:4)
您的第二个代码示例不起作用的原因是,该方法的最后一个表达式的结果用作返回值,因此在您的情况下,它始终为NotFound(...)
。
如果您不想在books.nonEmpty
上进行测试,则可以像{p1}这样使用
headOption
但是我不确定这是否比您原来的解决方案更容易理解。
答案 2 :(得分:3)
您也可以像这样折叠选项
Book.getBookId(bookId).headOption.fold(NotFound("Book is not found.")) { book =>
Ok(views.html.book.create(bookForm.fill(book)))
}