如何只在同一时间写“文本”并检查path_info是否包含’A’?

- if !request.path_info.include? 'A' %{:id => 'A'} "Text" - else "Text" 

“文字”写了两次。 如何只写一次并同时检查path_info是否包含’A’?

有两种方法可以做到这一点。 使用partial或使用content_for块

如果“Text”更长,或者是一个重要的子树,您可以将其提取为部分。 这会让你的代码干掉一点。 在给出的例子中,这似乎有点矫枉过正。

在这种情况下更好的方法是使用content_for块,如下所示:

 - if !request.path_info.include? 'A' %{:id => 'A'} =yield :content - else =yield :content -content_for :content do Text 

这里我们屈服于两个地方的content_for块,无需复制“Text”。 我会说在这种情况下这是你最好的解决方案。

您可以使用此构造使属性成为条件:

 %{:id => ('A' if request.path_info.include? 'A')} "Text" 

如何将其保存在局部变量中呢?

 - text = "Text" - if !request.path_info.include? 'A' %div{:id => 'A'} = text - else = text 

它并不理想,但您可以将HTML与HAML结合使用。 我这样做的方式是:

 - if !request.path_info.include? 'A' 
Text - if !request.path_info.include? 'A'

这对于这样的小文本来说很麻烦,但是当Text是一个大型代码块时,你想要用div包装它,它可以真正帮助你关注DRY。

简短的回答是你不能。 HAML是一种缩进特定格式,因此它不能让您能够在不重复的情况下执行您想要的操作,因为在解析时这两个条件是不同的路径。