说我有一个模型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点
答案 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:您可以在操作中创建格式并可以访问请求。如果要在多个操作中使用相同的表单,也可以在一个方法中构建一个表单,该方法将请求作为参数,