2012-12-20 2 views
16

スリム-LANGのであれば、他のネストされたコード

私は今、どのようにすることができ、次の

- if current_user 
    .title 
- else 
    .title_else 

をしています上記のクラスの1つにネストされるHTMLを記述しますか? ifの条件とelseの条件の両方でHTMLを記述する必要がありますか?

上記のクラスのいずれかにネストする必要があるHTMLは、さらに右に意図する必要があるためです。しかし、私がそれをさらに正しくしようとするなら、それは他の条件の下にも含まれています。私はこれに今どのようにアプローチしていますか?

答えて

28

ここに1つのライナーです。しかし、便利な別の方法があります。

captureを使用して、HTMLをローカル変数にレンダリングし、そのコンテンツを好みのコントロール構造内に埋め込むことができます。あなたのラッピング内容が少し複雑だったのであれば、あなたはこれを行うだろう:

- shared_content = capture do 
    div This is displayed regardless of the wrapper 
- if current_user 
    | You're logged in! 
    .title 
    = shared_content 
- else 
    | You're not logged in! 
    .title_else 
    = shared_content 

可能なURLがあります場合、私は多くの場合、リンクでコンテンツをラップする際に使用します:

- image = capture do 
    img src=image_url 
- if url.blank? 
    = image 
- else 
    a href=url = image 
+3

非常に良い。補間は必要ありません。 '.thing class =(true? 'large-menu': 'medium-menu')' – obfk

2

1)作成したdivの両方に異なるHTMLを書き込む必要があります。あなたがそれが異なっていることを望まないなら、if声明の必要はありません!

2)私は本当にあなたのポイントを理解していなかったが、このコードは私と一緒に完璧にうまく働い:

- if true 
    .title 
    h4 True is true! 
- else 
    .title_else 
    h4 True is not true! 

このコードは、その内のテキストTrue is true!.titleh4のクラスにdivを示しました。 。

編集:さて、あなたはどういう意味ですか?これはh4をレンダリングしないので、これはではないのようなことをすることが可能です!

- if true 
    .title 
- else 
    .title_else 

    h4 Same content, different class 

パーシャルをレンダリングしてから、そのパーシャルを両方の条件の中からレンダリングするヘルパーを作成することをお勧めします。つまり、その部分を書き、それを2回呼び出すだけです。あなたがちょうど2つの属性の間でトグルしているので、

.thing class=(current_user ? 'large-menu' : 'medium-menu') 
    h4 Same content, different class 
+0

私質問私はブロックとelseブロックの両方に同じコードブロックを持っています。私は条件に基づいて別のクラスを適用したいだけです。コードの繰り返しを避けるより良い方法はありますか? – nik7

15

Tiago Franco's answerは、あなたの目的のために、確かに十分なものである:

- if true 
    .title 
    = render 'footer' 
- else 
    .title_else 
    = render 'footer' 
関連する問題