如何只在同一时间写“文本”并检查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是一种缩进特定格式,因此它不能让您能够在不重复的情况下执行您想要的操作,因为在解析时这两个条件是不同的路径。