rails:207
From: ABE Masahiro <abe@c...>
Date: Thu, 16 Jun 2005 16:51:07 +0900
Subject: [rails:207] 複数のsubmitボタン
あべと申します。
アイテム管理系のWebアプリなどで、テーブルを囲んだひとつのform内に
複数のsubmitボタンを配置し、押したボタンで動作を変えたくなるときが
よくあります。
<%= form_tag %>
<!-- アイテムをリスト表示 -->
<table>
<% @list.each do |item| %>
<tr>
<td><%= check_box_tag("sel[], item.id) %></td><!-- チェック欄 -->
<td><%= item.name %></td>
<td><%= item.price %></td>
<td><%= link_to("編集", :action => "edit", :id => item.id) %>
</tr>
<% end %>
</table>
<!-- チェックしたものをまとめて... -->
<%= submit_tag("delete", { name => "action" }) %>
<%= submit_tag("update", { name => "action" }) %>
<%= end_form_tag %>
これでcontroller に delete や update を定義し、@params[:sel] に
集まったアイテムを処理すればよいわけですが、ボタンの名前を
deleteやupdateから変えるのが困難です(とくに日本語に)。
これは古い問題で、submitタグだけがvalueの値を表示と送信で
兼用していることから発生していると思います。Googleをひくと
- それぞれのボタンで name="b1", "b2" などとして
@params.key?("b1") のような存在チェックで分岐しろ
- ローカライズのテーブルをvalueで逆引きしろ(えー)
- javascriptで...
などがひっかかりますが、どれもすっきりしません。
ここはRails的にはどうしたらいいでしょうか?
localizationまわりで既に解決されているのかしら。
*
かつて個人的に作ったcgiライブラリでは、query_stringの解釈を
拡張して
name="foo=bar" value="..."
のようにすると@params[:foo] = "bar" となるようにし、
<input type="submit" name="action=update" values="更新">
<input type="submit" name="action=delete" values="削除">
のようにしていました(実際にはperlで書いてました)。
これがWebプログラミングのマナーとしてどうなのかよくわからない
のですが、Railsではnameを"sel[]"のようにすると配列として扱う
という拡張が既になされていますね。
actionpack/lib/action_controller/cgi_ext/cgi_methods.rb
の CGIMethods::parse_query_parameters() にコードがあります。
Railsではこうする、というのがまだないのなら
ここにfoo=bar拡張を追加しちゃおうかしらん...
--
ABE Masahiro <abe@c...>
--
ML: rails@r...
使い方: http://QuickML.com/
-> 207 2005-06-16 09:51 [abe@c... ] 複数のsubmitボタン 208 2005-06-16 13:39 ┗[yu1@t... ] 209 2005-06-16 22:31 ┗[abe@c... ]