2009年6月25日木曜日

5.モデルクラスと連動していないフォーム作成関数


モデルクラスと連動していないフォーム作成関数

railsではフォーム作成用関数は2種類存在する。
ひとつは前回紹介した フォームビルダーオブジェクトを利用したモデルと連動して
フォームを作成する関数。
そして、今回の説明するモデルクラスと連動していないフォーム作成関数である。
まず、簡単な例を見てもらおう。
Age
<%= text_field_tag("user[age]", @user.age) %>
administrator
<%= select_tag("user[user_category_id]",options_for_select(
{:マスター=>1,:管理者=>2,:一般ユーザー=>3},@user.user_category_id))%>
Other
<%= text_area_tag("user[other]", @user.other,{:style=>'width: 500px; height: 200px;'}) %>
画像
<%=file_field_tag("user[upload_image]") %>

このようにすることでview側では以下の様にフォームが作成される。





HTMLは以下のようになっている。
Age
<input id="user[age]" name="user[age]" type="text" value="29" />
administrator            
<select id="user[user_category_id]" name="user[user_category_id]">
<option value="1">マスター</option>
<option value="2">管理者</option>
<option selected="selected" value="3">一般ユーザー</option></select>
Other
<textarea id="user[other]" name="user[other]" style="height: 200px; width: 500px;">
一般ゆうざー</textarea>
画像            
<input id="user[upload_image]" name="user[upload_image]" type="file" />

そして、この値をコントローラで取得する方法は以下のとおり。
def update
    puts(japanese_time(Time.now));
    puts("ACTION_NAME=#{params[:action]}");
    @user = User.find(params[:id])
    @user.attributes=params[:user];
    @user.hashed_password=User.hashed_password(params[:user][:password],@user.salt);
    respond_to do |format|
      if @user.save()
        flash[:notice] = 'User was successfully updated.'
        format.html { redirect_to({:controller=>'admin/users',:action=>'show',:id=>@user.id}) }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
end
こんな感じでフォームビルダーオブジェクトを利用することなくフォームを記述することも可能である。
今回はモデル(Userモデル)の値についてフォームの作成を行っているが、この方法はモデルと関係ない値についても
同様にフォームを作成することができる。
つまり、モデルを利用したフォームビルダーオブジェクト(form_for @user do |f|)に比べて応用が利き、つぶしの利く方法といえる。
要は、railsではフォーム表示関数が2通り用意されているがこの方法を知っていれば全ての用途に対応できるということである。
そういった理由もあり私はこんなモデルを利用する場合でもこの関数を多用している。
しかし、これはrubyの基本設計に少々反した考えではある・・・
何はともあれ、これらフォーム作成用関数について簡単にまとめてみた。オプションなどについては暇があったらまた追加してゆく。
関数
作成コード
file_field_tag 
<input type="text" />
password_field_tag 
<input type="password" />
check_box_tag 
<input type="checkbox" />
field_set_tag do
<fieldset>
????
</fieldset>
file_field_tag 
<input type="file" />
hidden_field_tag 
<input type="hidden" />
image_submit_tag 
<input type="image" />
label_tag
<label for=""></label>
radio_button_tag
<input type="radio" />
select_tag
<select></select>
submit_tag
<input type="submit" />
text_area_tag
<textarea cols="20" rows="1"></textarea>

どうしようもないクズのアーチャー