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"}