在 YAML 字符串中嵌入 YAML 别名

Dan*_*rne 6 ruby yaml ruby-on-rails

我正在尝试在我的 YAML 文件中声明一个别名,并稍后在字符串中使用它。例如,我声明:

en:
  support_email: &support_email "helpme@foo.com"
  support_text: "Having a problem? Reach out to <a href="*support_email">*support_email</a>"
Run Code Online (Sandbox Code Playgroud)

并希望en.support_text评估为Having a problem? Reach out to <a href="helpme@foo.com">helpme@foo.com</a>

有没有办法做到这一点?对于上下文,这是在 RoR 项目中。

谢谢您的帮助!

3li*_*t0r 3

您无法使用 YAML 本身执行此操作,因为规范特异性排除了以下内容:

\n\n
\n

7.1. 别名节点

\n\n

先前序列化节点的后续出现将 显示别名节点节点的第一次出现必须由锚点标记,以允许后续出现的节点显示 别名节点。

\n\n

别名节点由 \xe2\x80\x9c*\xe2\x80\x9d 指示符表示。别名是指具有相同锚点的最近的前一个节点别名节点使用文档中以前未出现过的锚点会产生错误。指定一个未被任何别名节点使用的锚点并不是错误 。

\n\n

请注意,别名节点不得指定任何属性内容,因为这些属性或内容已在节点第一次出现时指定

\n\n

例 7.1。别名节点

\n\n
First occurrence: &anchor Foo\nSecond occurrence: *anchor\nOverride anchor: &anchor Bar\nReuse anchor: *anchor\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

但是,您可以将变量插值与 I18n 一起使用。以你的例子来说,这看起来像:

\n\n
en:\n  support_email: \'helpme@foo.com\'\n  support_text: \'Having a problem? Reach out to <a href="mailto:%{support_email}">%{support_email}</a>\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么在你看来:

\n\n
<%= t(\'support_text\', support_email: t(\'support_email\')) %>\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,上面的内容并未标记为 HTML 安全,这可以通过添加_html后缀将最后一个元素更改为html. 或者,您可以.html_safe自己调用结果或使用<%== ... %>(而不是<%= ... %>) 或作为原始内容输入<%= raw ... %>

\n\n

如果您想更动态地分配变量,请考虑更改 YAML 文件的结构。

\n\n
en:\n  support:\n    constants:\n      message: \'Having a problem?\'\n      phone: \'0123456789\'\n      email: \'helpme@foo.com\'\n    help_messages:\n      phone:\n        text: \'%{message} Call us on %{phone}.\'\n        html: \'%{message} Call us on %{phone}.\'\n      email:\n        text: \'%{message} Reach out to %{email}.\'\n        html: \'%{message} Reach out to <a href="mailto:%{email}">%{email}</a>.\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在做这样的事情:

\n\n
<% vars = t(\'support.constants\') %>\n<%= t(\'support.help_messages.email.html\', vars) %>\n
Run Code Online (Sandbox Code Playgroud)\n\n

您也可以将其移至您自己的助手:

\n\n
def t_with_constants(base, path, options = {})\n  options = t("#{base}.constants").deep_merge(options)\n  t("#{base}.#{path}", options)\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

它允许您使用:

\n\n
<%= t_with_constants(\'support\', \'help_messages.email.html\') %>\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,如果您不在视图或助手中,您可能需要使用它I18n.t。它不会提供所ActionView::Helpers::TranslationHelper#t提供的生活质量改进(例如将字符串标记为 HTML 安全)。

\n\n

当然,您可以对此进行自己的修改,但我建议您查看I18n 指南和下面的文档ActionView::Helpers::TranslationHelper#translate以获取更多信息。

\n