在小村伙模板

时间:2016-07-25 22:47:55

标签: haskell yesod

问题描述

我无法获得使用Yesod.Auth.Hardcoded的编译示例。我的问题是试图在一个小村伙模板中询问用户。我的Foundation.hs是根据硬编码链接中的文档设置的。我的处理程序如下所示:

getHomeR :: Handler Html
getHomeR = do
    uid <- maybeAuthId
    (widget, enctype) <- generateFormPost . renderBootstrap3 BootstrapBasicForm $ blurbForm Nothing
    currentPost <- runDB $ selectFirst [] [Desc BlogId]
    currentBlurb <- runDB $ selectFirst [] [Desc BlurbId]
    defaultLayout $ do
        setTitle "My site"
        addScriptRemote "https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"
        addScriptRemote "https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.2.0/js/collapse.js"
        $(widgetFile "homepage")

我的网站会愉快地编译和呈现,直到我尝试对上面uid块中分配的do执行任何有用的操作。

我尝试了什么

我已尝试hamlet documentation中的$maybe$case结构。 $maybe看起来像这样:

    $maybe user <- uid
       <p>There's a name
    $nothing
       <p>No name

无论我是否以硬编码用户身份登录,都会成功。

$case版本看起来像这样:

    $case uid
        $of Left _
            <p>There's no name
        $of Right username
            <p>It worked

并失败了:

Exception when trying to run compile-time code:
  Inside a $case there may only be $of.  Use '$of _' for a wildcard.
Code: widgetFile "homepage"
In the splice: $(widgetFile "homepage")

问题(S)

我是否在我的处理程序代码中正确设置了uid,如果是这样,我应该如何访问模板中的硬编码SiteManager

2 个答案:

答案 0 :(得分:1)

由于经常发布这个问题让我想到了答案,尽管我仍然对任何更好的答案感激不尽。像这样使用$maybe$case的组合:

    $maybe user <- uid
        $case user
            $of Left _
                <p>There's no name
            $of Right username
                <p>There might be a name of #{username}
    $nothing
       <p>No name

给了我正确的用户名。如果有更好的方法,请发布另一个答案。

答案 1 :(得分:1)

此处的AuthId类型为Either UserId String

“正确”值表示“硬编码”用户,该用户未出现在“用户”表中。 Left值表示Users表中的User行。

如果您想显示AuthId的名称,可以致电getAuthEntity并返回Either User SiteManager,然后按照以下方式处理:

getUserName :: Either User SiteManager -> String
getUserName (Left user) = ...get the name field from user...
getUserName (Right sitemgr) = manUserName sitemgr