HAML 如果定义?评估中间人数据文件中是否存在条目的语句

HAML If defined? statement evaluating whether entry exists in Middleman data file

我有一个 Middleman data file data/testimonials.yaml:

tom:
  short: Tom short
  alt: Tom alt (this should be shown)
  name: Thomas

jeff:
  short: Jeff short
  alt: Jeff alt (this should be shown)
  name: Jeffrey

joel:
  short: Joel short (he doesn't have alt)
  name: Joel

它可以有默认的 "short" 文本或替代文本。对于一些推荐,我想在某些页面上使用替代文本,而在其他页面上使用 "short" 文本。

在我的 test.haml 中,我正在尝试编写 HAML 语句来检查替代文本是否存在。如果是,则应将其插入;如果没有,则应使用标准文本。

以下示例显示 data.testimonials[person].alt 正确引用数据中的信息,因为它可以手动插入。但是,当我在 if defined? 语句中使用相同的变量时,它永远不会 returns 为真。

Not-working 'if' way, because 'if defined?' never evaluates to true:
- ['tom','jeff','joel'].each do |person|
    %blockquote
        - if defined? data.testimonials[person].alt
            = data.testimonials[person].alt
        - else
            = data.testimonials[person].short

Manual way (code above should return exactly this):
- ['tom','jeff'].each do |person|
    %blockquote
        = data.testimonials[person].alt

- ['joel'].each do |person|
    %blockquote
        = data.testimonials[person].short

结果是这样的:

我做错了什么?有什么方法可以使用条件语句来检查数据是否存在?

defined? 并没有真正做到你想要的。您可以将其保留,if 的计算结果将仅为 false,因为 alt 的值将为 nil

所以就把

- ['tom','jeff','joel'].each do |person|
    %blockquote
        - if data.testimonials[person].alt
            = data.testimonials[person].alt
        - else
            = data.testimonials[person].short

或者你实际上可以写得更短:

- ['tom','jeff','joel'].each do |person|
    %blockquote
        = data.testimonials[person].alt || data.testimonials[person].short

我真的不确定,为什么 defined? 不起作用,但通常你不需要检查它的方法,因为未定义的值只会给你一个 nil 在中间人。