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
当用户处于 SearchFormR
或 SearchResultsR
时,应突出显示此 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.
谢谢思碧的指导
编码问题 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
当用户处于 SearchFormR
或 SearchResultsR
时,应突出显示此 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.
谢谢思碧的指导