Tidak dapat mengikat Peta tertentu dalam Formulir menggunakan Play for Scala

Saya tidak dapat mengikat nilai ke dalam Formulir[M]. Tampaknya itu tidak berhasil karena Daftar: jika saya mengubah Daftar[String] menjadi String, itu berhasil. Ini kodenya

case class SearchCriteria (
  val q: Option[String],
  var fq_chset: List[String]
)

val theSearchForm: Form[SearchCriteria] = Form(
  mapping(
    "q" -> optional(text),
    "fq_chset" -> list(text)
  )
)(SearchCriteria.apply _)(SearchCriteria.unapply _)

def foldSearchCriteria(searchForm: Form[SearchCriteria]): Either[Throwable, SearchCriteria] = {
  foldForm[SearchCriteria](searchForm, { searchCriteria =>
    Logger.debug(searchCriteria.toString())
    Right(searchCriteria)
  })
}

def foldForm[F](aForm: Form[F], onSuccess: F => Either[Throwable,F]): Either[Throwable,F] = {
  aForm.fold(
    hasErrors = { form => 
      Left(new RuntimeException("Errors while folding Form"))
    },
    success = { formData => 
     onSuccess(formData)
   } 
  )   
}

Apa yang saya dapatkan adalah:

foldSearchCriteria(theSearchForm.bind(Map("q" -> "ValueQ")))
>> SearchForm( Some(ValueQ), None ) )


foldSearchCriteria(theSearchForm.bind(Map("fq_chset" -> "Value1")))
>> SearchForm( None, Some(List()) )

Ada ide?


person Max    schedule 01.09.2014    source sumber
comment
Apakah daftar opsional benar-benar diperlukan? Apakah daftar kosong tidak cukup?   -  person Michael Zajac    schedule 01.09.2014
comment
Oke, itu akan terjadi. Tapi saya tidak berharap ini akan menyelesaikan masalah.   -  person Max    schedule 01.09.2014
comment
... difaktorkan ulang dari Option[List[String]] menjadi List[String]   -  person Max    schedule 01.09.2014


Jawaban (1)


Untuk mengikat nilai daftar, kunci harus memiliki indeks daftar yang ditambahkan (misalnya [0], [1]). Coba ini:

theSearchForm.bind(Map("fq_chset[0]" -> "Value1"))

Catatan: jika Anda mengikat dari data permintaan, cukup menggunakan [] sebagai sufiks saja, tetapi ini tidak berfungsi saat mengikat dari peta dengan nilai string karena Anda perlu membedakan kuncinya.

Anda juga dapat menggunakan bindFromRequest dengan argumen Map[String,Seq[String]] dan Anda tidak perlu menentukan indeks persisnya:

theSearchForm.bindFromRequest(Map("fq_chset[]" -> Seq("Value1")))
person Mikesname    schedule 01.09.2014
comment
Terima kasih atas tipnya! Saya mengetahui metode .bindFromRequest(), yang saya perlukan sebenarnya adalah mengikat nilai yang dinyatakan dalam kode. - person Max; 01.09.2014