You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Play框架Scala模板IF块多AND/OR条件使用及执行异常问题

问题分析与解决方案

你的问题出在Scala模板中对Map.get返回值的处理上——在Scala里,formData.get("key")返回的是Option[String]类型,而非直接的String,这导致你直接调用.equals()的比较逻辑完全错误。

修正后的代码方案

推荐使用Scala Option类型的contains方法来做条件判断,这是最简洁且安全的方式:

@(formData: Map[String, String] ) 
<!DOCTYPE html> 
<html> 
<head lang="sv"> 
    <meta charset="UTF-8"> 
    <meta name="viewport" content="width=device-width"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 
    <title>Java Play - Scala Template</title> 
</head> 
<body> 
    @if(formData.get("nockOutRuleStatus1").contains("SUBMITTED") && formData.get("nockOutRuleStatus2").contains("APPROVED")){
        <button type="button" class="btn btn-default btn-lg hide-element" id="openSuccessModalBtn" data-toggle="modal" data-target="#successModal">Success</button>
    } 

    @if(formData.get("nockOutRuleStatus1").contains("REJECTED") || formData.get("nockOutRuleStatus2").contains("AUTO-REJECTED")){
        <button type="button" class="btn btn-default btn-lg hide-element" id="openErrorModalBtn" data-toggle="modal" data-target="#errorModal">Error</button>
    } 
</body> 
</html>

其他可选方案

如果你需要处理键不存在的默认情况,可以用getOrElse提前取出值,让代码更清晰:

@(formData: Map[String, String] ) 
<!DOCTYPE html> 
<html> 
<head lang="sv"> 
    <meta charset="UTF-8"> 
    <meta name="viewport" content="width=device-width"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 
    <title>Java Play - Scala Template</title> 
</head> 
<body> 
    @val status1 = formData.getOrElse("nockOutRuleStatus1", "")
    @val status2 = formData.getOrElse("nockOutRuleStatus2", "")
    
    @if(status1 == "SUBMITTED" && status2 == "APPROVED"){
        <button type="button" class="btn btn-default btn-lg hide-element" id="openSuccessModalBtn" data-toggle="modal" data-target="#successModal">Success</button>
    } 

    @if(status1 == "REJECTED" || status2 == "AUTO-REJECTED"){
        <button type="button" class="btn btn-default btn-lg hide-element" id="openErrorModalBtn" data-toggle="modal" data-target="#errorModal">Error</button>
    } 
</body> 
</html>

为什么原代码不生效?

在Scala中,Map.get(key)会返回Option[String]:

  • 当键存在时,返回Some("对应的值")
  • 当键不存在时,返回None

你原代码中调用.equals("SUBMITTED"),本质是在比较Some("SUBMITTED")这个Option对象和字符串"SUBMITTED",两者类型完全不同,所以equals永远返回false,导致第一个if块永远不会执行。

内容的提问来源于stack exchange,提问作者Kiranmoy Pradhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:58:58