我有一种情况,我必须构建已编译的接头并将数据输入其中,这取决于 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 上得到“全部”或没有 - 我得到完整列表。除此之外的任何东西 - 我得到一个类别过滤列表。
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 参数提供数据。
使困惑。