haskell - 快照 : inner/outer loops with heist

标签 haskell haskell-snap-framework

我不确定我是否正确地表达了标题中的问题,但情况是这样的.. 当表字段(架构)仅在运行时可用时,我需要创建一个带有抢劫的动态表。 所以通常,当架构在编译时已知时,我会做这样的事情:

<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"

最佳答案

我认为这里的关键是使用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

关于haskell - 快照 : inner/outer loops with heist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13743000/

相关文章:

haskell - Haskell和Webframeworks

haskell - 为什么 `(fmap . fmap) sum Just [1, 2, 3]` 中的类型有效?

Haskell 模式匹配 "diverge"和 ⊥

haskell - 需要帮助理解 Haskell 中的 (\x -> )

haskell - 使用 monad 转换器和恒等 monad 派生基础 monad

function - Haskell - 将函数作为参数传递

javascript - 动态修改捕捉值

haskell-snap-framework - 快照二进制文件上传

haskell - 简化 Haskell 代码

haskell - Snap 框架 - 重复也许整理