我写了一个 Yesod auth 插件,它可以邮寄邀请码,然后需要注册。我想在插件中包含的一件事是一个包含用于创建邀请的表单的小部件;该表单将发布到 auth 插件中的路由。我遇到的麻烦是找出允许创建适当 URL 并且也可以在主站点的处理程序中使用的小部件的类型签名。
剥离到基本要素,小部件看起来像:
invitationWidget :: GWidget Auth m ()
invitationWidget = do
tm <- lift getRouteToMaster
[whamlet|<form action=@{tm inviteR}>|]
inviteR :: AuthRoute
inviteR = PluginR "invite" ["invite"]
问题是为小部件指定Auth
子站点意味着我不能将它直接嵌入到类型的处理程序中GHandler master master a
(确切的错误是Couldn't match type `App' with `Yesod.Auth.Auth'
)。但是,如果未指定子站点,例如invitationWidget :: GWidget s m ()
,那么我看不到任何方法inviteR
(错误是Could not deduce (MonadLift (GHandler Auth m) (GWidget s m))
)。