verifyは一体、何をやっているのか?
やっとコードの流れを全部読み終えたと思ったが、まだ残っていた...。ずっと気になっていたのだけど、verifyは一体何をしているのだろう。(verify:立証する、確かめる)
- コントローラsoftwares_controller.rb
verify :method => :post, :only => [ :destroy, :create, :update ], :redirect_to => { :action => :list }
GETとPOST
ここでのverifyの役割を知るためには、まずGETとPOSTについての知識が必要だった。webブラウザは、アドレスが入力されたり、リンクやボタンがクリックされると、接続先のサーバにURLやデータ*1を送信するらしい。この時の送信方法に2通りある。それがGETとPOST。詳細についてはフォームデータの送信という素晴らしいページがあるので参考にさせて頂いた。感謝!
以下は相当端折って考えた自分の理解
GET | URLの一部として送信される。つまりアドレス欄に表示される。 |
POST | URLを送信し、その後にデータ部分を送信する。アドレス欄にはURLだけの表示である。 |
verify
この構文を順番に見て行くと、こんな感じになる。
verify :method => :post
メソッドがPOSTであることを確かめる。
:only => [ :destroy, :create, :update ]
destroy、create、updateメソッドに限っては。
:redirect_to => { :action => :list }
POSTでなければlistへ、リダイレクトする。
つまり、適当にアドレス欄に削除や新規作成、更新のアドレスを予想して入力、実行しても、それらの処理は何もしないで一覧表示(list)ページに戻るようにしている。正常に処理されるのは、正しいボタンやリンクを押した時だけになる。
ちょっとした実験、もしもverifyがなかったら...
verifyの行が機能していると、アドレス欄を使って削除しようとしても、一覧表示ページに戻るだけだった。
http://0.0.0.0:3000/softwares/destroy/6
softwares_controller.rbのverifyのコードの頭に「#」を付けて、コメント行にしてしまうと...
# verify :method => :post, :only => [ :destroy, :create, :update ], :redirect_to => { :action => :list }
削除警告もされず、いきなり削除されて、一覧表示ページが表示される。(何が起こったのか分かりにくい、本番運用でこんなことが出来るとちょっと怖い気がする...。)
きっと、verifyで制限をしておくことで、想定外のデータ処理を不要にしたり、不正利用を防ぐ目的があるのかもしれない。
:post => trueの役割
list.rhtmlの中に以下の行がある。
<td><%= link_to 'Destroy', { :action => 'destroy', :id => software }, :confirm => 'Are you sure?', :post => true %></td>
試しに、:post => trueを削除して、
<td><%= link_to 'Destroy', { :action => 'destroy', :id => software }, :confirm => 'Are you sure?' %></td>
このようにしてしまうと...
Destroyリンクをクリックして、削除確認でOKを押しても、データは削除されなくなる。
つまり、verifyと、link_toの:post => trueは、セットで使う必要があるのだろうなー。
ちなみに、createとupdateについてはボタンを押して実行するので、デフォルトはPOSTで送信していると予想。:post => trueのような設定なしで処理できている。
*1:もちろんRuby on Railsで開発したwebアプリケーションもこのURLやデータを受け取る