用变量干掉YAML

时间:2014-09-15 16:18:04

标签: yaml

正如你所看到的,这不是很干:

en:
  dashboard_policy:
    statistics?: 'You cannot access the statistics panel because you are not an admin!content'
    forums?: 'You cannot access the forums panel because you are not an admin!'
    browser?: 'You cannot access the browser panel because you are not an admin!'
    users?: 'You cannot access the users panel because you are not an admin!'

在YAML中可以有方法或变量,以便不再重复自己吗?

2 个答案:

答案 0 :(得分:1)

使用锚点和别名节点

您无法直接在YAML中使用变量,但您可以将它们嵌入字符串中,以便程序代码进行插值。但是,您可以使用锚点和别名节点对YAML进行大量干扰。例如:

en:
  warn_not_admin: &warn_not_admin
    "You can't access this panel because you aren't an admin."                        
  dashboard_policy:
    statistics?: *warn_not_admin
    forums?:     *warn_not_admin
    browser?:    *warn_not_admin
    users?:      *warn_not_admin

这定义了一个名为 warn_not_admin 的锚,将其分配给:warn_not_admin键的值,然后在:dashboard_policy键的每个子元素中引用该节点。

请注意,在这种特殊情况下,我们会重复使用相同的消息。通过假设您的用户知道他们正在处理哪个面板,这会增加一些干扰。如果他们确实需要被告知消息所指的面板,在代码中使用插值(如this other answer所述)可能是一个合理的选择。

答案 1 :(得分:1)

除了重用整个值或使用%{variable}表示法将变量传递给转换之外,您不能在yml中使用变量。

所以在你的情况下我会写一些类似的东西:

en:
  dashboard_policy:
    access_denied: 'You cannot access the %{location} because you are not an admin!'
  locations:
    forums: "forums panel"
    ...

然后在你看来,即:

<%= t('dashboard_policy.access_denied', location: t('locations.forums')) %>