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] %>
integer1: <%=h @form[:integer1] %>
よろしいですか?
いいえ
はい
<%= 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 %>
integer1: <%=h @integer1 %>
以上の内容で確定しました。
<%= footer_section %>
これで必要な4つのファイル、main.rb, index.rhtml, confirm.rhtml, commit.rthml が揃いました。
実行すると以下のようになります。
{{:prog_cgi:sess_index.png?nolink|}}\\
↓\\
{{:prog_cgi:sess_confirm.png?nolink|}}\\
↓\\
{{:prog_cgi:sess_commit.png?nolink|}}\\
確認画面で「いいえ」を選択すると、最初の入力フォームに戻ります。その際、コントローラの action_cancel では、セッション変数から@formへ値を戻しているので、表示されるフォームには入力した値が最初から入っている状態になります。
ここで説明したセッション変数は、コントローラローカルセッション変数といい、個々のコントローラ内でのみ有効なセッション変数です。つまり異なるコントローラからはアクセスできませんので、他のコントローラと名前がぶつかることを心配する必要がありません。
コントローラをまたいで値を受け渡すことができるグローバルセッション変数もあります。
詳しくは、[[alcgi:セッションマネージャ|AlSession セッションマネージャ]] の項を参照してください。
====== リクエストをまたぐ一時的なメッセージ ======
httpリクエストをまたぐ一時的なメッセージは意外とよく使うので、たとえばRailsではflashという専用の機能が実装されています。
Aloneでは、そのような難しい機能は実装せず、もっと簡単に考えています。
===== 方法 =====
あるアクションにおいて処理後にリダイレクトし、リダイレクト先のページで処理の結果を表示する例です。
def action_one()
session[:flash_msg1] = "リダイレクト先で表示"
Alone::redirect_to( make_uri( :action=>"two" ) )
end
def action_two()
AlTemplate.run( "two.rhtml" )
end
テンプレートでflash_msg1を表示し、同時に消去します。
<%=h session.delete(:flash_msg1) %>