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 项目中。
谢谢您的帮助!
您无法使用 YAML 本身执行此操作,因为规范特异性排除了以下内容:
\n\n\n\n\n7.1. 别名节点
\n\n先前序列化节点的后续出现将 显示为别名节点。节点的第一次出现必须由锚点标记,以允许后续出现的节点显示 为别名节点。
\n\n别名节点由 \xe2\x80\x9c*\xe2\x80\x9d 指示符表示。别名是指具有相同锚点的最近的前一个节点。别名节点使用文档中以前未出现过的锚点会产生错误。指定一个未被任何别名节点使用的锚点并不是错误 。
\n\n请注意,别名节点不得指定任何属性或内容,因为这些属性或内容已在节点第一次出现时指定。
\n\n例 7.1。别名节点
\n\nRun Code Online (Sandbox Code Playgroud)\nFirst occurrence: &anchor Foo\nSecond occurrence: *anchor\nOverride anchor: &anchor Bar\nReuse anchor: *anchor\n
但是,您可以将变量插值与 I18n 一起使用。以你的例子来说,这看起来像:
\n\nen:\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 ... %>
。
如果您想更动态地分配变量,请考虑更改 YAML 文件的结构。
\n\nen:\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\ndef 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 安全)。
当然,您可以对此进行自己的修改,但我建议您查看I18n 指南和下面的文档ActionView::Helpers::TranslationHelper#translate
以获取更多信息。