Railsで独自のフォームビルダーを作ろう!

こんにちは、鈴木です。

 

Rails で独自のフォームビルダーを作ると便利なことがあります。

 

フォームビルダーとは

Rails でフォームを作成するときに form_for メソッドを使用しますが、form_for に渡すブロックの引数に渡されるオブジェクトがフォームビルダーです。

言葉では分かりづらいですが、以下のコードにおける「form」がそれです。

フォームビルダーの実体は ActionView::Helpers::FormBuilder クラスであり、ブロック引数に渡されるのは ActionView::Helpers::FormBuilder のインスタンスです。

普段「<%= form.text_field(:name) %>」のように便利に使っているメソッドは ActionView::Helpers::FormBuilder で定義されています。

 

error_message_on を書くのが面倒

ときどきですが、以下のように「form.text_field(...)」のように入力項目を作り、すぐ後に「form.error_message_on(...)」でエラーメッセージを表示する、というコードを何度も書くことがあります。

数が少ない場合は良いですが、入力項目の多いフォームだと「form.error_message_on(...)」を書くことが面倒になってきます。

そのようなときは、独自のフォームビルダーを作成し、自動的に「form.error_message_on(...)」を挿入するようにすると楽ができます。

※補足: Rails3 からは error_message_on や error_message_for は dynamic_form という Gem に外出しされましたので、使用する場合は Gemfile に dynamic_form を追加する必要があります。

 

独自のフォームビルダーを作る

独自のフォームビルダーを作るには、ActionView::Helpers::FormBuilder を継承したクラスを作成します。

とりあえず text_field に自動的に error_message_on を追加するようにコードを書いてみます。

「super」でデフォルトの処理を呼び出し、その結果に「error_message_on(attribute)」の結果を加えています。

作成した CustomFormBuilder を使用するには、以下のように form_for のオプション :builder で指定します。

text_field の後には自動的に error_message_on が挿入されるので、コードから error_message_on は消えています。

 

まとめ

今回は text_field メソッドをオーバーライドしましたが、実用的なライブラリに仕上げるには text_area や collection_select など他のメソッドもオーバーライドする必要があります。

また、オーバーライドではなく新しいメソッドを定義する、というように実現の仕方は一通りではありません。

プロジェクトごとにベストなやり方を考えてみましょう!

 

Comments are closed, but you can leave a trackback: Trackback URL.

Comments

  • oldergod  On 2013年1月7日 at 22:44

    ナイスです。使ってみます!