有没有办法在Happstack获得“当前路线”?

时间:2014-01-04 15:30:23

标签: haskell happstack

每当我在网站上使用表单时,我都需要通过"操作"归因于它(我不想把它留空,因为我更喜欢验证标记)。现在它看起来像这样:

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

对于操作与其所在页面相同的表单,我不想像我目前所做的那样两次写入URL。有没有办法获得&#34;当前网址&#34;代替?

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

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

registerUrl :: String
registerUrl = "register"

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

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

2 个答案:

答案 0 :(得分:1)

现在我想到了,我认为我实际需要的是用户发送的当前URL,而不管我使用的路由过滤器。这将保留可变路径段和查询字符串参数。

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

获取其中的网址
rq <- askRq
let action = (rqUri rq) ++ (rqQuery rq)

答案 1 :(得分:0)

你想要这个:

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 ...

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