Railsのアクションの実行タイミング

今はまってるのが、アクションがいつ実行されるのかというところ。
例えば、Userモデルがあるとして(User < ActiveRecord
コントローラ TestController.rb

class TestController < ApplicationController
    def hoge
        @users = User.find(:all)
    end
end

で、ビュー views/test/hoge.html.erb

<% for user in @users%>
<%=h user.name %>
<% end %>

で、

NoMethodError in Test#hoge

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

が返ってくる。

つまり、test/hoge.htmlにアクセスしたときに
アクションが実行されてないという問題。
試しにコントローラをイニシャライズしてみたら動く。
(てことはviewを開いた瞬間にはコントローラはnewされてるのか)

class TestController < ApplicationController
    def initialize
        @users = User.find(:all)
    end

    def hoge
        @users = User.find(:all) #この場合なくてもいい
    end
end

うまく動いてるアクションもあるから、
一応イニシャライザをつけといて、うまく動いてるやつは
その都度オーバーライドさせるとか?
なんか不具合のもとになりそうな対症療法だ。。。

このへんはRailsが使ってるRubyメタプログラミング機能や
そもそものRailsの仕様を知らないとわからないのかな。
あるいはルーティングだけで解決できるのか。

(追記)ビューに直接書くという方法があった。
つまり、

<%= @users = User.find(:all)%>
<% for user in @users%>
<%=h user.name %>
<% end %>

ビジネスロジックをビューに書くなという観点からすると
あまり良くはなさそう。
コントローラのinitializeに頼るにしろ、ビューに直打ちするにせよ
どっちもモラルハザードを招きそうな気がしてきた。

(追記その2)解決
http://d.hatena.ne.jp/greenrine23/20091027/1256654504
config/route.rbにmap.resourcesを追加せよとのこと。