目次

ページジャンプ

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:10080/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&amp;action=foo">action_foo()を実行</a>
<a href="/index.rb?ctrl=my_hello&amp;action=bar">action_bar()を実行</a>

また、foobar.rhtmlでは、make_uri()メソッドをパラメータなしで呼び出して、デフォルトのアクションが呼び出されるURLを生成しています。

ボタンをクリックしてページジャンプ

aタグではなく、ボタンをクリックした時に、指定のアクションを呼び出す事をしてみます。

ボタンには、クリックした時の規定の動作は無いので、JavaScriptで定義する必要があります。

デフォルトテンプレートへ、ボタンを表示するタグを追加します。

<input type="button" value="クリック!" onclick="location.href='<%=h make_uri(:action=>"foo") %>'">

httpリダイレクトによるページジャンプ

httpには、 リダイレクトの仕組み があり、Aloneもそれをサポートしています。

リダイレクトを使って、action_foo を呼び出してみましょう。

コントローラへ、リダイレクト用のアクションを1つ追加します。

  def action_redirect()
    Alone.redirect_to( make_uri(action:"foo") )
  end

デフォルトテンプレートへ、先のアクションを呼び出すためのリンクを追加します。

<a href="<%=h make_uri(action:"redirect") %>">リダイレクト経由でaction_foo()を実行</a>

処理の流れは以下のようになっています。

  1. リダイレクトのためのリンクをクリックする
  2. ブラウザは、指定のURLをアクセスする。ここは、aタグを使ったページジャンプです。
  3. action_redirect()が実行される。
  4. Alone.redirect_to()でセットされたURLにリダイレクトするようブラウザに指示を返す。
  5. ブラウザは、指示されたURLを再度アクセスしなおす。ここは、httpリダイレクトによるページジャンプです。
  6. action_foo()が実行される。

注意点

httpリダイレクトは、httpヘッダを使って実現されています。

Aloneでは、メモリの節約のため htmlの出力をバッファリングしません。そのため、Alone.redirect_to()をコールする前に何らかのコンテンツを表示してしまうと、既にhttpヘッダが出力された後のため、この仕組みはうまく動作しません。

つまり以下のようなコードは動作しません。

  def action_redirect()
    puts "Debug print..."
    Alone.redirect_to( make_uri(action:"foo") )
  end