有没有办法在Happstack中获取“当前路由”



每当我在网站中使用表单时,我都需要向其传递"action"属性(我不想将其留空,因为我更喜欢使用验证标记)。现在它看起来像这样:

registerPage = dir "test" $ do
    nullDir
    let action = "/test" :: String
    let mkForm = form action
    let prefix = "register"
    eForm <- happstackEitherForm mkForm prefix registerForm

对于操作与它们所在的页面相同的表单,我不喜欢像目前那样需要两次编写 URL。有没有办法获取"当前网址"?

registerPage = dir "test" $ do
    nullDir
    action <- {- ... -}

到目前为止,我最好的选择是将操作转换为显式参数/变量

registerUrl :: String
registerUrl = "register"
registerPage = dir registerUrl $ do
    nullDir
    let action = "/" ++ registerUrl

但是如果我这样做,那么我将有一个额外的参数,我需要命名并传递给我的函数。我也认为需要这样做"/" ++有点丑陋。

你想要

这个吗:

import Control.Monad (MonadPlus)
import Happstack.Server.SimpleHTTP (dir, ServerMonad)
dir' :: (MonadPlus m, ServerMonad m) => String -> (String -> m a) -> m a
dir' path handler = dir path (handler ("/" ++ path))
registerPage = dir' "test" $ action -> do
    nullDir
    ... use action ...

我不知道dir'是否已经存在于Happstack中。

现在我想起来了,我认为我真正需要的是当前 URL,由用户发送,无论我使用什么路由过滤器。这将保留可变路径段和查询字符串参数。

为此,我可以通过askRq获取当前Request,并通过rqUrirqQuery从中获取URL

rq <- askRq
let action = (rqUri rq) ++ (rqQuery rq)

相关内容

  • 没有找到相关文章

最新更新