1.回文を作る
最初の例は入力したテキストをそのまま出力していたが、今回は、加工する。そこで課題は「入力されたテキストと、それを逆順にしたテキストを接続して表示する」とする。このサービスをMirrorということにする。前回と同じように、まず、コントローラの部分を作成する。
yesod add-handler
route名、routeのパターン、メソッドのリストが要求されるので、それぞれ、Mirror, /mirror, GET POSTを入力する。メソッドはサービスの機能であるが、サービスMirrorが提供する機能は二つで、その一つはテキストの入力を要求するもの、他の一つは、回文を表示するものである。要求にこたえたときの様子は次のとおりである。
Name of route (without trailing R): Mirror Enter route pattern (ex: /entry/#EntryId): /mirror Enter space-separated list of methods (ex: GET POST): GET POST
前回と異なる点はPOSTのメソッドがあること。これは出力のとき利用する。
コントローラとビューの分離を図ることにする。そこで、Handler/Mirror.hsは次のようにする。このハンドラーの部分には、テキストを入力するためのメソッドgetとそれを回文として表示するためのメソッドpostが用意されている。なお、回文はこの部分ではなく、ビューの部分で作成される。ここでは、入力されたテキストをpostedTextとなずけて、ビュー側に渡している。また、contentは後で説明するが、これは入力されたテキストの名前である。
module Handler.Mirror where import Import import qualified Data.Text as T getMirrorR :: Handler Html getMirrorR = defaultLayout $(widgetFile "mirror") postMirrorR :: Handler Html postMirrorR = do postedText <- runInputPost $ ireq textField "content" defaultLayout $(widgetFile "posted")
また、入力用と出力用のビューを必要とするので、それらは次のようになる。
入力用ホームページ作成のためのファイルmirror.hamletは次のとおりである。ここでは、テキストの入力を要求している。入力されたテキストはcontentという名前で呼ばれる。テキストの入力が終了すると、メソッドのpostが呼ばれる。これは、先ほどのハンドラーの部分で用意したものである。
<h1> Enter your text <form method=post action=@{MirrorR}> <input type=text name=content> <input type=submit>
出力用ホームページ作成のためのファイルposted.hamletは次のとおりである。ここでは、入力されたテキストと反転したテキストとを表示している。なお、テキストを反転するためには、reverseという関数を用いるが、この関数は他の型に対しても定義されているので、テキスト型のものであることを明記するために、"T"が付けられている。この"T"は、コントローラのimport文のところで定義されている。
<h1>You've just posted <p>#{postedText}#{T.reverse postedText} <hr> <p><a href=@{MirrorR}>Get back
最後の行は、Get backをクリックすると、テキストの入力を求めるホームページに移るためのものである。サービスEchoでは、ホームページの遷移はなかったが、サービスMirrorでは、テキストの入力を求めるページと、回文を表示するページの間で遷移することが分かる。
コンパイルして展開するとこのサービスが利用できるようになるので、
http://localhost:3000/mirror
にアクセスして、このサービスを利用してみるとよい。日本語でのテキストももちろん受け付ける。