Как я могу сделать, чтобы написать «Текст» только один раз и в то же время проверить, включает ли path_info «А»? - PullRequest
5 голосов
/ 16 февраля 2011
- if !request.path_info.include? 'A'
  %{:id => 'A'}
   "Text"
- else
  "Text"

«Текст» пишется дважды. Как я могу сделать, чтобы написать это только один раз и в то же время проверить, включает ли path_info «A»?

Ответы [ 5 ]

4 голосов
/ 06 января 2012

Есть два способа сделать это.Используя частичное или content_for блок :

Если «Текст» был длиннее или являлся значительным поддеревом, вы можете извлечь его в частичное.Это немного высушит ваш код.В приведенном примере это выглядит как перебор.

Лучшим способом в этом случае будет использование блока content_for, например:

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

-content_for :content do
  Text

Здесь мы уступаем блоку content_for вв обоих местах, устраняя необходимость дублирования «Текст».Я бы сказал, что в этом случае это ваше лучшее решение.

2 голосов
/ 16 февраля 2011

Как насчет простого сохранения его внутри локальной переменной?

- text = "Text"     
- if !request.path_info.include? 'A'
  %div{:id => 'A'}
    = text
- else
  = text
2 голосов
/ 16 февраля 2011

Вы можете сделать атрибут условным с помощью этой конструкции:

%{:id => ('A' if request.path_info.include? 'A')}
  "Text"
1 голос
/ 16 июня 2011

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

1 голос
/ 16 июня 2011

Это не идеально, но вы можете использовать HTML с HAML. Вот как я это сделал:

- if !request.path_info.include? 'A'
  <div id="A">
Text
- if !request.path_info.include? 'A'
  </div>

Это немного запутанно с таким небольшим текстом, но когда Text - это большой блок кода, который вы хотите дополнительно обернуть div, это действительно может помочь вам следовать за DRY.

...