require 'al_template'
class HelloController < AlController
def action_index()
@my_message = "Hello world."
AlTemplate.run("index.rhtml")
end
def action_foo()
@action = "foo"
AlTemplate.run("foobar.rhtml")
end
def action_bar()
@action = "bar"
AlTemplate.run("foobar.rhtml")
end
end
デフォルトの index.rhtml を以下の通り書き換えて、指定のアクションを呼び出すためのリンク(aタグ)を付け加えます。
<%= header_section %>
Test
<%= body_section %>
<%=h @my_message %>
">action_foo()を実行
">action_bar()を実行
<%= footer_section %>
追加したメソッド用のテンプレートファイルを新規作成します。
<%= header_section %>
<%= body_section %>
action_<%=h @action %> が呼ばれました。
デフォルトへ
<%= footer_section %>
実行すると、2つのリンクが表示されます。
http://localhost:10080/index.rb?ctrl=my_hello
{{prog_cgi:pj_index.png?nolink|}}
左のリンクをクリックすると action_foo が、右のリンクをクリックすると action_bar が実行されるページへジャンプします。そこでそれぞれのアクションが実行され、画面の表示が変わります。\\
ジャンプ先の画面で【デフォルトへ」のリンクをクリックすると、元の画面(action_index)にジャンプします。
{{prog_cgi:pj_foo.png?nolink&400|}}
{{prog_cgi:pj_bar.png?nolink&400|}}
この例では、index.rhtmlで、href へ make_uri(action:"foo") もしくは、make_uri(action:"bar") を使って、指定のアクションを呼び出すURLを生成して指定しています。
生成された aタグ全体
action_foo()を実行
action_bar()を実行
また、foobar.rhtmlでは、make_uri()メソッドをパラメータなしで呼び出して、デフォルトのアクションが呼び出されるURLを生成しています。
===== ボタンをクリックしてページジャンプ =====
aタグではなく、ボタンをクリックした時に、指定のアクションを呼び出す事をしてみます。
ボタンには、クリックした時の規定の動作は無いので、JavaScriptで定義する必要があります。
デフォルトテンプレートへ、ボタンを表示するタグを追加します。
'">
{{:prog_cgi:pj_button.png?nolink|}}
===== httpリダイレクトによるページジャンプ =====
httpには、
[[https://developer.mozilla.org/ja/docs/Web/HTTP/Redirections|リダイレクトの仕組み]]
があり、Aloneもそれをサポートしています。
リダイレクトを使って、action_foo を呼び出してみましょう。
コントローラへ、リダイレクト用のアクションを1つ追加します。
def action_redirect()
Alone.redirect_to( make_uri(action:"foo") )
end
デフォルトテンプレートへ、先のアクションを呼び出すためのリンクを追加します。
">リダイレクト経由でaction_foo()を実行
{{:prog_cgi:pj_redirect.png?nolink|}}
処理の流れは以下のようになっています。
- リダイレクトのためのリンクをクリックする
- ブラウザは、指定のURLをアクセスする。ここは、aタグを使ったページジャンプです。
- action_redirect()が実行される。
- Alone.redirect_to()でセットされたURLにリダイレクトするようブラウザに指示を返す。
- ブラウザは、指示されたURLを再度アクセスしなおす。ここは、httpリダイレクトによるページジャンプです。
- action_foo()が実行される。
==== 注意点 ====
httpリダイレクトは、httpヘッダを使って実現されています。
Aloneでは、メモリの節約のため htmlの出力をバッファリングしません。そのため、Alone.redirect_to()をコールする前に何らかのコンテンツを表示してしまうと、既にhttpヘッダが出力された後のため、この仕組みはうまく動作しません。
つまり以下のようなコードは動作しません。
def action_redirect()
puts "Debug print..."
Alone.redirect_to( make_uri(action:"foo") )
end