Я пытаюсь создать функцию, которая принимает переменное число аргументов и выводит форму, которая отображает каждый аргумент в nonEmptyText
.
Вот что я пробовал до сих пор:
Отображение аргументов для создания динамического кортежа (с несколькими ошибками компилятора):
def formBuilder(args: String*): Form[_] = {
Form(
tuple(
args.map(arg => arg -> nonEmptyText):_*
)
)
}
Создание списка синглов путем сопоставления с аргументами (выдает Expansion for non repeated parameter
ошибка):
def formBuilder(args: String*): Form[_] = {
Form(
list(
args.map(arg => single(arg -> nonEmptyText)): _*
)
)
}
Мой вариант использования заключается в том, что я создаю страницу поиска по внешнему интерфейсу, которая содержит другой набор полей на основе параметра, name
. Ранее мне не нужно было создавать форму для этого, так как все поля для любого поиска были необязательными, но я только что получил некоторые бизнес-правила, в которых говорится, что определенные name
имеют определенные правила формы. Поэтому, когда я делаю .bindFromRequest()
в своем контроллере в этой Форме, мне нужно использовать данные этих проверенных в настоящее время форм для отображения ошибок формы, если формы заполнены неправильно (по сравнению с тем, где я раньше не проверял формы, поскольку каждое поле было необязательным).
Надеюсь, это имеет смысл. Дайте мне знать, если я могу уточнить еще. В любом случае, вот полная реализация того, что я получил, чтобы, надеюсь, объяснить мою проблему дальше:
def searchForm(name: String, args: String*): Form[_] = {
name.toUpperCase() match {
case NAME_1 => Form(
tuple(
NAME_1_FIELD_1 -> nonEmptyText,
NAME_1_FIELD_2 -> nonEmptyText
)
)
case NAME_2 => Form(
tuple(
NAME_2_FIELD_1 -> nonEmptyText,
NAME_2_FIELD_2 -> optional(text),
NAME_2_FIELD_3 -> optional(text)
).verifying("HELP YOU FAILED", _ match {
case (_, Some(_), _) | (_, _, Some(_)) => true
case _ => false
})
)
case _ => formBuilder(args: _*)
}
}
def formBuilder(args: String*): Form[_] = {
Form(
list(
args.map(arg => single(arg -> optional(text))): _*
)
)
}
Вот как я хочу вызвать функцию проверки формы с моего контроллера:
searchForm(name, Seq("val1", "val2", "val3")).bindFromRequest().fold(
// redirect back to previous page with form error warnings
formWithErrors => Future.successful(Redirect(.....))),
// do something with the valid form
formWithoutErrors => {
.....
}
)
Я работал над этим уже несколько часов без особой удачи. Как мне успешно создавать формы с переменными аргументами?