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

あのねノート

せんせいあのね、パソコンで字が書けるようになったよ

ブログに複数投稿できるようにする~Racketチュートリアル中級編をやってみた(第3回)

勉強 Racket

なかなか進みませんが中級チュートリアル(Continue: Web Applications in Racket)の第3回です。Racketでゆっくりシンプルなブログシステム的なものを作っています。
初回↓
momo-moemoe.hatenablog.com

前回は新規投稿ができるようになったものの2つ以上投稿すると上書きされてしまうというところで終わっていました。
これは、start関数がページを表示することと新規投稿を追加することという2種類のrequestを処理しようとしているからなので、うまくdispatchできるようにしないといけないようです。そのためにsend/suspend/dispatchという関数を使うみたい。

新しいページへ遷移する処理を作っておくと、send/suspend/dispatch関数で処理してくれるというような説明がありました。

ブログシステムのコードが更新されていたのでまた書きかえていきます。ややこしい処理はrender-blog-page関数にやってもらうことにして、start関数はページ表示機能だけ(投稿機能をつける前の状態)に戻します。

(define (start request)
  (render-blog-page BLOG request))

原文のコメントが「request->response」から「request->doesn't return」に変わっていました。別の関数でresponseすることにしたってことかなあ。

大事なのがHTMLページ本体を作るrender-blog-pageです。ここにsend-suspend-dispatch関数を追加します。

(define (render-blog-page a-blog request)

  (define (response-generator embed/url)
    (response/xexpr
     `(html (head (title "My Blog"))
            (body
             (h1 "My Blog")
             ,(render-posts a-blog)
             (form ((action ;入力フォーム
                     ,(embed/url insert-post-handler))) ;入力フェーズへの遷移
                   (input ((name "title")))
                   (input ((name "body")))
                   (input ((type "submit"))))))))
 
  (define (insert-post-handler request)
    (render-blog-page
     (cons (parse-post (request-bindings request)) ;BLOGリストに新規投稿を追加
           a-blog)
     request))
  
  (send/suspend/dispatch response-generator))

send/suspend/dispatchがいい感じにしてくれると思ったらよさそう。

実行してみると、2つ以上投稿してもきちんと表示されるようになっているのが分かります。
f:id:momo_moemoe:20160815090902p:plain

しかし、このブログのURLに別ウインドウからアクセスするとまた初期状態の2つしか投稿されていない状態が表示されてしまいます。ほかのユーザーがアクセスすると初期状態から始まってしまうということのようです。
次はこれを解決していくみたいです。