Railsで、DBと直接対応しない入力フォームの作成方法について質問です。


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らしい方法を教えてください。

回答の条件
  • 1人50回まで
  • 登録:
  • 終了:2012/10/24 15:31:24
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:nacookan

すみません、書き忘れましたが、Railsは3.2を使っています。

ベストアンサー

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント170pt

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

id:nacookan

素早い回答ありがとうございました。
ActiveModelの存在を知りませんでしたが、まさにそれが求めていた答えでした。
ググるキーワードがわかってしまえばこっちのものです。
試しに実装してみたところ、期待通りの動作をしています。

2012/10/24 15:32:56

その他の回答1件)

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149ここでベストアンサー

ポイント170pt

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

id:nacookan

素早い回答ありがとうございました。
ActiveModelの存在を知りませんでしたが、まさにそれが求めていた答えでした。
ググるキーワードがわかってしまえばこっちのものです。
試しに実装してみたところ、期待通りの動作をしています。

2012/10/24 15:32:56
id:gizmo5 No.2

回答回数504ベストアンサー獲得回数141

ポイント130pt

ActiveModel として実装します。

http://d.hatena.ne.jp/fujisan3776/20110701/1309478262

基底クラスを作って、attr_accessor と validates_* をその上で実装するのがCOOL & DRY。

そのようなフォームがいくつもあるなら、それ用の基底クラスを作っておくのが良さそうです。

id:nacookan

どうもありがとうございます。
ひとつひとつ順番に実装していったところ、確かにそのURLの記事でやってるようなベースクラスが必要になりました。ものすごく参考になりました。

2012/10/24 15:33:54

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません