ページジャンプ
hello, world アプリでは、画面に表示されるだけで何も操作ができませんでしたが、次の例では、マウスクリックでページの更新を行います。
aタグを使ったページジャンプ
htmlのリンク(aタグ)を使って、指定のアクションを呼び出す事をしてみましょう。
先のhello, worldアプリを改造します。
まず、アクションを2つ追加します。
- main.rb
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タグ)を付け加えます。
- index.rhtml
<%= header_section %> <title>Test</title> <%= body_section %> <p><%=h @my_message %></p> <a href="<%=h make_uri(action:"foo") %>">action_foo()を実行</a> <a href="<%=h make_uri(action:"bar") %>">action_bar()を実行</a> <%= footer_section %>
追加したメソッド用のテンプレートファイルを新規作成します。
- foobar.rhtml
<%= header_section %> <%= body_section %> action_<%=h @action %> が呼ばれました。<br> <a href="<%=h make_uri() %>">デフォルトへ</a> <%= footer_section %>
実行すると、2つのリンクが表示されます。
http://localhost:3000/index.rb?ctrl=my_hello
左のリンクをクリックすると action_foo が、右のリンクをクリックすると action_bar が実行されるページへジャンプします。そこでそれぞれのアクションが実行され、画面の表示が変わります。
ジャンプ先の画面で【デフォルトへ」のリンクをクリックすると、元の画面(action_index)にジャンプします。
この例では、index.rhtmlで、href へ make_uri(action:"foo") もしくは、make_uri(action:"bar") を使って、指定のアクションを呼び出すURLを生成して指定しています。
生成された aタグ全体
<a href="/index.rb?ctrl=my_hello&action=foo">action_foo()を実行</a> <a href="/index.rb?ctrl=my_hello&action=bar">action_bar()を実行</a>
また、foobar.rhtmlでは、make_uri()メソッドをパラメータなしで呼び出して、デフォルトのアクションが呼び出されるURLを生成しています。
ボタンをクリックしてページジャンプ
次に、ボタンをクリックした時に、指定のアクションを呼び出す事をしてみます。
ボタンには、クリックした時の規定の動作は無いので、JavaScriptで定義する必要があります。
デフォルトテンプレートへ、ボタンを表示するタグを追加します。
- index.rhtml
<%= header_section %> <title>Test</title> <%= body_section %> <p><%=h @my_message %></p> <!-- ↓追加 --> <input type="button" value="クリック!" onclick="location.href='<%=h make_uri(:action=>"foo") %>'"> <%= footer_section %>
「クリック!」ボタンをクリックすると、action_foo が呼ばれましたと表示される画面に遷移します。
これは、inputタグの onclickアトリビュートが、onclick="location.href='/index.rb?ctrl=my_hello&action=foo'" と展開されているからです。
httpリダイレクトによるページジャンプ
httpには、 リダイレクトの仕組み があり、Aloneもそれをサポートしています。
リダイレクトを使って、action_foo を呼び出してみましょう。
コントローラへ、リダイレクト用のアクションを1つ追加します。
- main.rb
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 # 追加 def action_redirect() Alone.redirect_to( make_uri(action:"foo") ) end end
デフォルトテンプレートへ、先のアクションを呼び出すためのリンクを追加します。
- index.rhtml
<%= header_section %> <title>Test</title> <%= body_section %> <p><%=h @my_message %></p> <!-- ↓追加 --> <a href="<%=h make_uri(action:"redirect") %>">リダイレクト経由でaction_foo()を実行</a> <%= footer_section %>
処理の流れは以下のようになっています。
- リダイレクトのためのリンクをクリックする
- ブラウザは、指定の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
