2

タイトルの質問を正しく表現したかどうかはわかりませんが、状況は次のとおりです。テーブル フィールド (スキーマ) が実行時にしか利用できない場合、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"
4

1 に答える 1

2

ここで重要なのは、runChildrenWith と一緒に mapSplices を使用することだと思います。次のようになると思います。

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
于 2012-12-06T16:18:40.093 に答える