Catalyst::Controller::Resources でオーバーロード POST を使いたい
と id:ikasam_a にわがまま言ったら Catalyst::Request::REST::ForBrowsers ってのを教えて貰ったよ。
オーバーロード POST って何だよって方は、
- 統一インターフェイスと PUT and DELETE tunneled POST パターン - masaki@catalyst - Catalystグループ
- ROA と Catalyst - masaki@catalyst - Catalystグループ
とか読むと幸せになれると思います。
使い方
MyApp にて、こんな感じにしときます。
package MyApp; use strict; use warnings; use Catalyst::Runtime '5.70'; use Catalyst::Request::REST::ForBrowsers; ### 中略 __PACKAGE__->request_class('Catalyst::Request::REST::ForBrowsers');
みたいな感じ。そうすると Catalyst::Request の代わりに Catalyst::Request::REST::ForBrowsers が使われるようになります。
んでもって、html 中で、
<form action="[% c.uri_for('/path/to') | html %]" method="post"> <input type="hidden" name="x-tunneled-method" value="delete" /> <input type="submit" name="submit" value="delete" /> </form>
みたいにやっとくと、Catalyst::Controller::Resources の destroy にうまく dispatch してくれます。
蛇足 - looks_like_browser
C::R::REST::ForBrowsers だけど、looks_like_browser メソッドも同時に提供してくれてて、これはブラウザの画面上から普通にリクエストした物なのか、XHR 経由 *1 なのかを判定してくれるみたいです。