読者です 読者をやめる 読者になる 読者になる

bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

Haskellでウェブ・アプリケーション(3)

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

にアクセスして、このサービスを利用してみるとよい。日本語でのテキストももちろん受け付ける。