2017年11月11日土曜日

YesodのURLパラメータ

URLのパラメータ変換


URLのパラメータの扱いについて調べてみた

config/routes


/list/#Int ListR GET POST
こう書くと、URLのパラメータに数字が使える、それ以外は「404エラー」、ちょっと注意が必要で、「0087」みたいなパラメータも受け付けるので、これはプログラム側のバリデーション等で対応が必要

基本的な型は、PathPieceクラスのインスタンスなっているので、そのままURLに使えて変換してくれる

それ以外の型をURLパラメータに利用する


適当な場所に、型を定義してPathPieceのインスタンスにする

import qualified Text.Read as R

newtype DirId = DirId Int deriving(Show, Read, Eq)

instance PathPiece DirId where
  toPathPiece (DirId n) = pack $ show n
  fromPathPiece n = case R.reads $ unpack n of
    (p, ""):_
      | p < 1 -> Nothing
      | otherwise -> Just $ DirId p
    _ -> Nothing
toPathPiece関数は特定の型をTextへ変換してURLで利用できるようにし、fromPathPiece関数はその逆。

そしてhandlerで

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
module Handler.DirList where

import Import

getDirListR :: DirId -> Handler Html
getDirListR (DirId n) = defaultLayout $ do
    setTitle "Routing test"
    $(widgetFile "did")

テンプレート

<div .container>
    <div .bs-docs-section>
        <div .row>
            <div .col-lg-12>
                <div .page-header>
                    <h1 #start>DirID Test
                    <p>n = #{show n}


こんな感じで、できまする、昨晩の宴で呼吸が苦しい...

0 件のコメント:

コメントを投稿