2017-02-05 8 views
0

Я использую Play 2.5 и ReactiveMongo. Это простая проблема, но я не могу понять. У меня есть контроллер, который получает username и password с представлением. Я хочу преобразовать этот запрос в модель типа UserModel, а затем преобразовать эту модель в json и записать ее в MongoDB.Scala Play конвертировать запрос в JSON и записывать его в MongoDB

Мой контроллер:

class RegisterController @Inject() (val reactiveMongoApi: ReactiveMongoApi) 
extends Controller with MongoController with ReactiveMongoComponents { 

    def registerPost = Action.async { request => 

    implicit val accountWrites = new Writes[UserModel] { 
    def writes(account: UserModel) = Json.obj(
    "username" -> account.username, 
    "password" -> account.password 
) 
} //needs this for some reason? 

val future = collection.insert(request.body) //trying to insert to mongo 
future.map(_ => Ok) 

Моя модель:

case class UserModel(username: String, password: String) {} 

object UserModel { 

    implicit val format = Json.format[UserModel] //needs this for some reason? 

    val userModel = Form(
mapping(
    "username" -> nonEmptyText, 
    "password" -> nonEmptyText 
)(UserModel.apply)(UserModel.unapply)) 
} 

Мое мнение:

@(userForm: Form[UserModel])(implicit messages: Messages) 

<h1>Register</h1> 

@helper.form(action = routes.RegisterController.registerPost()) { 
    @helper.inputText(userForm("username")) 
    @helper.inputText(userForm("password")) 

    <button type="submit" name="action" value="register">Register</button> 

} 

ответ

0

Это ключевые вещи, которые вы должны сделать:

=>Bind the form request в вашем контроллер, registerPost. Для этого вам также необходимо иметь настройки form mapping. Это сопоставление поможет вам сгенерировать объект UserModel, используя данные формы внутри метода. За все это см. Здесь ScalaForms

=> Вам не нужно writes здесь. Вы можете использовать format для выполнения как json writes and reads.

=> Теперь конвертируем UserModel в JsValue как:

//usermodel will be generated by binding the form data 
implicit val format = Json.format[UserModel] 
val userModelJson = format.writes(usermodel) 

=> Тогда вы можете просто позвонить в хранилище как:

collection.insert(userModelJson) 
+0

Там нет необходимости использовать форму, чтобы получить JSON тело запрос – cchantep

+1

Я никогда не говорил «это единственный способ» получить тело JSON. Вы не можете выполнять сложные проверки с помощью метода 'request.body'. Я пытаюсь объяснить своим подходом и как я обрабатываю подобные варианты использования. Если вы обнаружите ошибку, укажите это, и если у вас другое мнение, не стесняйтесь добавлять ответ. – oblivion

+0

Это отлично работает, спасибо за ваш ответ. Я не знал, что такой формат можно использовать. – DarthBinks911

 Смежные вопросы

  • Нет связанных вопросов^_^