为 Play Framework 2.3 中的控制器操作生成 link

Generating a link to a controller action in Play Framework 2.3

我正在开发一个 Play 应用程序,需要在调用控制器操作的混合 Scala-HTML 视图中生成 links。我发现 this 几年前的问题与我的情况相似,但提供的答案对我不起作用。

这些元素是在循环中生成的,因此我无法手动将参数插入到控制器操作中,但我尝试过的任何操作都没有奏效。这是我现在的行:

ID: @{var fhirID = <processing for ID>; <a href='@routes.Users.fhirUserDetails(fhirID)'>fhirID</a>}

我之前 link 编辑的问题的公认答案也有效地使用了这个结构:

<a href='@routes.Application.show("some")'>My link with some string</a>

我的问题是双重的:

1) 如何将变量 fhirID 传递给控制器​​操作?我生成的 link 仅包含文本 "fhirID" 而不是语句第一部分生成的内容。

2) @routes.Users 语法是否正确?当我单击生成的 link 时,它实际上会尝试在 /myapp/@routes.Users.fhirUserDetails(fhirID)

呈现页面

我意识到我可能遗漏了一些非常基本的东西 - 感谢您的任何建议!

问题似乎不是 @routes 语法(您完全正确),而是 Twirl 引擎看不到代码在哪里结束和 HTML 开始(或类似的东西)的情况无论如何...)

你包含的那一行,它有一个 var 和一个分号,这让我怀疑这一点,而且当我使用这种风格时我已经能够重现这个问题。

我的建议是使用 @defining helper 而不是 var 来获取在您的链接中使用的范围变量,如下所示:

ID: @defining(<processing for ID>) { fhirID => 
  <a href='@routes.Users.fhirUserDetails(fhirID)'>fhirID</a>
}

您可以根据需要尽可能深地嵌套 @defining 块,但如果有很多逻辑,调用可重用块可能会更好。我认为这种风格使模板更具可读性,而且在某种程度上看起来更像 "real Scala" :-)