我怎么能只写一次“Text”并同时检查path_info是否包含'A'?

时间:2011-02-15 21:00:51

标签: ruby haml

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

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

5 个答案:

答案 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是一种缩进特定的格式,因此它不能让你能够做到你想要的而不重复,因为在解析时这两个条件是不同的路径。