2017-08-04 10 views
1

に存在するかどうかを評価する文は私が持っているMiddleman data filedata/testimonials.yamlHAML定義されている場合?エントリは仲介データファイル

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 

それはデフォルトの「短い」テキストまたは代替テキストのいずれかを持つことができます。いくつかの証言では、他の人に「短い」テキストを使用しながら、いくつかのページに代替テキストを使用したい。

私のtest.hamlでは、代替テキストが存在するかどうかをチェックするHAMLステートメントを作成しようとしています。そうであれば、挿入する必要があります。そうでない場合は、代わりに標準テキストを使用する必要があります。

次の例は、手動で挿入できるため、data.testimonials[person].altがデータの情報を適切に参照していることを示しています。しかし、同じ変数をif defined?ステートメントで使用すると、決してtrueを返しません。

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 

結果がこれです:私は間違って何をやっている

?データが存在するかどうかをチェックする条件文を使用する方法はありますか?

答えて

1

defined?あなたがしたいことは本当にありません。あなたはちょうどそれを離れて放置することができます、ifはの値がnilになるので、falseと評価されます。

は、だから

- ['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を与えるので、それをチェックするメソッドが必要です。

+0

これは素晴らしい作品で、私は短いバージョンが大好きです!このソリューションは任意の数のORステートメントで動作するので、今ではさらにバリエーションを導入できます。 – Rafal

+0

@Rafalあなたは納得しています。私は理解したいと思っています。どうして正確に定義されていますか? –

+0

これはうまくいきません。私はこの短いバージョンについて知りませんでした:)私はRubyの条件文がどのように動作するかについて何か不足していると思っていましたが、これは明らかにMiddlemanのバグです。 – Rafal

関連する問題