この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
初めまして、中西です。
今年社会人になったばかりの新人です。
今回は、自分が少し詰まった、image_submit_tagとsubmit_tagの挙動の違いについて紹介します。
環境
Rails 4.1.4
Ruby 2.1.2
form_tag等でくくった中で、submitボタンを複数配置し、押下するボタンによって処理を変えたい場合、
アクションを1つしか設定できないことから、:nameのオプションをつけて、アクション内でパラメータにより処理を分けるといったことができます。
このとき、submit_tagとimage_submit_tagで渡されるパラメータに違いが生じます。
例えば下記のようなsubmitボタンを書いたとします。
view
= submit_tag 'HOGE', :name => 'hoge'
= image_submit_tag 'image/huga.png', :name => 'huga'
それぞれのボタンを押下した時に、期待するパラメータはparams[:hoge]とparams[:huga]です。
しかし、実際のパラメータの中身は下記のようになります。
paramsの中
"hoge" => "HOGE"
"huga.x" => "12", "huga.y" => "10"
上記のように、image_submit_tagの場合、params[:huga]ではなく、
params[“huga.x”]とparams[“huga.y”]という2つのパラメータとなります。
どうも、ボタンの画像の左上を(x,y)=(0,0)として、横軸にx座標、縦軸にy座標となっており、
ピクセル単位でボタンの押下位置のx,y座標それぞれのパラメーターとして飛ぶようです。
まとめ
image_submit_tagで:nameのオプションを使う場合には、パラメータには十分注意しないといけないようです。
しかし、image_submit_tagも、1枚のボタン画像のなかで、押下位置により動作を変えたいといった場合には、使えるのかもしれません。