Невозможно связать данную карту в форме с помощью Play для Scala

Я не могу привязать значение к форме [M]. Кажется, это не работает из-за списка: если я превращаю List[String] в String, он работает. Вот код

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)
   } 
  )   
}

Что я получаю:

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


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

Есть идеи?


person Max    schedule 01.09.2014    source источник
comment
Однако действительно ли необходимо иметь необязательный список? Пустого списка недостаточно?   -  person Michael Zajac    schedule 01.09.2014
comment
Хорошо, было бы. Но я не думаю, что это решит проблему.   -  person Max    schedule 01.09.2014
comment
... рефакторинг с Option[List[String]] на List[String]   -  person Max    schedule 01.09.2014


Ответы (1)


Чтобы связать значения списка, к ключу должны быть добавлены индексы списка (например, [0], [1]). Попробуй это:

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

Примечание: если вы выполняете привязку из данных запроса, достаточно просто использовать [] в качестве суффикса, но это не работает при привязке из карты со строковыми значениями, поскольку вам нужно устранить неоднозначность ключей.

Вы также можете использовать bindFromRequest с аргументом Map[String,Seq[String]], и вам не нужно указывать точные индексы:

theSearchForm.bindFromRequest(Map("fq_chset[]" -> Seq("Value1")))
person Mikesname    schedule 01.09.2014
comment
Спасибо за совет! Я знал о методе .bindFromRequest(), мне нужно было на самом деле связать значение, объявленное в коде. - person Max; 01.09.2014