在小村庄模板中使用 Yesod.Auth.Hardcoded SiteAdmin

Using Yesod.Auth.Hardcoded SiteAdmin in a hamlet template

问题描述

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

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")

我的网站编译和呈现愉快,直到我尝试对上面 do 块中分配的 uid 做任何有用的事情。

我试过的

我已经在 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")

问题

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

经常 post 这个问题让我想到了一个答案,尽管我仍然会感激任何更好的答案。像这样使用 $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

帮我找到了正确的用户名。如果有更好的方法,请post另一个答案。

这里的AuthId类型是Either UserId String.

一个Right值表示一个"hardcoded"用户没有出现在Usertable中。 Left 值表示 Users table.

中的 User 行

如果要显示 AuthId 的名称,可以调用 getAuthEntity 其中 returns 和 Either User SiteManager 然后像这样处理它:

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