- if !request.path_info.include? 'A'
%{:id => 'A'}
"Text"
- else
"Text"
“文字”写了两次。如何只写一次并同时检查path_info是否包含'A'?
答案 0 :(得分:4)
有两种方法可以做到这一点。使用部分,或使用 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”。我会说这是你最好的解决方案。
答案 1 :(得分:2)
您可以使用此构造使属性成为条件:
%{:id => ('A' if request.path_info.include? 'A')}
"Text"
答案 2 :(得分:2)
如何将其保存在局部变量中呢?
- text = "Text"
- if !request.path_info.include? 'A'
%div{:id => 'A'}
= text
- else
= text
答案 3 :(得分:1)
这不太理想,但您可以将HTML与HAML结合使用。我这样做的方式是:
- if !request.path_info.include? 'A'
<div id="A">
Text
- if !request.path_info.include? 'A'
</div>
这对于这样的小文本来说很麻烦,但是当Text
是一个大型代码块时,你想要选择用div
包装,它可以真正帮助你关注DRY。
答案 4 :(得分:1)
简短的回答是你不能。 HAML是一种缩进特定的格式,因此它不能让你能够做到你想要的而不重复,因为在解析时这两个条件是不同的路径。