まさ@ブログ書き込み中

まさ@ブログ書き込み中

まさの旅、英語、プログラミング、プライベートについて、色々記録しています。

SinatraでRackのflashを使う

 

 

おはようございます。平成の日進月歩ボーイことまさです。

 

昨日はFlashの機能を簡単に実装しました。

その時に学んだことを簡単にまとめていきます。

 

 

Flashとは

参考にしたSinatraでFlash(1回きりのセッションデータ)を用いる - Qiitaによると

 

直後のHTTPリクエストのみで使用するセッションデータ。


POSTでデータを登録した後にGETにリダイレクトし、登録の結果メッセージを表示するのに使ったりする

 

だそうな。

 

具体的にはどういうときに使われるのか?

 

 

ログアウトしたら、トップページとかに戻って「ログアウトしました。」って出るあれ

そういうのよくありますよね。

 

あれ、もう一度そのトップページを読み込むと「ログアウトしました。」という文字が消えていたりすると思います。

 

ああいう表示の仕方ができるのがFlashです。

 

つまり、ログアウト処理が終わった後に飛んだトップページにのみ「ログアウトしました」の文字を表示させるわけですね。

 

 

使い方

下記のコードを参照してください。

 

 

注意点(学んだこと)

僕がflashを使っていく中でハマったポイントについて書いていきます。

 

1: Gemfile内にはrack-flash3と書き、app.rbのrequireではrack-flashと書く

ここがハマった一番の原因でした。

 

サイトによってはflashを使うときのサンプルコードでrack-flash3と書いたりrack-flashと書いてあったりしたのでどちらも試して見たのですが、うまくいかないことがありました。

 

それもそのはずで、gemはrack-flash3を利用し、requireする際にはrack-flashと書くべきだったらしいのです。

 

2: flash.now[:foo]はリダイレクトされると情報が消えてしまう

https://github.com/treeder/rack-flashでは「Sinatra」の項で flash.now[:foo] というフラッシュの使い方が紹介されていますが、これはその時のリクエストのみで利用できるフラッシュです。だから、上のコードの例のようにリダイレクトさせてしまうと、リダイレクトというリクエストが加わるので、flash.now[:foo]に入れた情報は表示されません。

 

3: flashそもそもセッションデータ

僕はSinatraでセッションを利用していました。

 

なのでログアウトに関するコードにフラッシュを以下のように加えてみると、ログアウト後の画面にメッセージが表示されないという問題が起こりました。

 

そして、もしやと思いこのコードの中のsession.clearflash[:notice]の順番を変えてみたらメッセージが表示されたのです。 

 

僕はこれで「フラッシュはセッションに関係するものだ」と予想しましたが、やはりそのようでした。

 

我らがコーチさぼさんもそう仰っていましたし、 これは今日気づいたことなのですが、先ほど載せたサイトのタイトルにもそのようなことが書かれていましたね。

 

SinatraでFlash(1回きりのセッションデータ)を用いる - Qiita

 

Flashはセッションデータの1つなので、session.clearしちゃうと消えてしまうのですなー。

 

 

では今回はここまで。

あでゅー。

 

 

 追記:Flashって要するに何が便利なの

樹里さんと僕は「これって要するになんなの」っていう話を昨日していましたが、リクエストの後しかメッセージが出ないことが便利なのがわかっていても、なんだか腑に落ちていませんでした。

 

例えば、ログイン成功時にハッシュを作ってメッセージを入れて別のページ表示させるだけならflashを使う必要がない気がしたからです。

 

 

でも、よく考えたらどんな変数であれそのままでは「表示した後にその値を消す」という設定を仕組むことはできません。それを可能にするのがFlashなのでした。便利ですねー。

 

 

参照

もっと早くこのサイト見つけられていたら楽だったってくらいまとめられている

flashの使い方:Railsの基礎知識 - 久保清隆のブログ

 

rack-flash

https://github.com/nakajima/rack-flash

 

最初に参照したサイト

SinatraでFlash(1回きりのセッションデータ)を用いる - Qiita