2012-12-06 1 views
2

Я не уверен, правильно ли сформулировал вопрос в названии, но вот ситуация .. Мне нужно создать динамическую таблицу с помощью heist, если только поля таблицы (схемы) доступны во время выполнения. Так обычно, когда схема известна во время компиляции, я хотел бы сделать что-то вроде этого:Snap: внутренняя/внешняя петля с heist

<table> 
    <row-splice> 
    <tr> 
     <td> <field1/> </td> 
     <td> <field2/> </td> 
     <td> <field3/> </td> 
    </tr> 
    </row-splice> 
</table> 

То есть, когда я знаю, количество полей и их имена во время компиляции. Я понимаю, как обрабатывать все это в обработчике с помощью «runChildrenWith», «mapSplices» и т. Д.

Теперь я в ситуации, когда количество полей и схемы доступно только во время выполнения. Так шаблон грабежа, как я понимаю, будет выглядеть следующим образом:

<table> 
    <row-splice> 
    <tr> 
     <field-splice> 
     <td> <field/> </td> 
     </field-splice> 
    </tr> 
    </row-splice> 
</table> 

Я действительно застрял с тем, как реализовать его внутри обработчика. Я предполагаю, что мне нужно будет делать «mapSplices» дважды - один внутри другого, правильно? Итак, эмпирически говоря, это будет внутренний и внешний цикл/карта, верно?

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

Спасибо.

Update:

Забыл упомянуть, что схема может быть получена во время выполнения из БД и доступны как:

Table { tableName :: Text 
     , tableFields :: [Text] 
     } 

Но это на самом деле не нужны, как данные поступают из схемы менее MongoDB и преобразованное к карте:

fromList [("FieldName1","Value1"),("FieldName2","Value2"),("FieldName3","Value3")] 

Update2:

I попробовал предложенные примеры без везения, я просто получаю все свои данные в одном столбце. Все, что мне нужно, это простой внутренний и внешний цикл для динамического создания полей и строк. Это не может быть проще, чем это:

<% @rows.each do |row| %> 
    <tr> 
    <% row.each do |field| %> 
    <td> <%= field %> </td> 
    <% end %> 
    </tr> 
<% end %> 

Update3:

я, наконец, взломали после долгого уикэнда отдыха ... Вот пример. это mongodb специфический, и я буквально просто скопировал и вставлял его. Но если кто-то застрянет с внутренними/внешними петлями, я думаю, это было бы полезно.

showTableH :: AppHandler() 
showTableH = do 
    table <- liftIO $ fetchTable tname 
    docs <- liftIO $ getColList tname 
    let rowSplice doc = mapSplices (\f -> fieldSplice $ T.pack $ at f doc) (tableFields table) 
    where fieldSplice field = runChildrenWithText [("field", field)] 
    let listRowsSplice = mapSplices (\d -> runChildrenWith [("fields", rowSplice d)]) docs 
    heistLocal (bindSplices [("rows", listRowsSplice)]) $ render "show-table" 

ответ

2

Я думаю, что ключ здесь использует mapSplices вместе с runChildrenWith. Я думаю, что это будет выглядеть примерно так:

rowSplice = do 
    rows <- lift getRowsFromDB 
    mapSplices (\row -> runChildrenWith [("field-splice", fieldSplice row)]) rows 
fieldSplice rowId = do 
    fields <- lift $ getFieldsFromDB rowId 
    mapSplices (\f -> runChildrenWith [("field", fieldToText f)]) fields 
+0

Спасибо большое, все еще не работает. Я играл с ним в течение дня - не повезло. Я, очевидно, что-то не так. В вашем примере, как я вижу, внутри одной строки генерируются только внутренние поля цикла. Теперь внутренний «цикл» должен работать с внешним циклом, который генерирует строки в таблице. Я просто не знаю, как соединить их вместе. Поэтому внутренние «mapSplices» должны создать строку, а внешние «mapSplices» должны создать таблицу. –

+0

Хорошо, я переписал ответ. Попробуй это. – mightybyte

+0

спасибо. Я тоже взломал его ...Даже ваш первый пример очень помог мне, у меня появилась идея о том, как вложить функции «runChildren». Еще раз спасибо. –