[前][次][番号順一覧][スレッド一覧]

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...            ]