【发布时间】:2017-04-24 16:56:03
【问题描述】:
免责声明:此处使用 PlayFramework 2.6.0-M4!
我显示一个表单并想添加额外的约束,即某些字符串对于给定的字段是禁止的。
现在我有两个问题:
def create() = Action(parse.form(createUserForm))
{
implicit request =>
val formData: CreateUserData = request.body
if(validate(formData).isDefined)
{
userRepository.create(formData.name, formData.dummy)
Ok(s"Here should go success, if user was created: $formData")
} else {
BadRequest("No means no!")
}
}
case class CreateUserData(name: String, dummy: Boolean)
private val createUserForm = Form(
mapping(
"name" -> text,
"dummy" -> boolean
)(CreateUserData.apply)(CreateUserData.unapply)
verifying("Failed form constraints!", fields => fields match
{
case data => validate(data).isDefined
})
)
private def validate(formData: CreatUserData): Option[CreatUserData] =
{
ReservedWords.filter(
_.equalsIgnoreCase(formData.name)
).isEmpty match
{
case true => Some(formData)
case false => None
}
}
1) Ok(s"Here should go success, if user was created: $formData").as("text/html") 在提供的数据有效的情况下有效,但在用户输入禁止名称的情况下:
a) 没有创建用户 (GOOD)
b) BadRequest("No means no!") 永远不会被退回! (虽然我得到了一个 http 400 响应,但只是空的)
我不明白为什么 b) 会发生。
另外我想关注https://www.playframework.com/documentation/2.6.x/ScalaForms
改为这样编写代码:
def create() = Action(parse.form(createUserForm))
{
implicit request =>
createUserForm.bindFromRequest.fold(
formWithErrors =>
{
BadRequest("Errors: " + formWithErrors.errors).as("text/html")
},
formData =>
{
userRepository.create(formData.name, formData.dummy)
Redirect(s"/")
}
)
}
但遗憾的是,这会导致每个发布请求都出现错误,即使是完全有效的请求:
错误:List(FormError(name,List(error.required),List()))
我做错了什么?
编辑:为了阐明“总有效请求”的含义,我举了一个关于返回上述错误的示例。
name=Teolha&dummy=true 作为 post 请求发送。
实际上,我输入什么并不重要,但是(渲染的)表单的 HTML5 部分确保我必须输入一些内容。我期望的是Ok,以防ReservedWords列表中NOT的任何内容,否则BadRequest
edit2:这可能是因为默认过滤器吗?
那些在 play 2.6 中运行:
play.filters.csrf.CSRFFilter
play.filters.headers.SecurityHeadersFilter
play.filters.hosts.AllowedHostsFilter
我问,因为我不在这里使用 Twirl(但 ScalaTags)来呈现表单!所以也许我错过了 twirl 实现将涵盖的一些隐含的东西(令牌或其他东西)?
【问题讨论】:
-
Errors: List(FormError(name,List(error.required),List()))表明您没有发布姓名。您能具体说明您要发布的内容吗? -
我为“完全有效的请求”添加了一个示例,希望能够澄清它。
-
我会记录
request对象只是为了看看控制器实际得到了什么。 -
已记录。你到底想看什么?
-
顺便说一句,将
ReservedWords重命名为ForbiddenNames- 这很不妥。
标签: java scala validation playframework playframework-2.6