【问题标题】:Snap: inner/outer loops with heistSnap:带有抢劫的内/外循环
【发布时间】:2012-12-10 20:48:15
【问题描述】:

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

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

【问题讨论】:

    标签: haskell haskell-snap-framework


    【解决方案1】:

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

    【讨论】:

    • 非常感谢,但仍然无法正常工作。我已经玩了一天 - 没有运气。我显然做错了什么。如我所见,在您的示例中,单行中只有内部“循环”生成字段。现在,内部“循环”应该与在表中生成行的外部循环一起运行。我只是不知道如何将两者联系在一起。所以内部“mapSplices”应该创建一个行,外部“mapSplices”应该创建一个表。
    • 好的,我重写了答案。试试看。
    • 非常感谢。我也破解了它......即使你的第一个例子也帮了我很多,我知道如何嵌套'runChildren'函数。再次感谢。
    猜你喜欢
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多