ActiveRecord を継承しないモデルで form_for を使うには
ActiveRecord を継承しないモデルに form からの入力値を代入したい場合、テンプレートに <%= form_for @model %> を使うとエラーになってしまいます。これは、Ruby on Rails ではO/Rマッパーの ActiveRecordとテンプレートのActionView等は別のモジュールになっていますが、かなり依存した関係にあるからです。
このような場合、以下のメソッドをモデルに追加すると ActiveRecord同様に form_for が使えるようになります。
to_param
Scaffold で作ったコードを見ると redirect_to(@model) のようなコードがありますがこれは redirect_to(@model.to_param) と同等です。 to_paramメソッドはそのモデルのインスタンスを識別する id 、例えばプライマリーキーの値を文字列に変換したものを戻します。
errors
バリデーションの結果を戻すメソッドです、ちゃんと実装するには ActiveRecord::Errors のかなりの部分を実装しないといけませんが、バリデーション無しなら下のような定義でだいじょぶです。
def errors ret = [] def ret.count 0 end ret end
なお、 Ruby 1.8.7 で動いている場合は特異メソッド ret.count の定義は不要です。
new_record?
モデルのインスタンスがまだRDB等に格納されてないものであれば true、RDB等から読み出したものであれば false を戻すコードを書きます。 Scaffoldが作り出す new.html.erb と edit.html.erb がほぼ同じコードでありながら違う動作をするのに 、このメソッドが使われています。
現在開発中の Ruby on Rails 3 では ActiveRecordやActionViewなどの関係がより疎になるので、こんな事をしなくても良くなるようです・・・・