我有一种情况,我必须构建编译的拼接并将数据输入到它们中,这取决于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
如果我在网址上获得“全部”或“无” - 我会获得完整列表。除此之外的任何事情 - 我得到一个类别筛选列表。
网址根目录
("/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参数提供数据。
混淆。
答案 0 :(得分:1)
首先,如果listFiles刚刚返回[Document]
,那么您不想调用render "files/list-files"
。因此,第一项业务是完全消除这条线。你可能想知道为什么。这将我们带到第二点。您的路线应如下所示:
("/files/:cat", method GET $ render "files/list-files")
您的路线是渲染模板的结果。 Heist路线几乎总是如此。有时您可能希望明确调用render
。其他时候您可能只使用heistServe
自动提供给您的路线。
如果没有看到listFilesS
API的更多代码,我无法对Document
发表评论,但它看起来很合理。假设它正常工作,你只需要为你的应用程序绑定这样的拼接:
addConfig heist $ mempty { hcCompiledSplices = listFilesS }
然后只需使用“files / list-files”模板中的files标签。