我有一个表格
case class UserUpdateForm(
id:Long, name: String,
remark: Option[String], location: Option[String])
我将字段定义为
"id" -> of[Long],
"remarks" -> optional(text)
备注字段是 None
,Some("")
我不例外,
那么,如何将空字符串绑定到可选文本字段
我有一个表格
case class UserUpdateForm(
id:Long, name: String,
remark: Option[String], location: Option[String])
我将字段定义为
"id" -> of[Long],
"remarks" -> optional(text)
备注字段是 None
,Some("")
我不例外,
那么,如何将空字符串绑定到可选文本字段
case class OptionalText(wrapped: Mapping[String], val constraints: Seq[Constraint[Option[String]]] = Nil) extends Mapping[Option[String]] {
override val format: Option[(String, Seq[Any])] = wrapped.format
val key = wrapped.key
def verifying(addConstraints: Constraint[Option[String]]*): Mapping[Option[String]] = {
this.copy(constraints = constraints ++ addConstraints.toSeq)
}
def bind(data: Map[String, String]): Either[Seq[FormError], Option[String]] = {
data.keys.filter(p => p == key || p.startsWith(key + ".") || p.startsWith(key + "[")).map(k => data.get(k)).collect { case Some(v) => v }.headOption.map { _ =>
wrapped.bind(data).right.map(Some(_))
}.getOrElse {
Right(None)
}.right.flatMap(applyConstraints)
}
def unbind(value: Option[String]): (Map[String, String], Seq[FormError]) = {
val errors = collectErrors(value)
value.map(wrapped.unbind(_)).map(r => r._1 -> (r._2 ++ errors)).getOrElse(Map.empty -> errors)
}
def withPrefix(prefix: String): Mapping[Option[String]] = {
copy(wrapped = wrapped.withPrefix(prefix))
}
val mappings: Seq[Mapping[_]] = wrapped.mappings
}
val textOpt = new OptionalText(text)
最后我复制了 OptionalMapping 类并排除了空过滤器部分
几个月前我偶然发现了同样的事情。我没有找到任何简单的方法来解决它,所以我决定一起玩。
基本上,当是一个空字符串时"remarks" -> optional(text)
总是会返回。因此,不要将空字符串视为没有更新的标志,而是使用原始值填充表单中的字段,然后在您取回它之后:None
text
remarks
remarks match {
case None => // set remarks to ""
case originalRemark => // do nothing
case _ => // set remarks to the new value
}
希望能帮助到你。这是我在 Stack Overflow 上的第一个条目 :)
利用
"remarks" -> default(text, "")