Yesod 将 getCurrentRoute 与具有动态参数的路由进行比较

Yesod Compare getCurrentRoute to a route with dynamic parameters

编码问题 haskell 格式良好,而不是 'it works'。

我们希望我们的菜单导航项在用户访问该页面时突出显示 CSS class。

简单。

这是我的路线:

...
/simple SimpleR GET POST
/search SearchFormR GET POST
/searchresults/#Int/#Text SearchResultsR GET 
...

在我的小村庄模板中,我有以下内容。这非常有效,当用户在该页面上时,link 会突出显示。路线简单

<li .nav-item>
    <a .nav-link :Just SimpleR == mcurrentRoute:.active href=@{SimpleR}>
        Simple page

当用户处于 SearchFormRSearchResultsR 时,应突出显示此 link。

<li .nav-item>
   <a .nav-link :((Just (SearchResultsR _ _)) == mcurrentRoute) || (Just SearchFormR == mcurrentRoute):.active href=@{SearchFormR}>
       Search

这段代码不起作用,因为 SearchResultsR 路由构造函数需要传递给它的两个东西。我不能像上面那样写 _ _ ,因为构造函数需要一个文字值。此外,构造函数的结果将与 == 与实际路由进行比较,除非两个参数恰好完全相同,否则它不会匹配。

如果没有 _ _,我当然会遇到类型错误,期望将另外两个东西传递给 SearchResultsR 构造函数。

也就是说,我想检查我们是否在任何SearchResultsR路线上,而不仅仅是匹配SearchResultsR 123 "abc"

我的第一个想法是创建一个函数将路由转换为字符串,然后检查该字符串是否包含路由的字符串,但这很糟糕,而且不是 haskell / 类型安全的方式。

我的第二次尝试是使用模式匹配:

Foundation.hs:

isThisRouteSearchResultsR :: Maybe (Route App) -> Bool
isThisRouteSearchResultsR (Just (SearchResultsR _ _)) = True
isThisRouteSearchResultsR _ = False

哈姆雷特模板:

<li .nav-item>
   <a .nav-link :(isThisRouteSearchResultsR mcurrentRoute) || (Just SearchR == mcurrentRoute) :.active href=@{SearchR}>
       Search

但这似乎并没有好多少。如果我有更多包含动态部分的路线怎么办? 这样做的正确方法是什么?我查看了 haskellers 站点源代码,但找不到答案

Sibi在评论中给出的答案(谢谢Sibi)是问题中的第二种方法形式/风格很好。

例如在小村庄: :(isThisRouteSearchResultsROrSearchR mcurrentRoute) :.active

或者可以做 :(isThisRouteSearchResultsR mcurrentRoute) || (isThisRouteSearchR mcurrentRoute) :.active

然后您根据问题代码在Foundation.hs(Haskell)中定义这些函数。

思比:

The goal is to usually keep all your logic in the Haskell file and keep it minimal in the Hamlet file.

谢谢思碧的指导