Подтвердить что ты не робот

Как я могу условно обернуть некоторое содержимое HAML в тег?

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

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

Ответ 1

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

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

Ответ 2

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

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

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, но похоже, еще не произошел.