paramsの研究
普段何気なく使っているparamsメソッドではあるが、実はちゃんとした使い方をよく知らない...。複数項目の一括削除で、削除対象を区別するパラメーターをどうやって受け取るべきか悩んでしまった。以下は自分で実験してみたメモ。
-
-
- 他にも、もっと便利な機能があるかもしれない...。
-
パラメーター名の中の[]の取り扱い
idが3と4の項目をチェックしたとして、以下のようにしてパラメーターの内容を確認してみた。
# コントローラー render :text => @params.inspect
<%# ビューの指定とパラメーターの内容 %> <%= check_box_tag "checked_items", listd.id %> {"commit" =>"チェックした項目を削除する", "action" =>"plural_destroy", "controller" =>"softwares", "checked_items"=>"3"} <%= check_box_tag "checked_items[]", listd.id %> {"commit" =>"チェックした項目を削除する", "action" =>"plural_destroy", "controller" =>"softwares", "checked_items"=>["3", "4"]} <%= check_box_tag "checked_items[#{listd.id}]", listd.id %> {"commit" =>"チェックした項目を削除する", "action" =>"plural_destroy", "controller" =>"softwares", "checked_items"=>{"3"=>"3", "4"=>"4"}} <%= check_box_tag "checked_items[#{listd.id}]" %> {"commit" =>"チェックした項目を削除する", "action" =>"plural_destroy", "controller" =>"softwares", "checked_items"=>{"3"=>"1", "4"=>"1"}}
一括削除のパラメーターの受け渡しとしては、4番目の指定方法がベストかもしれない。
試しに、こんな指定もやってみた。
<%= check_box_tag "checked_items[#{listd.id}][#{listd.id}]" %> {"commit" =>"チェックした項目を削除する", "action" =>"plural_destroy", "controller" =>"softwares", "checked_items"=>{"3"=>{"3"=>"1"}, "4"=>{"4"=>"1"}}} <%= check_box_tag "checked_items[#{listd.id}][]" %> {"commit" =>"チェックした項目を削除する", "action" =>"plural_destroy", "controller" =>"softwares", "checked_items"=>{"3"=>["1"], "4"=>["1"]}}
以上の結果から、経験則だけど、おそらく以下のように取り扱ってくれるようだ。
パラメーター名[文字列] | 角括弧の中に文字列が入ると、ハッシュのキーと値が追加される。 |
パラメーター名[] | 角括弧だけだと、配列として値だけが追加される。 |
-
- []を追加すると、ハッシュや配列が入れ子になる。(ハッシュの値が、またハッシュのような状態)
GETとPOSTで同じキーを送信してみる。
ついでに、GETとPOSTで同じキーをパラメータとして同時に送信したらどうなるのかやってみた。結果は以下の通り。GETメソッドで送信したパラメーターが優先されるようだ。
<%= start_form_tag :action => 'plural_destroy', :checked_items => 'GET' %> <%= check_box_tag "checked_items[#{listd.id}]" %> <%= submit_tag "チェックした項目を削除する" %> <%= end_form_tag %> {"commit" =>"チェックした項目を削除する", "action" =>"plural_destroy", "controller" =>"softwares", "checked_items"=>"GET"}