2013-12-25 2 views
-4

У меня есть массив, который загружается из базы данных. Он находится в следующем формате:Как предотвратить использование переменных печати в качестве помощника?

["aaa:bbb", "ccc:ddd"] 

И нужно построить список определений HTML из массива:

<dl> 
    <dt>aa</dt> 
    <dd>bb</dd> 
    <dt>cc</dt> 
    <dd>dd</dd> 
</dl> 

Выглядит просто, не так ли?

Я хотел создать помощник, который будет проходить через массив, разделить элементы на :-й лет, и вложить их в тегах:

<%= build_def_list(array) %> 

Однако, я столкнулся с проблемой. А именно, когда я вызываю хелпера Rails из представления, все его содержимое переходит к выходу. То есть, когда я объявляю переменную внутри тела функции и присваиваю ей значение, переменная мгновенно переходит к выходу. Есть ли способ подавить печать всего внутри тела функции?

UPD

Серьезно, как сделать это с помощником ..

<dl> 
    <% deflist.each do |item| %> 
      <dt><%= item.split(':').at(0) %>:</dt> 
      <dd><%= item.split(':').at(1) %></dd> 
    <% end %> 
</dl> 
+1

Каково правило, которое извлекает '' aa "и' "bb" 'из' "aaa: bbb" 'и так далее? – sawa

+0

"aaa" == dt, "bbb" == dd. Простое разделение на: –

+1

Это не то, что показывает ваш код. – sawa

ответ

1

Попробуйте это для вашего помощника:

def build_def_list(array) 
    content_tag :dl do 
    array.map { |e| e.split(':') }.collect do |dt, dd| 
     content_tag :dt, dt 
     content_tag :dd, dd 
    end 
    end 
end 

Затем в вид вызова <%= build_def_list(array) %>

Дополнение: (Чтобы отфильтровать то, что для печати)

Благодаря @Arup, который напомнил мне дополнительную проверку:

Как это предотвратить бы печатать все?

Для печати только определенные элементы, можно отфильтровать входной массив первого удаления каких-либо элементов, нужно удалить и затем использовать результирующий массив для построения content_tag S как:

def build_def_list(array) 
reject_keys = ['ccc'] 
array = array.map { |e| e.split(':') }.reject { |e| reject_keys.include? e[0] } 

content_tag :dl do 
    array.collect do |dt, dd| 
     content_tag :dt, dt 
     content_tag :dd, dd 
    end 
    end 
end 

Это первый расколоть элементы array на : и удалите все элементы, если они найдены в массиве reject_keys. Результат затем используется для построения content_tag с.

+0

Как это могло бы предотвратить печать всего? –

+0

@ArupRakshit, спасибо за это. Я этого раньше не видел. Обновлен мой ответ, чтобы включить фильтрацию. – vee

+0

Хорошая попытка! Большое спасибо :) –

 Смежные вопросы

  • Нет связанных вопросов^_^