1

コンパイルされたスプライスを構築し、URL 変数に依存するデータをそれらにフィードする必要がある状況があります。私は問題を解決するのに苦労しています。

そのため、テーブルにレンダリングする必要がある単純なファイル名リストがあります。単純。ファイルはグループまたはカテゴリに属しているため、すべてのファイルまたは特定のカテゴリに関連するファイルを一覧表示できます。この関数を使用してデータをプルします。

getFilesList :: Maybe ByteString -> AppHandler [Document]
getFilesList cat = do
  let selection = maybe [] (\c -> ["category" =: T.decodeUtf8 c]) cat
  r <- eitherWithDB $ rest =<< find (select selection "files") {project = ["blob" =: 0]}
  return $ either (const []) id r

Nothing を取得した場合はリスト全体を取得し、Just カテゴリを取得した場合はそのカテゴリに属する​​ファイルを取得します。ここまで簡単。

上記の関数をハンドラー内から呼び出して、引数を渡すことができるようにします。

listFiles :: AppHandler [Document]
listFiles = do
  cat <- getParam "cat"
  let r = maybe Nothing (\c -> if c == "all" then Nothing else Just c) cat
  render "files/list-files"
  getFilesList r

URL で「all」または Nothing を取得すると、完全なリストが取得されます。それ以外 - カテゴリでフィルタリングされたリストを取得します。

URLルートは次のようになります

("/files/:cat",           method GET    listFiles)

しかし、「メソッド」関数は Handler App App () 署名のみを受け入れるため、問題が発生しました。私のハンドラーは、スプライスに供給されるデータを返します。

私はスプライスを次のように構築します。

listFilesS :: Splices (Splice (Handler App App))
listFilesS = "files" ## files
  where
    files = manyWithSplices runChildren file $ lift listFiles -- Feed data here
    file = do
      "file-name"     ## (pureSplice . textSplice $ at "name")
      "file-oid"      ## (pureSplice . textSplice $ id)
      "file-date"     ## (pureSplice . textSplice $ dateFromDoc)
      "file-size"     ## (pureSplice . textSplice $ fsize)
      "file-type"     ## (pureSplice . textSplice $ at "type")
      "file-auth"     ## (pureSplice . textSplice $ const "admin")
      "file-link"     ## (pureSplice . textSplice $ flink)
      "file-category" ## (pureSplice . textSplice $ at "category")
      where id = T.pack . show . valueAt "_id"
        fsize = T.pack . show . round . (flip (/) 1024) . (at "size")
        flink = T.append "/files/" . id

私はそれを回避する方法を見つけることができません。おそらく、何か愚かなものを見逃しているだけです。私が間違っていることはありますか?

いずれにせよ、最初にテンプレートをレンダリングしてからデータをプルするため、ハンドラー関数は正しくないように見えます。ハンドラーを修正すると、URL パラメーターに基づいてデータをフィードできなくなります。

混乱している。

4

1 に答える 1

1

まず第一に、listFiles が を返すだけなら[Document]、 を呼び出したくありませんrender "files/list-files"。したがって、ビジネスの最初の順序は、その行を完全に削除することです。なぜだろうと思うかもしれません。これが 2 番目のポイントにつながります。ルートは次のようになります。

("/files/:cat", method GET $ render "files/list-files")

ルートは、テンプレートをレンダリングした結果です。強盗ルートでは、ほぼ常にそうです。を明示的に呼び出したい場合もありますrender。によって自動的に与えられたルートを使用する場合もありますheistServe

listFilesSAPIのコードをもっと見ずしてコメントすることはできませんDocumentが、妥当に見えます。適切に動作すると仮定すると、次のようなものでアプリケーションのスプライスをバインドする必要があります。

addConfig heist $ mempty { hcCompiledSplices = listFilesS }

次に、「files/list-files」テンプレートで files タグを使用します。

于 2013-10-29T18:26:30.470 に答える