【问题标题】:Displaying error on Play! 2 Framework在 Play 上显示错误! 2 框架
【发布时间】:2014-03-30 04:04:15
【问题描述】:

我在玩 Play 时遇到了很大的困难! 2.2.x 文档,我目前被困在如何从我的表单验证中显示错误。

这是我的代码:

路线

GET         /account/create            controllers.Account.create()
POST        /account/create            controllers.Account.createAccount()

型号

public static UserAccount create(UserAccount data){
    UserAccount account = data;
    String salt     = BCrypt.gensalt();

    account.email   = data.email;
    account.salt    = salt;
    account.hash    = BCrypt.hashpw(data.hash, salt);

    account.save();
    return account;
}

控制器

// handles POST method
public static Result createAccount(){
    Form<UserAccount> userForm = form(UserAccount.class).bindFromRequest();
    if(userForm.hasErrors()){
        return badRequest();
    }else{
        UserAccount.create(userForm.get());
        Logger.info("Username is: " + userForm.get().email);
        return ok("ok, I recived POST data. That's all...");
    }
}

// Handles GET method
public static Result create(){
    return ok(
            views.html.account.form.render()
    );
}

观看次数

@if(form.hasGlobalErrors) {
    <p class="error">
    @form.globalError.message
    </p>
}

@helper.form(action = routes.Account.createAccount()) {
    <input type="text" name="email" placeholder="Your Email Address"/><br/>
    <input type="password" name="password" placeholder="Your Password"/><br/>

    <input type="text" name="fname" placeholder="Your First Name"/><br/>
    <input type="text" name="midname" placeholder="Your Middle Name"/><br/>
    <input type="text" name="lname" placeholder="Your Last Name"/><br/>

    <input type="text" name="dob" placeholder="Your Birthday"/><br/>
    <select name="gender" id="gender">
        <option value="1">Male</option>
        <option value="2">Female</option>
        <option value="3">Undecided</option>
    </select><br/>

    <input type="submit" value="Login" />
}

错误信息

value hasGlobalErrors is not a member of object views.html.account.form

谁能告诉我我的代码有什么问题?我对给定的例子感到沮丧。

编辑#1:

这是我到目前为止所做的:

型号:

public static UserAccount create(UserAccount data){
    UserAccount account = data;
    String salt     = BCrypt.gensalt();

    account.email   = data.email;
    account.salt    = salt;
    account.hash    = BCrypt.hashpw(data.hash, salt);

    account.save();
    return account;
}

控制器:

// HANDLES GET REQUEST
public static Result create(){
    return ok(
            views.html.account.form.render(userForm)
    );
}

// HANDLES POST REQUEST
public static Result createAccount(){
    Form<UserAccount> userForm = form(UserAccount.class).bindFromRequest();
    if(userForm.hasErrors()){
        return badRequest(views.html.account.form.render(userForm));
    }else{
        // UserAccount.create(userForm.get());
        // Logger.info("Username is: " + userForm.get().email);
        UserAccount data = userForm.get();
        return ok(data.email);
    }
}

视图/模板

@(form: Form[UserAccount])

@if(form.hasGlobalErrors) {
    <h1>Please fix the following error first</h1>
    <p>
        @form.globalError.message
    </p>
    <ul>
    @for(error <- form.globalErrors) {
        <li>@error.message</li>
    }
    </ul>
}

@helper.form(action = routes.Account.createAccount()) {
    <input type="text" name="email" placeholder="Your Email Address"/><br/>
    <input type="password" name="password" placeholder="Your Password"/><br/>

    <input type="text" name="fname" placeholder="Your First Name"/><br/>
    <input type="text" name="midname" placeholder="Your Middle Name"/><br/>
    <input type="text" name="lname" placeholder="Your Last Name"/><br/>

    <input type="text" name="dob" placeholder="Your Birthday"/><br/>
    <select name="gender" id="gender">
        <option value="1">Male</option>
        <option value="2">Female</option>
        <option value="3">Undecided</option>
    </select><br/>

    <input type="submit" value="Login" />
}

到目前为止,根据萤火虫,当我故意将错误放在表单上时,服务器将返回 badrequest。但是,模板不会显示错误。

如果我这样更改控制器:

public static Result createAccount(){
    Form<UserAccount> userForm = form(UserAccount.class).bindFromRequest();
    if(userForm.hasErrors()){
        return ok(userForm.errorsAsJson().toString());
    }else{
        // UserAccount.create(userForm.get());
        // Logger.info("Username is: " + userForm.get().email);
        UserAccount data = userForm.get();
        return ok("ok, I received POST data. That's all...");
    }
}

或者如果我在我的视图/模板上这样做

<pre>@form.errorsAsJson.toString()</pre>

它可以工作,并且会相应地打印错误。有人知道我在这里缺少什么吗?

编辑#2:

最适合我输出错误的方法是在我的视图/模板上执行此操作

@(form: Form[UserAccount])

@if(form.hasErrors) {
    <h1>Please fix the following error first</h1>

    <ul>
    @for(error <- form.errors) {
        <li>@error.toString</li>
    }
    </ul>
}

哪个输出这个:

(email,[ValidationError(email,error.required,[])])
(hash,[ValidationError(hash,error.required,[])])

由于我试图向用户显示适当的消息,因此该消息毫无用处。

【问题讨论】:

    标签: java playframework-2.0


    【解决方案1】:

    深入查看您的代码后,有两点需要注意:

    1. 在您的模板中,您需要为表单字段使用辅助标签。帮助程序将为您显示特定于字段的错误:http://www.playframework.com/documentation/2.2.x/JavaFormHelpers

    2. 我认为您的表单没有任何全局错误,这就是该代码没有显示任何内容的原因。

    试试帮助程序,看看是否适合你。

    【讨论】:

      【解决方案2】:

      您可以使用闪光灯范围:

      控制器:

      public Result create(){
         flash("error", "error msg");
         return badRequest(view.render());
      }
      

      查看:

      @flash.get("error")
      

      问题是您的表单没有“全局错误”,它的字段电子邮件和哈希有错误。不一样。

      您可以使用以下方法检查字段的错误:

      @if(form.error("email") != null) { }
      

      您可以在控制器上以 belor 身份触发全局错误:

      form.reject("global error");
      

      更多信息: http://www.playframework.com/documentation/2.0/JavaSessionFlash

      【讨论】:

      • 谢谢,我会试试的。其实我想避免使用闪存,我宁愿使用错误。只是该错误未注册为全局错误。
      【解决方案3】:

      我需要查看您的完整模板、控制器和路由文件。我认为问题在于您的模板文件顶部没有方法签名,如下所示:

      @(userForm: Form[User])
      

      修复模板后,您会遇到另一个问题,即您没有将表单传递给“badRequest()”流程中的视图模板。尝试将您的控制器操作更改为如下所示:

      public static Result createAccount(){
          Form<UserAccount> userForm = form(UserAccount.class).bindFromRequest();
          if(userForm.hasErrors()){
              return badRequest(views.html.createUserTemplate.render(userForm));
          }else{
              UserAccount.create(userForm.get());
              Logger.info("Username is: " + userForm.get().email);
              return ok("ok, I recived POST data. That's all...");
          }
      }
      

      您的全局错误代码大部分是正确的,应该如下所示:

      @if(userForm.hasGlobalErrors) {
        <ul>
        @for(error <- userForm.globalErrors) {
          <li>@error.message</li>
        }
        </ul>
      }
      

      【讨论】:

      • 请看我的编辑,我还是有问题。干杯
      猜你喜欢
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      相关资源
      最近更新 更多