使用表单变量和表单创建模型实例的最佳实践

时间:2014-08-22 09:06:08

标签: scala model-view-controller playframework playframework-2.2

说我有一个模型FsqCheckIn:

 case class FsqCheckIn( userId: Int, restaurantId: Int, date: Date, rating: Int )

 val myForm = Form( mapping( .... )  )( <Special apply function> )

用户可以填写的表单。我的问题是,

1)我应该将userId设为hidden类型的输入,然后从那里使用值吗?或者,

1.1)添加一个字段&#39; user&#39;到Form [T]实例但不向用户显示。添加我自己的bindFromRequest,它将使用当前登录的用户来填充它。

2)使userId成为case类中的var,然后在表单绑定成功后将其值更改为登录用户的id?或者,

3)我有办法覆盖bindFromRequest,以便我可以直接访问请求吗?或者,

4)我有没有办法在special apply function内访问请求,以便我可以提取登录的用户ID并将其标记在实例上?

如果问题很幼稚,我道歉,但我对MVC和播放框架都很陌生。

谢谢!

编辑:添加了第1.1点

2 个答案:

答案 0 :(得分:1)

除非您想在同一会话中管理多个用户,否则不要在表单中公开与用户相关的任何内容。对于用户身份验证的视图,您始终可以确定登录的用户。所以更改:

 case class FsqCheckIn( userId: Int, restaurantId: Int, date: Date, rating: Int )
 val myForm = Form( mapping( .... )  )( <Special apply function> )

 case class FsqCheckIn( restaurantId: Int, date: Date, rating: Int )
 case class FsqCheckInModel( userId: Int, restaurantId: Int, date: Date, rating: Int )

 val myForm = Form( mapping( "restuarantId" -> number,  "date" -> nonEmptyText, "rating" -> number) )( FsqCheckIn.apply)(FsqCheckIn.unappy _)
 val checkInData = myForm.bindFromRequest.get
 // handle validation and date conversion
 val user = getUserFromSession
 val cq = FsqCheckInModel(user.id, checkInData.restaurantId, checkInData.date, checkInData.rating)
 // save to db

答案 1 :(得分:0)

1:如果你这样做,用户可能会改变它,这取决于你的使用案例,可能是危险的

2,3&amp; 4:您可以在操作中创建格式并可以访问请求。如果要在多个操作中使用相同的表单,也可以在一个方法中构建一个表单,该方法将请求作为参数,