私の知る限り、このフォーム作成部品は2種類存在する。
1.モデルと連携してフォーム部品を作成する関数。
2.モデルとは無関係にフォーム部品を作成する関数である。
モデルと連携させてフォームを記述する方法はとても記述が簡単である。そもそも、railsはMVCやファイル名、DBの関係が密接である。
どういうことかというとMVCのクラス名やファイル名、DBテーブル名などは決められたものでなければならないという決まりがある。
仮にUserというモデルを作成するとする。
ruby script\generate scaffold user name:string plan_date:date status:integer comment:text
するとrailsの命名規則により以下のようなファイル名とテーブル名、クラス名が作成される。
ファイル名 | |
---|---|
コントローラクラス名 | UsersController |
コントローラファイル名 | users_controller.rb |
テンプレートのフォルダ名 | app/view/users |
ヘルパーモジュール名 | UsersHelper |
ヘルパーファイル名 | users_helper.rb |
レイアウトテンプレートファイル名 | Users.html.erb |
機能テストファイル名 | users_controller_test.rb |
データベーステーブル名 | users |
モデルクラス名 | User |
モデルクラスファイル名 | users.rb |
単体テストファイル名 | user_test.rb |
このように、コントローラ名をusersとしただけでそれ以外のファイル名やクラス名、テーブル名まで決まってしまう。
一見これは応用性が無く融通の利かないように感じるかもしれないが、こうすることによって多言語ではアクションとモデルとビューおよびテーブルとの結びつきなどを一つ一つ設定していた作業を行うことなく一貫した手法でシステム構築が可能となる。
この考え方がこそが、「設定より規約」railsの基本理念の根幹だ。
私はこの考え方に痛く感動している。rubyが好きな一番大きな理由だ。
さて、話題が大分フォーム作成関数の話からそれてしまった・・・。
これからフォーム作成用関数の説明をしてゆく。
1)モデルと連携してフォームを作成する。
<% form_for(@footprint) do |f| %> <b>Article</b> <%= f.text_field :article_id %> <b>User</b> <%= f.text_field :user_id %> <%= f.submit "Update" %> <% end %>
form_for(@footprint) do |f|
の部分でモデル(@footprint)からフォーム作成用インスタンス(
これをフォームビルダーオブジェクトという)を取得し end までの間でフォーム部品を出力している。
フォーム出力関数には以下のような種類がある。
text_field | <input type="text"> |
password_field | < input type="password"> |
hidden_field | < input type="hidden"> |
text_area | < textarea> |
check_box | < input type="checkbox"> |
radio_button | < input type="radio"> |
select | < select> option配列を忘れないように |
date_select | コンボボックス3つ(年、月、日) |
file_field | < input type="file"> |
以上のメソッドを利用することで簡単にフォームを作成することができるようになる。
f.text_field :name ↓ <input id="user_name" name="user[name]" type="text" value="しあさん" />このように、 f.text_field :name しかしていないにも拘らず自動的にモデル名も含めたname,id属性や初期値(value)を記述してくれる。
これを可能にしているのがrailsの基本設計の"設定より規定"の概念だ。
このように、モデルに関係するデータを扱う場合フォームビルダーオブジェクトを利用すると簡潔にコードを記述できる。
しかしながら、フォームの用途はモデルのデータを扱うためだけではない。そこでrailsではモデルからフォームを作成する関数以外に単純に(フォームとの連携なしに)フォームを作成するが可能なメソッドが定義されている。
モデルとは無関係にフォーム部品を作成する関数
これは次回記述します。
眠いので