簡単な検索フォーム

簡単な検索フォームを作ってみたので、メモしておきます。
作成したviewのフォームの記述を以下のようのform_forヘルパーを使用して作ってみました。

<table id="search">
  <% form_for (:conditions, @conditions, 
    :url=>{:controller => '/customer/search', :action => 'result'},
    :html => {:method => :get, :id => 'select' } ) do |f| %>
  <tr>
  <td>
    <%= f.select  :limit, @limits.collect {|m| [m.name, m.value] }  %>
    <%= f.text_field  :keyword  %>
    <%= f.submit  :submit, :value=>'検索' %>
  </td>
  </tr>
  <% end %>
</table>

form_for

    1. form_forは<%= form_for ... %>ではなく% form_for ... %>と記述します。これはブロック引数が含まれるからだとおもいます。
    2. form_forの1つめの引数は、Formタグの属性名です。コントローラ側でこの属性名を引数に指定してparamsメソッドを呼び出すころで、送信パラメータを取得することができます。++2つめのパラメータは、このフォームを表示するときの値を指定するための変数です。
    3. 3つ目以降は、オプションパラメータです。:urlで送信先のurl,:htmlでhtmlのフォームタグの指定ができます。

form_forのブロック内のタグ生成

    1. form_forのブロック内のでブロック引数をレシーバーにしたヘルパーメソッドで各フォームタグを生成します。
    2. 各ヘルパーメソッドは通常「 method_name( method, options = {})」のシンタックスとなります(selectなどはのぞく)

method引数には参照するめの属性名を指定。optionsにはhtmlタグの属性を指定します。

selectヘルパー

    1. selectヘルパーは「select( method, choices, options = {})」というシンタックスとなります。choicesには、選択肢となる項目のArrayを指定します。その要素も配列で、0個目に表示する名称、1個目に送信される値を指定します。

送信された値の取得

コントローラ側では、paramsメソッドで送信された値を取得できます。params['form_forのパラメータ名']という形で各フォームパラメータの値を含むHashを取得できます。Hashには各タグ生成ヘルパーで指定した属性名をキーとして値が格納されています。
今回の例では、以下のようにしてtext_filed、selectタグで入力/選択された値を取得できます。

params[:conditions][:keyword]
params[:conditions][:limit]

表示時のフォーム値設定

form_forの2つめのパラメータとして指定した変数が表示対象として参照されます。この変数に各フォーム要素の属性名に対応した属性メソッドを定義しておけば、そのメソッドで取得される値がフォームの表示されます。
今回の例では、以下のように定義したモデルクラスのインスタンスをこのフォームの表示元のコントローラーで@conditionsに設定しておけばフォームの値の初期化が行えます。

class SearchConditions
  attr_accessor :keyword, :limit
end