繁体   English   中英

快照:编译后的拼接取决于运行时决定和URL变量

[英]Snap: compiled splice dependent on runtime decision and URL variable

我遇到一种情况,我必须构造编译后的拼接并将数据输入其中,具体取决于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参数来提供数据。

困惑。

首先,如果listFiles仅返回[Document] ,则您不希望调用render "files/list-files" 因此,首要任务是彻底消除这条线。 您可能想知道为什么。 这将我们带到第二点。 您的路线应如下所示:

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

您的路线是呈现模板的结果。 Heist路线几乎总是这样。 有时您可能想显式调用render 其他时候,您可能只使用heistServe自动给您的heistServe

在看不到Document API的更多代码的情况下,我无法真正对listFilesS进行评论,但它看起来很合理。 假设它可以正常工作,您只需要使用以下内容将该接头与您的应用程序绑定:

addConfig heist $ mempty { hcCompiledSplices = listFilesS }

然后,只需使用“文件/列表文件”模板中的文件标签即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM