その1の続きです。
その1で、ジェネレータを作ってコントローラを作って動くことを確認した。
今回は、これが実際にどう動いているのかを勉強していこうと思う。
Ruby on Railsのデフォルトの動作は以下のような感じになってる。
- URLからコントローラ・アクションを特定する。
JRuby on RailsでGlassFish v3上で動かした場合は下のようなURLになる。
http://domain/context名/コントローラ名/アクション名
たとえば、http://domain/context名/sample/fooだと、SampleControllerのfooが呼び出される。 - 1で決めたコントローラの処理が呼び出されたら、デフォルトでapp/view/コントローラ名/アクション名.html.erbというファイルを使ってレンダリングが行われる。
非常にシンプルなルールになっていてわかりやすい。
本当に、そう動いているのかを確認するために、SampleControllerに1つメソッドを追加してみようと思う。
追加するメソッド名は何でもいいので、今回はhogeを追加してみた。
hogeの中の処理が実行されたことを確認するためのputs "sample/hoge"を書いている。
ログにこのメッセージが出れば処理されているという目印になる。
class SampleController < ApplicationController
def foo
end
# http://localhost:8080/controller_edu/sample/hoge でアクセスできる
def hoge
puts "sample/hoge"
end
end
さっきの処理の流れだと、app/view/sample/hoge.html.erbを用意しないといけないが、とりあえずこれで動かしてみてどうなるか確認してみようと思う。
因みに、下の画面はhogeメソッドを追加するまえにhttp://localhost:8080/controller_edu/sample/hogeにアクセスした場合の画面になる。
要約すると、hogeなんてアクション無いよ!というエラーが出ている。
hogeメソッドを追加すると、下のような画面になる。同じくエラー画面が表示されるが、メッセージが変わっている。
hoge.html.erbが無いといわれている。
NetBeans 6.5の出力ウィンドウには、「情報: sample/hoge」と出力されていたのでhogeメソッドまでは実行されているのがわかる。
今度は、これにviewを用意して動きを確認する。
viewを入れるフォルダは、app/view/sampleの下になる。論理プロジェクトビューだと、ビュー/sampleの下に作ればいい。
右クリックの新規作成から、hoge.html.erbを作成した以下のような内容を書いた。
これは、hogeです。<br/>
<%= Time.now %>
ブラウザでF5を押し再読み込みをしてみよう。ちゃんと出来ていれば、「これは、hogeです。」と表示されるはずだ。
これで、ものすごく簡単なWebアプリケーションなら作れてしまいそうな気になる。
だけど、1アクションごとに1画面を作らないといけないのか?という疑問が出てくる。
Railsでは、デフォルトだとアクション名と等しいviewのファイルを使ってレンダリングを行うが、renderここの動きを変えることが出来る。
renderは、下のような形で使うことが出来る。
class SampleController < ApplicationController
def foo
end
# http://localhost:8080/controller_edu/sample/hoge でアクセスできる
def hoge
puts "sample/hoge"
# fooアクションのviewでレンダリングをして!
render :action => :foo
end
end
これで、sample/hogeにアクセスすると、foo.html.erbの結果がレンダリングされて、以下のような実行結果になる。
ここで気をつけて欲しいのは、render :action => :fooとしてもfooメソッドの中は実行されないということだ。
あくまでviewファイルをfoo.html.erbにするというだけなので要注意。
さらに、render以外にもredirect_toというメソッドもある。
これは、renderがviewだけを指定するのに対して、controllerとactionを指定できて、なおかつactionの処理も実行してくれるというすばらしい代物。controllerを省略すると、現在のコントローラと同じものを使う。
メソッドの名前通りこの機能はHTTPのリダイレクトを使っている。
ということで早速実験。render :action => :fooの部分をredirect_to :action => :fooに変えて動きを見てみる。
ついでに、fooメソッドが実行されたかわかるように、標準出力への出力処理を追加した。
class SampleController < ApplicationController
def foo
# fooを取ったことを示すただのログ
puts "sample/foo"
end
# http://localhost:8080/controller_edu/sample/hoge でアクセスできる
def hoge
puts "sample/hoge"
# fooアクションのviewでレンダリングをして!
# render(:action => :foo)
redirect_to :action => :foo
end
end
この状態で、http://localhost:8080/controller_edu/sample/hogeにアクセスすると結果として、fooのテンプレートがレンダリングされ、標準出力には「sample/hoge」と「sample/foo」の両方が出力される。
ブラウザのURLもsample/hogeからsample/fooにリダイレクトされていることがわかる。