ActiveRecord を継承しないモデルで form_for を使うには

http://rubyonrails.org/images/rails.png
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 では ActiveRecordActionViewなどの関係がより疎になるので、こんな事をしなくても良くなるようです・・・・