Я не уверен, правильно ли сформулировал вопрос в названии, но вот ситуация .. Мне нужно создать динамическую таблицу с помощью 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"
Спасибо большое, все еще не работает. Я играл с ним в течение дня - не повезло. Я, очевидно, что-то не так. В вашем примере, как я вижу, внутри одной строки генерируются только внутренние поля цикла. Теперь внутренний «цикл» должен работать с внешним циклом, который генерирует строки в таблице. Я просто не знаю, как соединить их вместе. Поэтому внутренние «mapSplices» должны создать строку, а внешние «mapSplices» должны создать таблицу. –
Хорошо, я переписал ответ. Попробуй это. – mightybyte
спасибо. Я тоже взломал его ...Даже ваш первый пример очень помог мне, у меня появилась идея о том, как вложить функции «runChildren». Еще раз спасибо. –