セッション変数とはHTTPリクエストをまたがって値を保持することができる変数です。
通常ウェブアプリケーションは、ブラウザからのリクエストを受けてプログラムが動作するというルーチンを何度も繰り返します。この時、1回目のリクエストと2回目のリクエストは何の関連もなく、1回目のリクエスト時の変数の値は2回目のリクエスト時には消えています。 これでは困る場合が多いので、なんらかの方法でリクエストをまたいで状態を保存する手段が必要になります。 この1つの解決策がセッション変数です。
入力フォームを使う の項で作成したフォーム入力プログラムを、以下のように改造してみましょう。
[1.start]
↓
[2.入力フォーム表示/入力]
↓
[3.確認画面表示/YES,NO入力]
↓
[4.最終確定画面表示]
3までは、前項で作ったところです。3から4へは、入力された結果を引き継がなければなりません。ここにセッション変数を使います。
3までのプログラムを再掲します。
require 'alone' class FormController1 < AlController # constructor def initialize() @form = AlForm.new( AlText.new("text1"), AlInteger.new("integer1"), AlSubmit.new("submit1"), ) @form.action = Alone::make_uri( action:"confirm" ) end # デフォルトアクション def action_index() AlTemplate.run( 'index.rhtml' ) end # 確認画面 def action_confirm() if @form.validate() AlTemplate.run( 'confirm.rhtml' ) else AlTemplate.run( 'index.rhtml' ) end end end
<%= header_section %> <%= body_section %> <%= @form.get_messages_by_html() %> <%= @form.make_tiny_form() %> <%= footer_section %>
確認画面では、YES/NO入力のためのaタグを追加します。
<%= header_section %> <%= body_section %> text1: <%=h @form[:text1] %> <br> integer1: <%=h @form[:integer1] %> <br> <br> よろしいですか?<br> <a href="<%=h make_uri(:action=>'cancel') %>">いいえ</a> <a href="<%=h make_uri(:action=>'commit') %>">はい</a> <%= footer_section %>
テンプレートの追加部分を見てもらうとわかるとおり、YES(はい)の場合は "commit"、NO(いいえ)の場合は "cancel" アクションが呼び出されます。コントローラへもこの2つのアクションを追加します。また確認画面のアクションでは、現在の入力内容を次回へ引き継ぐ必要がありますので、その操作も追加します。
# 確認画面 def action_confirm() if @form.validate() session[:text1] = @form[:text1] # 追加 session[:integer1] = @form[:integer1] # 追加 AlTemplate.run( 'confirm.rhtml' ) else AlTemplate.run( 'index.rhtml' ) end end # 最終確定画面 def action_commit() @text1 = session[:text1] @integer1 = session[:integer1] AlTemplate.run( 'commit.rhtml' ) end # キャンセル def action_cancel() @form[:text1] = session[:text1] @form[:integer1] = session[:integer1] AlTemplate.run( 'index.rhtml' ) end
最終確定画面用テンプレート
<%= header_section %> <%= body_section %> text1: <%=h @text1 %> <br> integer1: <%=h @integer1 %> <br> <br> 以上の内容で確定しました。 <%= footer_section %>
これで必要な4つのファイル、main.rb, index.rhtml, confirm.rhtml, commit.rthml が揃いました。
実行すると以下のようになります。
↓
↓
確認画面で「いいえ」を選択すると、最初の入力フォームに戻ります。その際、コントローラの action_cancel では、セッション変数から@formへ値を戻しているので、表示されるフォームには入力した値が最初から入っている状態になります。
ここで説明したセッション変数は、コントローラローカルセッション変数といい、個々のコントローラ内でのみ有効なセッション変数です。つまり異なるコントローラからはアクセスできませんので、他のコントローラと名前がぶつかることを心配する必要がありません。
コントローラをまたいで値を受け渡すことができるグローバルセッション変数もあります。 詳しくは、AlSession セッションマネージャ の項を参照してください。
httpリクエストをまたぐ一時的なメッセージは意外とよく使うので、たとえばRailsではflashという専用の機能が実装されています。
Aloneでは、そのような難しい機能は実装せず、もっと簡単に考えています。