在scala模板中从application.conf访问布尔值

6

我在application.conf中有一个布尔参数:

system.debugMode = false

我正在尝试在scala模板中根据此值进行分支:

<p>Debug mode parameter value: @Play.current.configuration.getBoolean("system.debugMode")</p>

@if(Play.current.configuration.getBoolean("system.debugMode")) {
    <p>Debug mode on</p>
} else {
    <p>Debug mode off</p>
}

我期望看到的输出是“调试模式关闭”,但实际呈现的是:
Debug mode parameter value: false

Debug mode on

我这里是否存在一个类型转换问题?看起来我的数值从配置文件中返回的数值是“false”,但@if表达式却将其评估为true。我注意到API文档指出getBoolean方法返回一个包含布尔值的选项,所以可能不能将其放入if评估中?


1
一个选项不是布尔值。为了得到你想要的结果,你需要确定该选项是否包含布尔值,并决定如果包含或不包含该值时如何操作。例如:@if(Play.current.configuration.getBoolean("system.debugMode").getOrElse(true)) { - 这个例子假设一个值为true,除非特别设置。如果你想假设false,除非设置,请改为 getOrElse(false) - Shadowlands
1个回答

6

play.api.Configuration.getBoolean()返回一个Option[Boolean]类型的值。在Play的模板引擎中,如果一个Option包含Some(...),即使这个选项包含了Some(false),也会始终在if条件语句中被视为真。

为了测试,我已经创建了一个所有可能的Option[Boolean]值,并在模板中使用@if(...)测试它们所产生的结果。

Controller:

object Application extends Controller {
  def index = Action {
    val a: Option[Boolean] = None
    val b: Option[Boolean] = Some(true)
    val c: Option[Boolean] = Some(false)
    Ok(views.html.index(a, b, c))
  }
}

模板:

@(a: Option[Boolean], b: Option[Boolean], c: Option[Boolean])

@if(a) { a }
@if(b) { b }
@if(c) { c }

运行它会输出"b c"

如果您的config参数有默认值,请使用getOrElse获取Option的值:

Play.current.configuration.getBoolean("system.debugMode").getOrElse(defaultValue)

如果您确信配置参数始终存在(或者如果未设置该参数,您的模板报告调试模式已关闭),您还可以扁平化选项:
Play.current.configuration.getBoolean("system.debugMode").flatten

谢谢,这正是我需要的语法。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接