DBのデータを入出力するような画面を作るときは、
- Modelを作って(rails g model item hoge:string)
- Model内にValidationを書いて
- Controllerはわりと簡単に書いて
- erbでform_forを使ってフォームを作る
こんな感じだと思いますが、DBと直接対応しないフォーム(例えば検索フォームとか、ファイルに出力するためのフォームとか)はどうやって作ればいいのでしょうか?
普通にrails gでModelを作ってしまうと、rake db:migrateでDBにテーブルが作られてしまいます。そこで手動で作ってみましたが、実行時にテーブルがないというエラーになってしまいました(Mysql2::Error: Table 'db.items' doesn't exist: SHOW FULL FIELDS FROM `items`)。
Modelを使わず、Controllerに作ったインスタンス変数でerbに渡し、フォームから送られてきた値はparamsで受け取るようにしたら動きましたが、Validationをどこに書くかがわかりませんでした。
そういう画面を作るときのRailsらしい方法を教えてください。
enviroment.rbに下記の記述を追加して、
データベースを利用しないことにする方法もありますが…。
config.frameworks -= [ :active_record ]
ActiveRecordの代わりにActiveModelを利用する方法が良いでしょうね。
http://tsubo3.wordpress.com/2011/12/26/rails3-activerecord%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%83%A2%E3%83%87%E3%83%AB/
http://www.atmarkit.co.jp/fcoding/rails/articles/rails3/02/rails302a.html
enviroment.rbに下記の記述を追加して、
データベースを利用しないことにする方法もありますが…。
config.frameworks -= [ :active_record ]
ActiveRecordの代わりにActiveModelを利用する方法が良いでしょうね。
http://tsubo3.wordpress.com/2011/12/26/rails3-activerecord%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%83%A2%E3%83%87%E3%83%AB/
http://www.atmarkit.co.jp/fcoding/rails/articles/rails3/02/rails302a.html
素早い回答ありがとうございました。
ActiveModelの存在を知りませんでしたが、まさにそれが求めていた答えでした。
ググるキーワードがわかってしまえばこっちのものです。
試しに実装してみたところ、期待通りの動作をしています。
ActiveModel として実装します。
http://d.hatena.ne.jp/fujisan3776/20110701/1309478262
基底クラスを作って、attr_accessor と validates_* をその上で実装するのがCOOL & DRY。
そのようなフォームがいくつもあるなら、それ用の基底クラスを作っておくのが良さそうです。
どうもありがとうございます。
ひとつひとつ順番に実装していったところ、確かにそのURLの記事でやってるようなベースクラスが必要になりました。ものすごく参考になりました。
素早い回答ありがとうございました。
2012/10/24 15:32:56ActiveModelの存在を知りませんでしたが、まさにそれが求めていた答えでした。
ググるキーワードがわかってしまえばこっちのものです。
試しに実装してみたところ、期待通りの動作をしています。