フラッシュを使いこなす – flash, flash.now, flash.keep

Railsに触ってからすでに1年以上が経過するが、放置期間も長かったので割と初心者ぽいことを知らなかったりする。
なんかここらでしっかり復習しておかないとやばい気がしている今日この頃。

といったところでいろいろと基本的なこともあえて書いてみる。
書くのは一番の勉強だしね。

フラッシュとはなんだろう

端的に言うとあるリクエスト間と次のリクエストの間でのみ保持されるセッション変数。
リクエストAで定義されて次のリクエストBが終わると削除されるので、セッション変数削除し忘れてウボァーということがないのが利点。

主にエラーメッセージなどを表示するのに使う。
コントローラ内で次のようにハッシュっぽく使える。

 flash[:notice] = "hogehoge"

これをビューではよく次のように表示する。

<%= flash[:notice] if flash[:notice] %>

または

<% if flash[:notice] %>
<div id="notice">
  <%= flash[:notice] %>
</div>
<% end %>

みたいにしてスタイル当てて強調表示したりとか。

あるアクションでユーザーからの入力を処理して、その結果を他のアクションにちょっとしたメッセージで表示したいということは相当あるので、こういう仕組みがあらかじめあるのはありがたい。
とにかく自前でやるとよく消し忘れたりするので。

単にエラーメッセージを保持するものとして覚えている人がいそうなフラッシュだが、機能としてflash.now、flash.keepなどもあるので把握しておくと吉。

flash

フラッシュとしてはスタンダードな次のリクエストまで有効なフラッシュ。

動作サンプルとして以下のアクションを適当なコントローラに定義して実行。
リロードを続けると2回リロードにつき1回フラッシュメッセージの内容が更新されることがわかる。

def flash_test
    flash[:notice] = Time.now unless flash[:notice]
    render(:inline => "#{flash[:notice]}")
end

本来的には次のような他のアクションへのリダイレクトを行うアクションで使うはず。

def create
    ...(何かの処理)...
    flash[:notice] = "hogehoge"
    redirect_to(:action => 'result')
end

flash.now

そのアクションでだけ有効なフラッシュメッセージ。

以下のアクションをリロードし続けると毎回フラッシュメッセージの内容が更新される。

def flash_now_test
    flash.now[:notice] = Time.now unless flash[:notice]
    render(:inline => "#{flash[:notice]}")
end

これは普通にインスタンス変数を使っても同じ事なのだが、エラーメッセージ系はフラッシュで一貫して処理した方がスッキリとかそういうことなんだろう。きっと。
確かにそれは正しい気がする。

flash.keep

消えるはずのフラッシュメッセージの内容を保持し続ける。

以下のアクションをリロードし続けてもフラッシュメッセージの内容はいつまでも変わらない。

def flash_keep_test
    flash[:notice] = Time.now unless flash[:notice]
    flash.keep(:notice) if flash[:notice]
    render(:inline => "#{flash[:notice]}")
end

引数なしでflash.keepを呼ぶと現在のフラッシュの内容がすべてkeepされる。

@flashはもう使えません

flashは古いドキュメントでは@flashになっているが、これはDeprecationなのでRails 2.0からは使えなくなる。
今はまだ使えるけどそいうわけなのでご注意を。

近況

二泊三日で信越方面にツーリングに行ってきました。
最近夜更かしして朝遅く起きるという生活リズムになっていたのだけれど、旅に出ると朝早く起きて夜早く寝る生活にリセットされていい感じです。