タイトルの質問を正しく表現したかどうかはわかりませんが、状況は次のとおりです。テーブル フィールド (スキーマ) が実行時にしか利用できない場合、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」を 2 回実行する必要があると思います。経験的に言えば、それは内側と外側のループ/マップになりますよね?
ハンドラー内でこれを行うにはどうすればよいですか??
ありがとう。
アップデート:
スキーマは実行時に DB から取得でき、次のように利用できることを忘れていました。
Table { tableName :: Text
, tableFields :: [Text]
}
ただし、データはスキーマのない mongodb から取得され、Map に変換されるため、実際には必要ありません。
fromList [("FieldName1","Value1"),("FieldName2","Value2"),("FieldName3","Value3")]
アップデート2:
提案された例を試してみましたが、すべてのデータを 1 つの列にまとめただけです。必要なのは、フィールドと行を動的に生成するための単純な内側と外側のループだけです。これよりも簡単にすることはできません:
<% @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"