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やデータを受け取る