文書の過去の版を表示しています。
セッション変数
セッション変数とはHTTPリクエストをまたがって値を保持することができる変数です。
通常ウェブアプリケーションは、ブラウザからのリクエストを受けてプログラムが動作するというルーチンを何度も繰り返します。この時、1回目のリクエストと2回目のリクエストは何の関連もなく、1回目のリクエスト時の変数の値は2回目のリクエスト時には消えています。 これでは困る場合が多いので、なんらかの方法でリクエストをまたいで状態を保存する手段が必要になります。 この1つの解決策がセッション変数です。
使い方
入力フォームを使う の項で作成したフォーム入力プログラムを、以下のように改造してみましょう。
[1.start]
↓
[2.入力フォーム表示/入力]
↓
[3.確認画面表示/YES,NO入力]
↓
[4.最終確定画面表示]
3までは、前項で作ったところです。3から4へは、入力された結果を引き継がなければなりません。ここにセッション変数を使います。
3までのプログラムを再掲します。
- main.rb
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
- index.rhtml
<%= header_section %> <%= body_section %> <%= @form.get_messages_by_html() %> <%= @form.make_tiny_form() %> <%= footer_section %>
確認画面では、YES/NO入力のためのaタグを追加します。
- confirm.rhtml
<%= 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
最終確定画面用テンプレート
- commit.rhtml
<%= header_section %> <%= body_section %> text1: <%=h @text1 %> <br> integer1: <%=h @integer1 %> <br> <br> 以上の内容で確定しました。 <%= footer_section %>
これで必要な4つのファイル、main.rb, index.rhtml, confirm.rhtml, commit.rthml が揃いました。
実行すると以下のようになります。
↓
↓
コントローラローカルセッション変数は、個々のコントローラ内でのみ有効なセッション変数です。異なるコントローラからはアクセスできません。一つのアプリケーション内でグローバルにアクセスできるAlSessionによるセッション変数とは異なり、スコープがコントローラ内のみに限定されます。他のコントローラと名前がぶつかることを心配する必要がありません。