play framework как повторно использовать и расширять отображение формы

#scala #playframework-2.0

#скала #playframework-2.0 #scala

Вопрос:

У меня есть отображение формы, такое как следующее:

 val myBaseMapping =  mapping(
  "email"                -> email,
  "password"             -> text.verifying("Please provide a password", !_.isEmpty)
)(BaseModel.apply)(BaseModel.unapply)
  

Это представляет FormA . У меня есть другая форма, FormB , которая идентична, но добавляет еще пару полей. Вот как будет выглядеть его отображение:

 val myExtendedMapping =  mapping(
  "email"                -> email,
  "password"             -> text.verifying("Please provide a password", !_.isEmpty)
  "name"                 -> text,
  "website"              -> text
)(ChildModel.apply)(ChildModel.unapply)
  

ChildModel расширяет BaseModel : добавляет 2 новых поля, name и website .

Я пытаюсь закодировать myExtendedMapping таким образом, чтобы мне не приходилось дублировать определения привязки для общих полей (адрес электронной почты и пароль).

Я не уверен, какой здесь был бы синтаксис Scala. Я не знаю, как «расширить» данное отображение и добавить к нему привязки. Кроме того, я бы предпочел не добавлять специальную проверку из-за разницы в поведении. Возможно ли это или мне просто нужно дублировать код?

Комментарии:

1. К чему привязывается каждый из них?

2. Я не уверен, отвечает ли это на ваш вопрос, но чтобы использовать отображение, я делаю: Form (myMapping), а затем использую это для привязки из HTTP-запроса.

3. Я имею в виду, что FormB также следует привязывать к MyModel или что-то еще? Если да, то как это будет выглядеть?

4. О, я вижу: мой текущий план состоит в том, чтобы иметь другой отдельный класс модели, скажем, MyChildModel расширить MyModel для использования в сопоставлениях для формы B (добавив эти дополнительные атрибуты). Итак, другими словами, я искал способ, чтобы привязки формы были параллельны структуре объекта модели. Но я определенно открыт для лучших способов организовать это в целом.

Ответ №1:

Что вы можете сделать, так это простую композицию. Например:

 case class BaseModel(email: String, password: String)
case class ChildModel(name: String, website: String, base: BaseModel)

val commonMapping = mapping(
  "email" -> email,
  "passwod" -> texttext.verifying("Please provide a password", !_.isEmpty)
)(BaseModel.apply)(BaseModel.unapply)

val myExtendedForm = Form[ChildModel](mapping(
   "name" -> text,
   "website" -> text,
   "base" -> commonMapping
)
   ((name, website, base) => ChildModel(name, website, base))  //bind
   (child => Some(child.name, child.website, child.base))      //unbind
)