Расширение для неповторяющегося параметра при создании универсальной функции Form - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь создать функцию, которая принимает переменное число аргументов и выводит форму, которая отображает каждый аргумент в nonEmptyText.

Вот что я пробовал до сих пор:

  1. Отображение аргументов для создания динамического кортежа (с несколькими ошибками компилятора):

    def formBuilder(args: String*): Form[_] = {
      Form(
        tuple(
          args.map(arg => arg -> nonEmptyText):_*
        )
      )
    }
    
  2. Создание списка синглов путем сопоставления с аргументами (выдает 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 => {
    .....
  }
)

Я работал над этим уже несколько часов без особой удачи. Как мне успешно создавать формы с переменными аргументами?

1 Ответ

0 голосов
/ 01 ноября 2018

Это невозможно элегантным способом.Кортеж содержит фиксированное количество элементов произвольных типов.Список содержит переменное количество элементов одного типа (или общего супертипа).По сути, вам нужно преобразовать список в кортеж.

Если вам известно максимальное количество элементов в кортеже (и оно не слишком большое), вы можете написать совпадение с одним регистром для каждого возможного числа.элементов.

Количество элементов в кортеже ограничено небольшим значением (может быть 22).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...