今はまってるのが、アクションがいつ実行されるのかというところ。
例えば、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を追加せよとのこと。