3

単純な問題の解決策が見つからない場合、答えは明らかなはずです。ハムレットテンプレート内のクエリパラメータでURLをレンダリングする方法は?

つまり、@{ItemsR}生成さhttp://localhost:3000/itemsれますが、どのように生成するのhttp://localhost:3000/items?page=10&sort=nameですか?

4

1 に答える 1

2

Yesod は RESTful です。URL 形式 (例: /items/page/10/sortby/name) で引数を使用する必要があります。形式を使用したい場合QueryStringは、Yesod タイプセーフな URL 管理が失われます。

以下の例は、クエリ文字列から引数を読み取るリクエストに対して、異なる RESTful 表現とリダイレクト (クエリ文字列 URL のレンダリング) を使用する方法を示しています。

{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE MultiParamTypeClasses #-}
import Yesod
import Data.Text
import Network.Wai.Handler.Warp (run)

data RouteTest = RouteTest

mkYesod "RouteTest" [parseRoutes|
/item/all/page/#Int/sortby/#Text Items1R GET
/items/page/#Int/sortby/#Text Items2R GET
/items/#Int/#Text Items3R GET
/itemsquery ItemsQueryR GET
|]

instance Yesod RouteTest where
    defaultLayout widget = do
        pc <- widgetToPageContent widget
        hamletToRepHtml [hamlet|\<!DOCTYPE html><html lang="en"><body>^{pageBody pc}</body></html>|]

getItemsR :: Text -> Int -> Text -> HandlerT RouteTest IO Html
getItemsR path page sortby =
  defaultLayout [whamlet|
    <h1>Items Page ##{page} sorted by #{sortby}
    <h4>(Using #{path} path format)
    <p>Same request in query string format
      <a href="@{ItemsQueryR}?page=#{page}&sort=#{sortby}">
        here
  |]

getItems1R = getItemsR $ pack "large"
getItems2R = getItemsR $ pack "medium"
getItems3R = getItemsR $ pack "short"

getItemsQueryR = do
  req <- getRequest
  defaultLayout [whamlet|
    <h1>Query String arguments format
    <ul>
      $forall (k, v) <- reqGetParams req
        <li>
          <b>#{k}</b>: #{v}
  |]

main = run 8181 =<< toWaiApp RouteTest

もちろん、あなたのようなものを取るヘルパーを書くことができます@{ItemsR page sortby}

renderItemsQueryR page sortby = hamletToRepHtml [hamlet|@{ItemsQueryR}?page=#{page}&sort=#{sortby}|]

ただし、次のように使用する必要があります

...
url <- renderItemsQueryR page sortby
defaultLayout [whamlet|
    ...
    <a href=#{url}>
    ...
|]

最後に、任意のクエリ文字列 URL をレンダリングする他のヘルパーを作成できます

renderQueryString path keyValues = do
  let querystring = intercalate "&" $ map (\(k, v) -> concat [k, "=", v]) keyValues
  hamletToRepHtml [hamlet|@{path}?#{querystring}|]

は、次のrenderItemsQueryRように記述できます。

renderItemsQueryR page sortby = renderQueryString ItemsQueryR [("page"  , show page)
                                                              ,("sortby", sortby   )]
于 2013-10-17T06:49:33.607 に答える