我不确定我是否正确地表述了标题中的问题,但情况就是这样。当表字段(模式)仅在运行时可用时,我需要创建一个带有抢劫的动态表。所以通常,当架构在编译时已知时,我会做这样的事情:
<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”——一个在另一个里面,对吗?所以,从经验上讲,这将是一个内部和外部循环/映射,对吗?
我将如何在处理程序中执行此操作?
谢谢。
更新:
忘了提一下,可以在运行时从数据库中检索模式,并且可以作为:
Table { tableName :: Text
, tableFields :: [Text]
}
但它并不是真正需要的,因为数据来自无模式的 mongodb 并转换为 Map:
fromList [("FieldName1","Value1"),("FieldName2","Value2"),("FieldName3","Value3")]
更新2:
我尝试了建议的示例,但没有成功,我只是将所有数据放在一个列中。我只需要一个简单的内部和外部循环来动态生成字段和行。再简单不过了:
<% @rows.each do |row| %>
<tr>
<% row.each do |field| %>
<td> <%= field %> </td>
<% end %>
</tr>
<% end %>
更新3:
经过一个漫长的周末休息后,我终于破解了它......这是一个例子。它是特定于 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"