Как я могу условно обернуть некоторое содержимое HAML в тег?
Как я могу использовать условие, чтобы решить, выводить ли окружающий тег в HAML? Я пытаюсь создать DRY версию кода ниже.
- if i_should_link
%a{:href => url}
.foo
.block
.of
.code
- else
.foo
.block
.of
.code
Ответы
Ответ 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
, но похоже, еще не произошел.