Как я могу условно обернуть некоторый контент HAML в тег? - PullRequest
32 голосов
/ 30 августа 2011

Как я могу использовать условие, чтобы решить, выводить ли окружающий тег в HAML?Я пытаюсь создать СУХУЮ версию кода ниже.

- if i_should_link 
  %a{:href => url}
   .foo
     .block
       .of  
         .code
- else
  .foo
    .block
      .of  
        .code

Ответы [ 2 ]

31 голосов
/ 30 августа 2011

Вы можете использовать частичное.

foo.html.haml

- if i_should_link
  %a{:href => url}
    = render 'bar'
- else
  = render 'bar'

_bar.html.haml

.foo
  .block
    .of
      .code

Изменить: Или вы можете использовать контент для, я думаю, это лучше, потому что он хранит все это в одном файле.

- if i_should_link
  %a{:href => url}
    = yield :foobar
- else
  = yield :foobar

- content_for :foobar do
  .foo
    .block
      .of
        .code
22 голосов
/ 22 декабря 2011

Я думаю, что предложение Одина использовать частичное, вероятно, является лучшим в большинстве ситуаций.

Однако в качестве альтернативного решения я нашел нить , где Натан Вайзенбаум предложил определить этот метод:

def haml_tag_if(condition, *args, &block)
  if condition
    haml_tag *args, &block
   else
     yield
   end
end

Все, что находится в блоке, будет всегда отображаться , но тег переноса будет отображаться или не основываться на условии.

Вы бы использовали его следующим образом:

- haml_tag_if(planning_to_mail?, :div, :id => 'envelope') do
   %p I'm a letter

Если planning_to_mail? оценивает true, вы получите:

<div id="envelope">
  <p>I'm a letter</p>
</div>

Если оно оценивает false, вы получите:

<p>I'm a letter</p>

Он высказал идею добавить это к Haml::Helpers, но этого , похоже, еще не произошло .

...